zoukankan      html  css  js  c++  java
  • 【leetcode刷题笔记】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.


    题解:每次用右上角的元素跟target比较,有三种情况:

    1. 相等,说明找到了target;
    2. 右上角元素比target元素大,那么说明target在第一行,递归的搜索第一行。
    3. 右上角元素比target元素小,那么说明target在第二行及以后,递归的搜索如下图所示区域:

    代码如下:

     1 public class Solution {
     2     private boolean IfFind = false;
     3     private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){
     4         if(m_start > m_end || n_start > n_end)
     5             return;
     6             
     7         if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length)
     8             return;
     9         
    10         if(matrix[m_start][n_end] == target){
    11             IfFind = true;
    12             return;
    13         }
    14         if(matrix[m_start][n_end] > target)
    15             RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1);
    16         else {
    17             RightCornerRecur(matrix, target, m_start+1,m_end, n_start, n_end);
    18         }
    19 
    20     }
    21     public boolean searchMatrix(int[][] matrix, int target) {
    22         RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1);
    23         return IfFind;
    24     }
    25 }

    右上角可以用来比较剪掉一些元素,左下角同样可以,下面的代码中加上了左下角元素与target元素的比较,最终的运行时间是384ms,而上述只考虑右上角的运行时间是472ms。

     1 public class Solution {
     2     private boolean IfFind = false;
     3     private void RightCornerRecur(int[][] matrix,int target,int m_start,int m_end,int n_start,int n_end){
     4         
     5         if(m_start > m_end || n_start > n_end)
     6             return;
     7             
     8         if(m_start < 0 || n_start < 0 || m_end >= matrix.length || n_end >= matrix[0].length)
     9             return;
    10         
    11     
    12         if(matrix[m_start][n_end] == target){
    13             IfFind = true;
    14             return;
    15         }
    16         
    17         if(matrix[m_start][n_end] > target)
    18             RightCornerRecur(matrix, target, m_start, m_start, n_start, n_end-1);
    19         
    20         else {
    21             if(matrix[m_end][0] == target){
    22                 IfFind = true;
    23                 return;
    24             }
    25             if(matrix[m_end][0] < target)
    26                 RightCornerRecur(matrix, target, m_end, m_end, n_start+1, n_end);
    27             else
    28                 RightCornerRecur(matrix, target, m_start+1,m_end-1, n_start, n_end);
    29         }
    30 
    31     }
    32     public boolean searchMatrix(int[][] matrix, int target) {
    33         RightCornerRecur(matrix, target,0,matrix.length-1, 0, matrix[0].length-1);
    34         return IfFind;
    35     }
    36 }
  • 相关阅读:
    Django基础
    DRF初始化/DRF认证、权限、限流、分页、过滤、序列化
    Pyinstaller安装和使用
    爬虫概述
    django在test.py测试文件中的配置
    django ORM 多对多关系
    django中的分页
    vue安装及新建项目
    app应用路由设置
    Django之Session与Cookie原理及区别
  • 原文地址:https://www.cnblogs.com/sunshineatnoon/p/3851176.html
Copyright © 2011-2022 走看看