剑指offer 面试题(二维数组中的查找) (2)

面试题: 二维数组中的查找

/*

题目:   在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成

一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该数。

*/

ps:(其实前段时间我就做过这道题,今天看到了,觉得还是有点生,那就再来一次吧)

题目分析:  在分析这个问题的时候,我们首先要看,在一个二维数组中查找一个数字是否存在,那么很多人就觉得

简单了,遍历二维数组与所需要查找的数字进行比较不就完了!  不可否认的是你说的是可行的,可是问题在于,

面试官会觉得孩子你是不是心太急啊!  我费尽周折给二维数组加上这几个规律,居然完全被你给忽视了!所以

嘛,对题目的分析很重要,从左到右递增,从上到下递增, 其中必有玄妙啊!我们大概举出这么一个例子:

/*(符合题目规律的二维数组)

1 2 3 4

2 3 4 5

3 4 5 6

*/

发现规律了吧!  是不是二维数组的左 / 右上角,左 / 右下角都比较特殊了,但是细心的你会发现,只有右上角和左下

角的数字才更具有特殊性,方便我们查找,我们以右上角为例,4左边的数字都比他小,而下边的数字都比他大,依次

进行分析,构造出算法!

算法选择:  在题目分析中我们都其实已经找到了规律,那么遍历二维数组O(N)的算法我们就不采用了,我们采用

的算法时间复杂度小于O(N),  我们这样,我们一进入函数就比较 key(需要查找的整数)和右上角数字的大小,

@如果key==4,那么就结束,

@如果key大于4 ,我们就排除一行,大致如下:

/*(key>4)

1 2 3 4

2 3 4 5

3 4 5 6

*/

那么 5就变成了右上角,继续与key进行比较,以此类推!直到找到key或者找完也没找到key结束!

@如果key小于4,那就排除一列,大致如下:

/*(key<4)

1 2 3

2 3 4

3 4 5

那么 3就变成了右上角,继续与key进行比较,以此类推!知道找到key或者找完也没找到key结束!

代码实现:

#include<stdio.h>
#include<stdlib.h>
/* 注意二维数组的传参可以是 int (*arr)[4],但不能是int arr[][]; */
int Find(int arr[][4], int rows, int cols, int key)
{
	if(arr != NULL && rows > 0 && cols > 0)
	{
/* 注意这块为什么定义变量row和col,因为要用下标查找数,但是cols和rows
还要作为循环终止的判断条件,所以不能动,于是需要另外定义两个变量进行下
标访问!*/
		int row = 0;
		int col = cols - 1;
		while(row < rows && col >= 0)
		{
    /* 接下来就是 = > < key  的三种情况的判断 */
			if(arr[row][col] == key)
				return 1;//找到就返回1;
			else if(arr[row][col] > key)
				col--;
			else
				row++;
		}
	}
	return 0;//0 表示没有找到
}

int main()
{
	int arr[3][4] = {1,2,3,4,2,3,4,5,3,4,5,6};
	int key = 6;//要查找的整数;
	int row = 3;//二维数组的行;
	int col = 4;//二维数组的列;

	printf("%d\n",Find(arr,row,col,key));

	system("pause");
	return 0;
}

#运行结果:

ps: 这个题的代码的实现还是比较简单实现的,前提是找到方法!

本题到此结束!

谢谢!

时间: 2024-10-07 02:47:29

剑指offer 面试题(二维数组中的查找) (2)的相关文章

剑指offer编程-二维数组中的查找

二维数组中的查找 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. #include<iostream> #include<vector> using namespace std; class Solution { public: bool Find(int target, vector<vector<int> > array) {

剑指offer一:二维数组中的查找

题目: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路: 这是一个顺序二维数组,可以从右下角处开始查找.本题中需要注意数组下限,不要忘记减一 public class Solution { public boolean Find(int target, int [][] array) { int row = 0; int col = array[0].length -1

《剑指Offer》题目——二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析: 暴力破解时间复杂度太高,本题有两种思路:1. 将每行看成一个有序数组,用二分查找2. 从左下角开始查找,若大于该值,右移:若小于该值,上移,直到找到为止 public class ArraySearch { public static boolean Find(int target, int [][] ar

《剑指Offer》之二维数组中的查找

1.题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 2.代码实现 1 public class Solution { 2 3 public boolean Find(int[][] array,int target) { 4 5 for(int i = 0; i < array.length; i++){ 6 for(int j = 0; j < array[i].

剑指offer面试题29:数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一般,请找出这个数字,例如输入一个长度为9的数组(1,2,3,2,2,2,5,4,2,).由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 个人第一眼想法是通过一个sort函数,再判断中间那数出现次数,只要出现多于n/2,就直接输出. 一般来说,最为直观的算法面试官都不会满意,那么有没有更优的算法呢? 这种算法是受快速排序算法的启发.在随机快速排序算法中,我们现在数组中随机选择一个数字,然后调整数组中数字的顺序,使得比选中的数字小的数字

剑指Offer 面试题36:数组中的逆序对及其变形(Leetcode 315. Count of Smaller Numbers After Self)题解

剑指Offer 面试题36:数组中的逆序对 题目:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. 例如, 在数组{7,5,6,4}中,一共存在5个逆序对,分别是(7,6),(7,5),(7,4),(6,4)和(5,4),输出5. 提交网址: http://www.nowcoder.com/practice/96bd6684e04a44eb80e6a68efc0ec6c5?tpId=13&tqId=11188 或 htt

剑指offer刷题—二维数组的查找

最近接触到一本书叫做剑指offer,在这里准备在这个2个月左右将这本书刷完,当然,不需要每天多少道什么的,不在多,一天理解一道就好了,希望能成为一种习惯,另外,准备在github上也进行同步分享. 今天第一道题: 面试题3:二位数组中的查找 当我们需要解决一个复杂问题时,一个很有效的方法就是从具体的问题出手,通过分析具体的例子,得到规律. 再一个二维数组中,每一行都要按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排列.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含

【剑指offer】规则二维数组查找

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 思路:从数组左下角开始判断,如果目标数据大于左下角数字,则列号右移(增加),若目标数字小于左下角数字,则行号上移(减小) public class Solution {     public boolean Find(int target, int [][] array) {         int ro

剑指Offer 面试题40:数组中只出现一次的两个数 题解

面试题40:数组中只出现一次的两个数 提交网址:  http://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193 或 http://ac.jobdu.com/problem.php?pid=1351 题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字.要求时间复杂度是O(n),空间复杂度是O(1). 牛客网OJ的输入输出接口是:void Fin

剑指offer——面试题29:数组中出现次数超过一半的数

题目描述: 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字. 例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2. 输入: 每个测试案例包括2行: 第一行输入一个整数n(1<=n<=100000),表示数组中元素的个数. 第二行输入n个整数,表示数组中的每个元素,这n个整数的范围是[1,1000000000]. 输出: 对应每个测试案例,输出出现的次数超过数组长度的一半的数,如果没有输出-1. 解法一:基