• leetcode 74 Search a 2D Matrix ----- java


    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.

    题目意思就是给定一个矩阵,按照从小到达排列,然后给定一个数字,判断数字是否在矩阵中。

    就是用二分法的应用。两种方法,第一种稍微慢一些。

    第一种是用了两次二分法,先找出行数、再在这一行上找具体是否存在。

    第二种是直接应用二分法,效率更高。

    public class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
    
    
            int len1 = matrix.length;
            if( len1 == 0 )
                return false;
            int len2 = matrix[0].length;
            if( len2 == 0 || target < matrix[0][0])
                return false;
            
            int row_start = 0,row_end = len1-1;
            int col_start = 0,col_end = len2-1;
            int row = (row_end+row_start)/2 ,col;
            while( row_start <= row_end){
                row = (row_end+row_start)/2;
                if( target >= matrix[row][0] ){
                    if( row == len1-1 || target < matrix[row+1][0])
                        break;
                    else
                        row_start = row+1;
                }
                else{
                    if( row == 0 || target >= matrix[row-1][0]){
                        row--;
                        break;
                    }
                    else
                        row_end = row-1;
                }
            }
            while( col_start <= col_end){
                col = (col_end+col_start)/2;
    
                if( target > matrix[row][col] ){
                    if( col == col_end )
                        return false;
                    else
                        col_start = col+1;
                }else if( target < matrix[row][col] ){
                    if (col == col_start)
                        return false;
                    else
                        col_end = col-1;
                }else
                    return true;
            }
            return false;
    
    
        }
    }
    public class Solution {
        public boolean searchMatrix(int[][] matrix, int target) {
    
    
            int len1 = matrix.length;
            if( len1 == 0 )
                return false;
            int len2 = matrix[0].length;
            if( len2 == 0 || target < matrix[0][0])
                return false;
            int start = 0,end = len1*len2-1,flag ;
            while( start <= end ){
                flag = (start+end)/2;
                int num = matrix[flag/len2][flag%len2];
                if( target > num)
                    start = flag+1;
                else if ( target < num)
                    end = flag-1;
                else
                    return true;
            }
            return false;
            
    
    
        }
    }
  • 相关阅读:
    python 字典
    python 列表、元组 for 循环
    python字符串
    python之while 循环 格式化、运算符、编码
    Python变量命名的规范、if else 条件语句
    Linux文件管理-主题2
    Linux系统管理-主题1
    Linux操作系统零基础入门学习3
    CCF--二十四点
    第一个Python程序
  • 原文地址:https://www.cnblogs.com/xiaoba1203/p/5965043.html
Copyright © 2020-2023  润新知