【剑指offer-JZ4】二维数组中的查找

70 阅读1分钟

从左下角元素往上查找,右边元素是比这个元素大,上边是的元素比这个元素小。于是,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);
    }
}


题源:www.nowcoder.com/practice/ab…