[Leetcode]240. Search a 2D Matrix II
这道题果然是升级版,思路不像他的弱化版那么好想了。虽然是排序但是排序拍的稍稍有点乱,要捋一捋。猛然醒悟,原来上面一篇说的不太好的O(n)的算法是这道题的解法。。。
先贴代码, AC答案:
解题思想呢有点像dp。刚开始没理解思路的时候,上来就写,没找好四个角,出现了一个问题,if里面呢,不知道什么时候往左,什么时候往下,if里面还有个if,后来发现不对劲。写出来要O(n*n)。只有固定好了移动方向,才能是n,才能不枉费已经排好的顺序。
我们发现比左上角大没啥价值,一排都没缩小范围,右下角也一样。只有比左边界小的时候,能排除右下方所有行,就在自己右上方搜索就行了,当target比下边界大的时候呢,排除左上所有列。所以啊,左下方这个角,也就是矩形定点的信息量大大的。或者右上角,同理。左上角这哥们,不管target比他大,比他小,都能有一个确定的移动方向,右上同理。别的俩角不行。
代码尤其简单!秒过
先贴代码, AC答案:
public class Solution {
public boolean searchMatrix(int[][] matrix, int target) {
//Two possible start point, bottom left and top right. Other two corner can not help us exclude numbers
//Four edges all have limititions, only corner can make certain decision
if(matrix == null || matrix.length == 0){
return false;
}
int m = matrix.length;
int n = matrix[0].length;
// i, j is the left bottom corner
int i = m - 1;
int j = 0;
while(i>=0 && j<n){
if(target > matrix[i][j]){
j++;
}
else if(target < matrix[i][j]){
i--;
}
else{
return true;
}
}
return false;
}
}
解题思想呢有点像dp。刚开始没理解思路的时候,上来就写,没找好四个角,出现了一个问题,if里面呢,不知道什么时候往左,什么时候往下,if里面还有个if,后来发现不对劲。写出来要O(n*n)。只有固定好了移动方向,才能是n,才能不枉费已经排好的顺序。
我们发现比左上角大没啥价值,一排都没缩小范围,右下角也一样。只有比左边界小的时候,能排除右下方所有行,就在自己右上方搜索就行了,当target比下边界大的时候呢,排除左上所有列。所以啊,左下方这个角,也就是矩形定点的信息量大大的。或者右上角,同理。左上角这哥们,不管target比他大,比他小,都能有一个确定的移动方向,右上同理。别的俩角不行。
代码尤其简单!秒过
Comments
Post a Comment