二维数组查询

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

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

转载于:https://www.cnblogs.com/jianbo1995/p/9518068.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值