二维数组中的查找
原题链接:JZ4 二维数组中的查找
问题描述
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
样例:
[
[1,2,8,9],
[2,4,9,12],
[4,7,10,13],
[6,8,11,15]
]
给定 target = 7,返回 true。 给定 target = 3,返回 false。
我写的解决方案:1.暴力搜索
循环遍历整个二维数组,如果遍历到某个元素值等于 target
,将 result = true
。(个人感觉自己写的很麻烦,虽然也过了测试)时间复杂度O(MN);空间复杂度O(1)
class Solution:
def Find(self , target: int, array: List[List[int]]) -> bool:
# write code here
result = False
for i in range(len(array)):
for j in range(len(array[i])):
if array[i][j] == target:
result = True
break
return result
观看了大佬们的题解,我觉得自己写的是个垃圾,罗列了牛客上的点赞最多的题解(我认为简洁的,思路好的):
解题好的思路(来自于网友):
2.利用二分搜索
解题思路: 利用数组每行每列都是递增特性。
主要思路: 逐行使用二分搜索,查找是否含有 target
如样例:分别每行使用一次二分搜索(M次二分查找),时间复杂度O(MlogN),空间复杂度O(1)
观看别人的题解,自己写的代码(思路和图片来自牛客水印上的网友)
class Solution:
def Find(self , target: int, array: List[List[int]]) -> bool:
def binary_search(list1, target):
length = len(list1)
left = 0
right = length-1
while (left<=right):
mid = int((left+right)/2)
if list1[mid] == target:
return True
# 说明要找的元素在右边,向右遍历
elif target > list1[mid]:
left = mid + 1
# 说明要找的元素在左边,向左遍历
else:
right = mid - 1
return False
for i in range(len(array)):
if binary_search(i, target):
return True
return False
下面这个是我在网站上学习的阿秀的思路,我感觉很巧妙,记录一下。
如果当前位置元素比target小,则row++ ;
如果当前位置元素比target大,则col-- ;
如果相等,返回true;
如果越界了还没找到,说明不存在,返回false;