剑指offer(1)

题目:

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

  解答:

  方案一:从左下或者右上查找(代码以左下为例),目标大于当前数往右移动,小于往上移动。路径不可能出现凸字形。

  

public class Solution {
    
    public static void main(String[] args) {
		int number = 7;
		int array[][] = new int [][] {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
		Solution solution = new Solution();
		boolean result = solution.Find(number,array);
		System.out.println(result);
		

	}
    public boolean  Find(int target, int [][] array) {

        int i=array.length-1;
        int j=0;
        while(i>=0&&j<=array[0].length-1){
            if(array[i][j]>target){
                i--;
            }else if(array[i][j]<target){
                j++;
            }else{
                return true;
            }
        }
        return false;
    }
}

  方案二:当做一个长条数组,每行使用二分法查找

public class Solution {
    
    public static void main(String[] args) {
        int number = 7;
        int array[][] = new int [][] {{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        Solution solution = new Solution();
        boolean result = solution.Find(number,array);
        System.out.println(result);
        

    }
    public boolean Find(int target, int [][] array) {
        for(int i=0;i<array.length;i++){
            int low = 0;
            int high = array[0].length-1;
            
            while(low<=high){
                int mid = (high+low)/2;
                if(target<array[i][mid]){
                    high = mid-1;
                }else if(target>array[i][mid]){
                    low = mid+1;
                }else{
                    return true;
                }
            }
        }
        return false;
    }
}
原文地址:https://www.cnblogs.com/figsprite/p/10440363.html