《劍指offer》編程-有序數組中是否含有該數

《劍指offer》編程題-有序數組中是否含有該數

#要求:在一個二維數組中(每個一維數組的長度相同),每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。

#分析:這道題其實就是查找一個二維數組中是否含有一個數 但是該二維數組具有按行按列有序的特點

第一種思路就是笨辦法 給二維數組逐個來個遍歷查找出來

第二種思路就是 根據梯度判斷  對於該數組中的左下角的值,按行向右的值都比它大,按列向上的值都比它小。(或者右上角的 值 ,按行向左的值都比它小,按列向下的值都比它大。)選定左下角或者右上角的值 與所要找的值進行比較,然後根據大小關係,依次移動比較對象。

第三種思路就是首先根據行有序的關係進行大小判斷,對每行來個二分查找,如果找不到,就移動所在的行。

#第一種

public class Solution {
  public boolean Find(int target, int [][] array) {
       boolean flag=false;
		
       for(int i=0;i<array.length;i++)
       {
    	   for(int j=0;j<array[i].length;j++)
    	   {
    		   if(array[i][j]==target)
    		   {
    			   flag=true;
    			   return flag;   
    		   }
    	   }
       }
		
       return flag;
	 }
}

#第二種

public class Solution {
    public boolean Find(int [][] array,int target) {
        int row=0;
        int col=array[0].length-1;
        while(row<=array.length-1&&col>=0){
            if(target==array[row][col])
                return true;
            else if(target>array[row][col])
                row++;
            else
                col--;
        }
        return false;
 
    }
}

#第三種

public class Solution {
    public boolean Find(int [][] array,int target) {
         
        for(int i=0;i<array.length;i++){
            int low=0;
            int high=array[i].length-1;
            while(low<=high){
                int mid=(low+high)/2;
                if(target>array[i][mid])
                    low=mid+1;
                else if(target<array[i][mid])
                    high=mid-1;
                else
                    return true;
            }
        }
        return false;
 
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章