Test

算法题目

题目1:在二维数组中搜索数字

给定一个m*n维的矩阵,矩阵符合以下性质:

  • 每行从左到右数字递增
  • 每列从上到下数字递增
例子:

[
[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]

下面要判断某个数字t是否在矩阵中,如果这个数字t出现的话,返回true,反之返回false

思路:

第一反应是要用二维的二分查找来做,复杂度是 O(mn) 。但如果仔细观察的话,可以将复杂度缩小至 O(m+n) 。如果我们从右上角来找,要找的数字比当前数字要小的话,往左寻找即列数减一即可。如果要找的数字比当前数字要大的话,往下寻找即行数加一即可。

代码:
class Solution {
public:
    bool searchMatrix(vector<vector<int>>& matrix, int target) {       
        int m = matrix.size();
        int n = matrix[0].size();
        //从右上角开始找
        int row = 0, col = n - 1;
        while(row < m  && col >=0){
            if(matrix[row][col] == target) return true;
            if(matrix[row][col] > target) col--;
            else row++;
        }
        return false;      
     }
};

题目2:数组查找数字第一次出现的位置

对于有序数组,我们寻找当中某个数字第一次出现的位置。没出现的话返回-1。

思路:

依然是二分查找的路子,只不过每次查到后要记录下位置,然后继续往前进行二分查找。找到的位置如果比之前记录的位置要靠前,则更新这个位置,否则不变。一直到找不到退出为止

代码:
class Solution{
public:
    int searchFirstShow(vector<int>& datalist, int target) {  
        int length = datalist.size();
        if(length < 1) return -1;
        int start = 0, stop = length - 1, loc = length;
        while(1){
            int rloc = BinarySearch(data, start, stop, target);
            if( rloc == -1 ) break;
            if( rloc < loc ) {//只往前搜,找到合理的点的时候更新stop
                loc = rloc;
                stop = loc;
            }

        }
        if( loc == length) return -1;
        return loc;
    }  
    int BinarySearch(vector<int>& data, int start, int end, int target){//二分搜索递归写法的主程序
        if(start > end) return -1;
        if(start==end){
            if(data[start]==target) return start;
            else return -1;
            }
        if(a[mid] == target) return mid;
        if(a[mid] > target) return BinarySearch(a,start,mid-1,target);
        return BinarySearch(a,mid+1,stop,target);
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值