题目:https://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e?tpId=13&tqId=11154&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
假设arr数组,val,tar如下图所示:
如果我们把二分值定在右上角或者左下角,就可以进行二分。这里以右上角为例,左下角可自行分析:
思路:
1)设初始值为右上角元素,arr[0][5] = val,目标tar = arr[3][1]
2)接下来进行二分操作:
3)如果val == target,直接返回
4)如果 tar > val, 说明target在更大的位置,val左边的元素显然都是 < val,间接 < tar,说明第 0 行都是无效的,所以val下移到arr[1][5]
5)如果 tar < val, 说明target在更小的位置,val下边的元素显然都是 > val,间接 > tar,说明第 5 列都是无效的,所以val左移到arr[0][4]
6)继续步骤2)
class Solution {
public:
bool Find(int target, vector<vector<int> > array) {
int rows = array.size();
int columns = array[0].size();
//判断数组是否为空
if(rows == 0 || columns == 0) return false;
//第一行
int row = 0;
//最后一列
int column = columns - 1;
while(row < rows && column >= 0){
//array[row][column]: 最右上角的元素
if(array[row][column] == target){
return true;
}
else if(array[row][column] > target){
column--;
}
else
row++;
}
return false;
}
};