算法题目
题目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);
}
};