|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 哲子DZ 于 2017-8-26 19:10 编辑
题目是在矩阵中搜索target,有返回True,没有返回False,矩阵有两个特征每行中的整数从小到大排序的;每行的第一个数大于上一行的最后一个整数。
- class Solution:
- def searchMatrix(self, matrix, target):
- if len(matrix) == 0:
- return False
-
- n, m = len(matrix), len(matrix[0])
- start, end = 0, n * m - 1
- while start + 1 < end:
- mid = (start + end) / 2
- x, y = mid / m, mid % m
- if matrix[x][y] < target:
- start = mid
- else:
- end = mid
- x, y = start / m, start % m
- if matrix[x][y] == target:
- return True
-
- x, y = end / m, end % m
- if matrix[x][y] == target:
- return True
-
- return False
复制代码
我一开始的思路是从矩阵右上角开始搜索,小于target可以过滤一行,大于的话可以过滤一列,但是也只是思路,到代码实现就完全不会了。以上代码是答案,按照答案的思路,第一个开始的元素是[1][3],问题1:为什么从第2行最后一个元素开始?问题2:x,y的选择代码(x, y = mid / m, mid % m)是什么思路?非常感谢!!辛苦~
P.S.之所以说是第一个开始的元素是[1][3],是因为有数据例子:[
[1, 3, 5, 7],
[10, 11, 16, 20],
[23, 30, 34, 50]
]
target = 3, return True
主体思路——二分法
把你这个矩阵展开成一行,第一行的末尾连第二行的开头,以此类推
选这个队列中的中间那个数和target比,相等就输出,若小可排除掉后面那一半数,若大同理
之后在对剩下的一半数重复上面的过程
这样寻找的效率要比的方法快一些,二分法也是在查找问题中非常常用的方法
第一个开始的元素是[1][3] -> 你算的不对吧,如果行列的角标都从0开始,第一个元素是[1][1]正好是这一列数中间的那个数
x,y的选择代码(x, y = mid / m, mid % m) -> mid是这一列数中第几个数,还要把这个折合成矩阵的角标才行。
比如你的例子中求第一个数的时候 start = 0, end = 11, mid = (start+end)//2 = 5
x=mid//m=1 y=mid%m=1 (m=4)
你这个例子的答案应该是python2的吧,如果你的编译器是python3的话,要注意求x y的时候要用地板除//
|
|