数组的规律是:从左向右递增,从上向下递增,给任意一个数字,看是否能够找到该数字
class solution { public: bool findNumber(int *nums,int rows,int columns,int number) { if(nums == nullptr || rows<=0 || columns<=0) return false; int row = 0; int column = columns - 1; while(row<=rows && column>=0) { if(nums[row*columns + column] == number) { cout<<nums[row*columns + column]<<endl; return true; } else if(nums[row*columns + column] > number) column--; else row++; } return false; } };
正常的思路是从第一行开始找,大于最右端就向下,小于就当行,但是会遗漏,数字会重复,且下一行的前多少个是不一定大于前一行的最后一个。
本代码的思路就是从右上角开始找,小于该数字就去掉当行,大于就去掉当列。提高了准确度和效率,找到一个就返回。
这里还遇到了一点二维数组的知识,首先编译器会把数组符号转换成指针符号,例如ar[1]会被转换为ar+1,编译器这样转换需要知道ar所执行对象的大小,所以在定义函数参数接收二维数组的时候,由于传进来的就是一个数组的首地址,因此int **nums和
int nums[][]这种参数都是不行的,也可以用int (*nums)[N]相对灵活性就差一些。