zoukankan      html  css  js  c++  java
  • leetcode------Search a 2D Matrix

    标题: Search a 2D Matrix
    通过率 31.3%
    难度 中等

    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.

    本题思路清晰,就是再一个二维数组中找某个元素,那么立即想到了二分法,关键点,按行算,第k个元素的行数等于k/列数,列数等于k%列数。

    还有一种思路就是,每一行的开头一定比上一行全部元素都大,那么从最后一行的第一个开始,每次比较每行的第一个,找到第一个比target小的元素,也就说明了target若存在一定在那一行,

    1、二分法查找代码如下:

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         if(matrix==null || matrix.length==0 || matrix[0].length==0) 
     4             return false;
     5  
     6         int m = matrix.length;
     7         int n = matrix[0].length;
     8  
     9         int start = 0;
    10         int end = m*n-1;
    11  
    12         while(start<=end){
    13             int mid=(start+end)/2;
    14             int midX=mid/n;
    15             int midY=mid%n;
    16  
    17             if(matrix[midX][midY]==target) 
    18                 return true;
    19  
    20             if(matrix[midX][midY]<target){
    21                 start=mid+1;
    22             }else{
    23                 end=mid-1;
    24             }
    25         }
    26  
    27         return false;
    28     }
    29 }

    2、查找第一个小的数:

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         int m=matrix.length;
     4         int n=matrix[0].length;
     5         int i=m-1;
     6         int j=0;
     7         while(i>=0){
     8             if(matrix[i][0]>target)i--;
     9             else break;
    10         }
    11         if(i<0)return false;
    12         while(j<n){
    13             if(matrix[i][j]==target)return true;
    14             else j++;
    15         }
    16         return false;
    17         
    18     }
    19 }

    3、python代码:

     1 class Solution:
     2     def searchMatrix(self, matrix, target):
     3         i, j = 0, len(matrix[0]) - 1
     4         while i < len(matrix) and j >= 0:
     5             if target < matrix[i][j]:
     6                 j -= 1
     7             elif target > matrix[i][j]:
     8                 i += 1
     9             else:
    10                 return True
    11         return False
  • 相关阅读:
    jsp中的绝对路径、相对路径和访问jsp的方式
    Java链接MySQL数据库的用配置文件和不用配置文件的代码
    易宝支付开发文档
    安装Visual Studio IntelliCode提供代码智能提示AI
    Generator生成器函数执行过程的理解
    git pull --rebase的理解
    react-native-cli运行项目及打包apk失败的解决过程
    bfc与浮动元素的关系
    触发bfc解决父子元素嵌套垂直方向margin塌陷问题
    html文本或元素6px间距问题
  • 原文地址:https://www.cnblogs.com/pkuYang/p/4283345.html
Copyright © 2011-2022 走看看