牛客网&剑指offer 二维数组中的查找(JAVA)

牛客网·剑指offer 二维数组中的查找(JAVA)

题目描述

在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

解题思路

解法一

将每一行看成一个一维数组,手写二分排序查他。

public class Solution {
    private static int BS(int fromIndex, int toIndex, int[] a, int num) {
        int low = fromIndex, high = toIndex-1;
        while(low <= high) {
            int mid = (low + high) / 2;
            if(a[mid] < num) 
                low = mid + 1;
            else if(a[mid] > num)
                high = mid - 1;
            else 
                return mid;
        }
        return -(low + 1);
    }
    public boolean Find(int target, int [][] array) {
        if(array == null) return false;
        boolean ans = false;
        for(int i = 0; i < array.length; i++) {
            if(array[i].length == 0 || array[i][0] > target) break; //万一此列为空
            if(BS(0, array[i].length, array[i], target) < 0) continue;
            else {
                ans = true;
                break;
            }
        }
        return ans;
    }
}

解法二

前提:矩阵是有序的。

从第i行看:

  • 若该行的最后一个数字小于所查询数字, 那么肯定不可能在该行,直接去下一行查找。
  • 若该行的最后一个数字等于所查询数字,那么返回true。
  • 若该行的最后一个数字大于所查询数字,那么必在该行,搜索即可。
public class Solution {
    public boolean Find(int [][] array,int target) {
        boolean found = false;
        int lie = array[0].length; // 列长
        int hang = array.length;   // 行数
        int column = lie -1;	   // 从最后一列看起
        int row =0;				   // 从第一行看起
        while(row<hang &&column>=0){
           int value = array[row][column];
            if(target>value){
                row++;
            }else if(value>target){
                column--;
            }else{
                found = true;
                break;
            }
        }
            return found;
	}
}

解法3

解法二中引入快排

public class Solution {
    private static int BS(int fromIndex, int toIndex, int[] a, int num) {
        int low = fromIndex, high = toIndex-1;
        while(low <= high) {
            int mid = (low + high) / 2;
            if(a[mid] < num)
                low = mid + 1;
            else if(a[mid] > num)
                high = mid - 1;
            else
                return mid;
        }
        return -(low + 1);
    }
    public boolean Find(int target, int [][] array) {
        boolean ans = false;
        for(int i = 0; i < array.length; i++) {
            if(array[i].length == 0) break;
            int value = array[i][array[i].length-1];
            if(value < target)
                continue;
            else if (value > target) {
                if(BS(0, array[i].length, array[i], target) >= 0)
                    ans = true;
            } else {
                ans = true;
                break;
            }
        }
        return ans;
    }
}
原文地址:https://www.cnblogs.com/fromneptune/p/12346162.html