二维数组查询

数组的规律是:从左向右递增,从上向下递增,给任意一个数字,看是否能够找到该数字

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]相对灵活性就差一些。

posted @ 2018-08-22 15:39  快乐的打字员~  阅读(180)  评论(0)    收藏  举报