首先强烈建议自己手写一边二分查找

虽然我还没手写,提交这个题解马上就去写。可以上leetcode上写这道题。704 leetcode标准二分查找

其次,API是真的香。Arrays.binarySearch()真的好用!

怀疑大佬们的编码能力?还是不相信大佬们的API效率呢?

int mid = (low + high) >>> 1;
这个效率不高吗????
还是API用的舒服。哈哈哈哈,po出代码,写的很烂,还有很多需要改进的地方。
图片说明
这是官方1.8API解释,需要注意的是,返回值如果找不到的话返回的肯定是负值,不一定是-1.

比如:[4,10,12,2,3,31] 经过排序之后为[2,3,4,10,12,31],如果target为5的时候,不返回-1而返回-4。 从-1开始算,如果找不到则在第一个大于target的元素为终点元素停止计数。这也是程序中为什么选择 return isSearch >= 0;

思路:判断每行的第一个元素和最后一个元素的范围,因为是升序(有顺序的),所以target元素可以在每行所包含的区间内找到。算了,我再改改代码吧。

package com.yamon.test;

import java.util.Arrays;

/*
*
* 描述
请写出一个高效的在m*n矩阵中判断目标值是否存在的算法,矩阵具有如下特征:
每一行的数字都从左到右排序
每一行的第一个数字都比上一行最后一个数字大
例如:
对于下面的矩阵:
[
    [1,   3,  5,  9],
    [10, 11, 12, 30],
    [230, 300, 350, 500]
]
要搜索的目标值为3,返回true;
示例1
输入:
[[1,3,5,9],[10,11,12,30],[230, 300, 350, 500]],3
复制
返回值:
true

*
* */
public class SearchMatrix {
    public boolean searchMatrix (int[][] matrix, int target) {
        // write code here
        if (matrix.length==0){
            return false;
        }
        int row= matrix.length;
        int col = matrix[0].length;
        if (row==1){
            return isSearch(matrix[0], target);
        }
        for (int i = 0; i < row; i++) {
            if (target>=matrix[i][0] && target<=matrix[i][col-1]){
                return isSearch(matrix[i], target);
            }
        }
        return false;
    }

    public boolean isSearch(int[] matrix, int target){
        int isSearch = Arrays.binarySearch(matrix, target);
        return isSearch >= 0;
    }



    public static void main(String[] args) {
        int[][] arr = {
                {1,1}
        };
        System.out.println(new SearchMatrix().searchMatrix(arr, 1));
    }
}