查找有序二维数组中的数

题目描述

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, returntrue.

代码:
1、暴力破解(很Low)
public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m =matrix.length;
        int n=matrix[0].length;
        boolean flag=false;
        for(int i=0;i<m;i++)
        {
            int max=matrix[i][n-1];
            int min=matrix[i][0];
            if(target>=min&&target<=max)
            {
                for(int j =0;j<n;j++)
                {
                    if(target==matrix[i][j])
                    {
                        flag=true;
                        break;
                    }
                }
            }
        }
        return flag;
    }
}


2、二分查找:
2.1、把二维数组看成一维数组进行查找:
public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
        int m=matrix.length;
        int n =matrix[0].length;
        int start = 0;
        int end = m*n-1;
        int mid=0,row=0,col=0;
        while(start<=end)
        {
            mid = (start+end)/2;
            row = mid/n;
            col = mid%n;
            if(matrix[row][col]==target)
                return true;
            else if(matrix[row][col]<target)
                start = mid+1;
            else
                end=mid-1;
        }
        return false;
    }
}
2.2,先对行进行二分查找,在对列进行二分查找
链接:https://www.nowcoder.com/questionTerminal/5145394607ea4c5f8b25755718bfddba
来源:牛客网

先纵向二分查找,再横向二分查找,复杂度为log(m) + log(n),
把二维当做一维的二分复杂度为log(n*m),
双向二分更优;

链接:https://www.nowcoder.com/questionTerminal/5145394607ea4c5f8b25755718bfddba
来源:牛客网
<code class="lang-java">public class Solution {    public boolean searchMatrix(int[][] matrix, int target) {        int m = matrix.length, n = matrix[0].length;        int up = 0, down = m - 1, mid = (up + down) / 2;         while(up <= down) {            if(matrix[mid][0] > target) {                // search up                down = mid - 1;            } else if(matrix[mid][n-1] >= target) {                // search in line                break;            } else {                //search down                up = mid + 1;            }            mid = (up + down) / 2;        }         if(up <= down) {            //search in line            int l = 0, r = n - 1;            int [] line = matrix[mid];            mid = (l + r) / 2;            while(l <= r) {                if(line[mid] > target) {                    //search left                    r = mid - 1;                } else if(line[mid] == target) {                    return true;                } else {                    //search right                    l = mid + 1;                }                mid = (l + r) / 2;            }            return false;        } else {            return false;        }    }}</code>

3,删除法:(很巧妙)
public class Solution {
    public boolean searchMatrix(int[][] matrix, int target) {
    int i=0,j=matrix[0].length-1;
    while(i<matrix.length&& j>=0){
        if(matrix[i][j]==target){
            return true;
        }
        else if(matrix[i][j]<target){
            i++; //去掉这一行
        }
        else{
            j--;  //去掉这一列
        }
    }
    return false;
    }
}


 

猜你喜欢

转载自blog.csdn.net/qq_34360094/article/details/82593693