zoukankan      html  css  js  c++  java
  • 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 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
     6         int i = 0;
     7         for(; i < matrix.length; i ++){
     8             if(target < matrix[i][0]) {
     9                 if(i < 1) return false;
    10                 for(int j = 0; j < matrix[i-1].length; j ++){
    11                     if(target == matrix[i-1][j]) return true;
    12                 }
    13                 return false;
    14             }
    15             else if(target == matrix[i][0]) return true;
    16         }
    17         for(int j = 0; j < matrix[i-1].length; j ++){
    18             if(target == matrix[i-1][j]) return true;
    19         }
    20         return false;
    21     }
    22 }

     第二遍:使用两次二分来加速。 一次是找到不大于target的col= 0的最值, 第二遍遍历这一row 然后找target。 如果找不到 就return false。

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
     6         int start = 0, end = matrix.length - 1, mid = 0;
     7         int i = 0, j = 0;
     8         while(start <= end){
     9             mid = (start + end) / 2;
    10             int tmp = matrix[mid][0];
    11             if(tmp < target){
    12                 i = mid;
    13                 start = mid + 1;
    14             }else if(tmp == target) return true;
    15             else{
    16                 end = mid - 1;
    17             }
    18         }
    19         start = 0;
    20         end = matrix[0].length - 1;
    21         while(start <= end){
    22             mid = (start + end) / 2;
    23             int tmp = matrix[i][mid];
    24             if(tmp < target){
    25                 j = mid;
    26                 start = mid + 1;
    27             }else if(tmp == target) return true;
    28             else{
    29                 end = mid - 1;
    30             } 
    31         }
    32         return false;
    33     }
    34 }

     Step的方法:

     1 public class Solution {
     2     public boolean searchMatrix(int[][] matrix, int target) {
     3         // Start typing your Java solution below
     4         // DO NOT write main() function
     5         if(matrix == null || matrix.length == 0 || matrix[0].length == 0) return false;
     6         int row = matrix.length - 1, col = 0;
     7         while(row > -1 && col < matrix[0].length){
     8             if(matrix[row][col] > target) row --;
     9             else if(matrix[row][col] < target) col ++;
    10             else return true;
    11         }
    12         return false;
    13     }
    14 }
  • 相关阅读:
    The Water Problem HDU-5443
    约瑟夫环1
    迪杰斯特拉算法1 HDU-1874
    [20200729NOIP提高组模拟T2]学数数——坎坷
    [20200728NOIP提高组模拟T4]有趣的有趣的家庭菜园——自闭了
    [20200728NOIP提高组模拟T1]Copy
    [20200728NOIP提高组模拟T2]愉快的logo设计
    [20200727NOIP提高组模拟T3]计算几何
    [20200727NOIP提高组模拟T2]走路
    [CQOI2015]任务查询系统
  • 原文地址:https://www.cnblogs.com/reynold-lei/p/3348466.html
Copyright © 2011-2022 走看看