注意是有序数组!!
思路:
1.利用二维数组由上到下,由左到右递增的规律,
选取右上角或者左下角的元素a[m][n]与target进行比较,
当target小于元素a[m][n]时,那么target必定在元素a所在行的左边,
即n-1;
当target大于元素a[m][n]时,那么target必定在元素a所在列的下边,
即m+1;
# -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here m=0 n=len(array[0])-1 #右上角开始判断 while m<=len(array)-1 and n>=0: if array[m][n]>target: n-=1 elif array[m][n]<target: m+=1 else: return True return False
上述m,n的位置不能互换,否则无法通过,以右上角起始位置来判断。
不过花了295ms, 用java的<1ms !!!
2.把每一行看成有序递增的数组,
利用二分查找,
遍历每一行,
时间复杂度是nlogn.
# -*- coding:utf-8 -*- class Solution: # array 二维列表 def Find(self, target, array): # write code here for i in range(0,len(array)): low=0 high=len(array[0])-1 while low<=high: mid=(high+low)/2 if array[i][mid]>target: high=mid-1 elif array[i][mid]<target: low=mid+1 else: return True return False
注意二分法中,在每行的循环中,再赋值low和high。
其次注意 千万不要漏掉条件:while low<=high:
但是速度还是很慢,最终耗时418ms。