4 二维数组中的查找_剑指Offer/ 240 Search a 2D Matrix II

** 问题 **

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。判断数组中是否含有某整数。
在这里插入图片描述
** 例子 **
在这里插入图片描述
** 思路 **

  1. 暴力 O(n^2)

把二维数组中所有的元素取出来,放到set中,看set中是否有该数

  1. 也很暴力

从左上角开始[0][0],取出元素和该数比较,如果大于,让i+1或j+1,接着比,如果小于,让i-1或j-1接着比
在这里插入图片描述

  1. 二分查找 O(nlogn)

每一行都是从左到右递增的,对每一行进行二分查找

  1. O(n)
  • 从左下角来看,向上数字递减,向右数字递增,因此从左下角开始查找,当要查找数字比左下角数字大时。右移要查找数字比左下角数字小时,上移。
  • 跟方法2相比,每次都比较后都少一列或一行,将比较区域极大的缩小
    在这里插入图片描述
    ** 代码 **
//方法3
public class Solution {
    //二分查找,递归
   public boolean binarySearch(int[] array, int low, int high,int target) {
        //low>high要放在最前面,因为后面的[low],[high]可能会有越界
        if (low>high || target<array[low] || target>array[high] ) return false;
        int mid = (low+high)/2;
        if (array[mid]>target) return binarySearch(array,low,mid-1,target);
        if (array[mid]<target) return binarySearch(array,mid+1,high,target);
        //if (array[mid]==target) 
        return true;
    }
    public boolean Find(int target, int [][] array) {
        for (int i=0; i<array.length; i++) {
            if (binarySearch(array[i],0,array[i].length-1,target)){
                return true;
            }
        }
        return false;
    }
}
//方法4
import java.util.*;
public class Solution {
    public boolean Find(int target, int [][] array) {
        int i=array.length-1,j=0;
        while (j<=array[0].length-1 && i>=0) {
        	int now= array[i][j];
            if (now==target) return true;
            if (now<target) j++;
            if (now>target) i--;
            /*
            不用if(array[i][j]<target) j++;因为如果对i和j进行了修改,影响后面的if
            否则的话,要写:
            if(arr[i][j]<target) j++;
            if (j<=array[0].length-1 && array[i][j]>target) i--;
             */
        }
        return false;
    }
}
class Solution:
    def searchMatrix(self, matrix, target):
        """
        :type matrix: List[List[int]]
        :type target: int
        :rtype: bool
        """
        if matrix==None or len(matrix)==0 or len(matrix[0])==0:
            return False
        
        i=len(matrix)-1;j=0;j_max=len(matrix[0])-1
        
        while (i>=0 and j<=j_max):
            t = matrix[i][j]
            if target==t: return True
            if target<t: i-=1
            if target>t: j+=1
        return False

** 技巧 **

从例子入手,看如何可以减少基础操作执行次数

发布了78 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/puspos/article/details/103925469