• 【数组】Search a 2D Matrix


    题目:

    Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties:

    • Integers in each row are sorted from left to right.
    • The first integer of each row is greater than the last integer of the previous row.

    For example,

    Consider the following matrix:

    [
      [1,   3,  5,  7],
      [10, 11, 16, 20],
      [23, 30, 34, 50]
    ]
    

    Given target = 3, return true.

    思路:

    分两步,(1)先二分搜索的元素定位到行:当目标小于第一列某个元素时,向前面的行中去搜索;当目标大于第一列某个元素分两种情况 a、大于该元素所在行的最后一个元素时,往后面的行中去搜索,b、小于等于该元素所在行的最后一个元素,则可以定位到该元素所在的行。(2)在定位好的行中二分搜索

    注意,在第一步查找所在行时,while(l<r)而不是whilel<=r;当target>nums[middle]时,还需要判断一下target和该行末的值,从而确定是否需要l=middle+1。

    /**
     * @param {number[][]} matrix
     * @param {number} target
     * @return {boolean}
     */
    var searchMatrix = function(matrix, target) {
        var m=matrix.length,n=matrix[0].length;
        
        var L=0,R=m-1,middle=0;
        while(L<R){
            middle=L+Math.floor((R-L)/2);
            if(target<matrix[middle][0]){
                R=middle-1;
            }else if(target>matrix[middle][0]){
                if(target>matrix[middle][n-1]){
                    L=middle+1;
                }else{
                    L=middle;
                    break;
                }
            }else{
                return true;
            }
        }
        
        var row=L;
        var l=0,r=n-1,middle=0;
        while(l<=r){
            middle=l+Math.floor((r-l)/2);
            if(matrix[row][middle]>target){
                r=middle-1;
            }else if(matrix[row][middle]<target){
                l=middle+1;
            }else{
                return true;
            }
        }
        return false;
            
    };
  • 相关阅读:
    IO多路复用
    事件驱动模型
    协程
    进程
    py2与py3的编码问题
    Linux Centos7 网卡无法启动
    监控的法则
    如何优雅的采集activeMQ性能指标
    一分钟性能分析
    beta版 tomcat 应用监控指标
  • 原文地址:https://www.cnblogs.com/shytong/p/5110569.html
Copyright © 2020-2023  润新知