题解 | #二维数组中的查找#

二维数组中的查找

http://www.nowcoder.com/practice/abc3fe2ce8e146608e868a70efebf62e

O(logN * M)

每一个数组用二分查找,然后结合得到

数组查找用二分,左右指针分别指向首末元素,且左闭右闭(循环不变量很重要)

public class Solution {
public boolean Find(int target, int [][] array) {
    boolean bool = false;
    for(int [] nums : array){
        bool = bool | find(target, nums);
    }
        
    return bool;
}

public boolean find(int target, int[] nums){
    int left = 0;
    int right = nums.length - 1;//左闭右闭
    while(left <= right){
        int mid = (left + right) / 2;
        if(nums[mid] == target) return true;
        else if(nums[mid] < target) left = mid + 1;
        else right = mid - 1;
    }
    return false;
}
}

O(N + M)

用两个指针分别指向,左下和右上,且左闭右闭(循环不变量很重要)

左下的指针只能向上向右

右上的指针只能向下向左

且每次一定走一步,因为有两个指针,所以最多走(n + m)/ 2步数

此题,指针指向左上和右下,不可取,因为一次判断之后,有两种走法,都不能排除

public class Solution {
public boolean Find(int target, int [][] array) {//O(N++M)
    int left_r = array.length - 1;//向上向右
    int left_c = 0;
    int right_r = 0;//向下向左
    int right_c = array[0].length - 1;
    
    while(left_r >= right_r && left_c <= right_c){
        if(array[left_r][left_c] == target) return true;
        else if(array[left_r][left_c] < target) left_c ++;
        else left_r --;
        
        if(array[right_r][right_c] == target) return true;
        else if(array[right_r][right_c] < target) right_r ++;
        else right_c --;
    }
    return false;
}
}
全部评论

相关推荐

01-24 08:13
已编辑
合肥工业大学 Java
程序员牛肉:没啥问题。标准的流水线简历,但是学历好一点,所以应该是有约面的机会的。 这段时间可以考虑把自己的两个项目彻底的理一理。争取能够讲清楚每一个功能点
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务