** 问题 **
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。判断数组中是否含有某整数。
** 例子 **
** 思路 **
- 暴力 O(n^2)
把二维数组中所有的元素取出来,放到set中,看set中是否有该数
- 也很暴力
从左上角开始[0][0],取出元素和该数比较,如果大于,让i+1或j+1,接着比,如果小于,让i-1或j-1接着比
- 二分查找 O(nlogn)
每一行都是从左到右递增的,对每一行进行二分查找
- O(n)
- 从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。
- 跟方法2相比,每次都比较后都少一列或一行,将比较区域极大的缩小
** 代码 **
//方法3
public class Solution {
//二分查找,递归
public boolean binarySearch(int[] array, int low, int high,int target) {
//low>high要放在最前面,因为后面的[low],[high]可能会有越界
if (low>high || target<array[low] || target>array[high] ) return false;
int mid = (low+high)/2;
if (array[mid]>target) return binarySearch(array,low,mid-1,target);
if (array[mid]<target) return binarySearch(array,mid+1,high,target);
//if (array[mid]==target)
return true;
}
public boolean Find(int target, int [][] array) {
for (int i=0; i<array.length; i++) {
if (binarySearch(array[i],0,array[i].length-1,target)){
return true;
}
}
return false;
}
}
//方法4
import java.util.*;
public class Solution {
public boolean Find(int target, int [][] array) {
int i=array.length-1,j=0;
while (j<=array[0].length-1 && i>=0) {
int now= array[i][j];
if (now==target) return true;
if (now<target) j++;
if (now>target) i--;
/*
不用if(array[i][j]<target) j++;因为如果对i和j进行了修改,影响后面的if
否则的话,要写:
if(arr[i][j]<target) j++;
if (j<=array[0].length-1 && array[i][j]>target) i--;
*/
}
return false;
}
}
class Solution:
def searchMatrix(self, matrix, target):
"""
:type matrix: List[List[int]]
:type target: int
:rtype: bool
"""
if matrix==None or len(matrix)==0 or len(matrix[0])==0:
return False
i=len(matrix)-1;j=0;j_max=len(matrix[0])-1
while (i>=0 and j<=j_max):
t = matrix[i][j]
if target==t: return True
if target<t: i-=1
if target>t: j+=1
return False
** 技巧 **
从例子入手,看如何可以减少基础操作执行次数