首先强烈建议自己手写一边二分查找
虽然我还没手写,提交这个题解马上就去写。可以上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)); } }