从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小。于是,target比这个元素小就往上找,比这个元素大就往右找。如果出了边界,则说明二维数组中不存在target元素。
注意:不能从左上角开始,因为它往下和往右都是递增,没办法选择路径
import java.util.*;
public class Solution {
// 每一行做一个二分查找
public boolean Find2(int target, int[][] array) {
for (int i = 0; i < array.length; i++) {
int left = 0;
int right = array[i].length - 1; // 注意
while (left <= right) {
int mid = left + (right - left) / 2; // 和 (left + right) / 2 的结果相同,但是有效防止了 left 和 right 太大直接相加导致mid溢出。
if (array[i][mid] > target) {
right = mid - 1; // 注意
} else if (array[i][mid] < target) {
left = mid + 1; // 注意
} else {
return true;
}
}
}
return false;
}
public boolean Find(int target, int[][] array) {
if (array.length == 0) {
return false;
}
int i = array.length - 1;
int j = 0;
while (i >= 0 && j < array[i].length) {
if (array[i].length == 0) {
return false;
}
if (array[i][j] < target) {
j++;
} else if (array[i][j] > target) {
i--;
} else {
return true;
}
}
return false;
}
public static void main(String[] args) {
Solution s = new Solution();
int intArray[][] = {{1, 2}};
Boolean ans = s.Find(7, intArray);
System.out.println(ans);
}
}