剑指offer——(1)二维数组的查找

版权声明:本文自由转载,转载请注明出处。 https://blog.csdn.net/qq_38071429/article/details/83787726

自从一年前数据结构之后,很久没做这类题了,最好能每天一道!

三个思路吧 

public class Solution {
/*
    思路1:看错题目,以为用一维数组存储就可以直接用二分查找。。就当做复习快排了,然而现实
    是我的快排(注释部分)在牛客网上超时了 超时了... 于是我随便找了个快排算法,就行! 
*/
    boolean boo = false;
    public boolean Find(int target, int [][] array) {   
        int k=0,arr[] = new int[array[0].length*array.length];       
        for(int i=0;i<array.length;i++){
            for(int j=0;j<array[0].length;j++){
                arr[k] = array[i][j];              
                k++;
            }
        }
        
        others_QS(arr,0);
        
        int start = 0,end = k-1;
        int temp = end;
        while(start<=end&&start<k&&end>=0){            
            if(target==arr[temp]){
                boo = true;  
                break;
            } 
            if(target<arr[temp]){
                end = end-1;               
            }
            if(target>arr[temp]){
                start = start+1;
            }     
            temp = end;
        }
        if(boo==true) return true;
        else return boo;   
    
    }
    
    void others_QS(int[] arr,int l) {
        if(l >= arr.length) return;
        int j = l + 1;
        for (int i = l; i < arr.length; i++) {
            if(j >= arr.length) break;
            if(arr[i] < arr[j]){
                int temp = arr[i];
                arr[i] = arr[j];
                arr[j] = temp;
            }
            j++;
        }
        if(j <= arr.length){            
            int temp2 = arr[l];
            arr[l] = arr[j-1];
            arr[j-1] = temp2;
        }
        others_QS(arr, ++l);
    }     
   
/*
     void my_QS(int x,int y){
		if(x>=y) return;
		int i = x,j = y;
		while(i<=j){
			while(i<=j && arr[i]<=arr[x]) i++;
			while(i<=j && arr[j]>arr[x]) j--;
			if(i<=j){
				int temp = arr[i];
				arr[i] = arr[j];
				arr[j] = temp;
				i++;j--;	
				}
			else {
				int temp = arr[j];
				arr[j] = arr[x];
				arr[x] = temp;
			}
		}
		QSort(0,j-1);
		QSort(i,y);
	}
*/

}
public class Solution {
/*
    思路2:暴力循环之。。
*/
    public boolean Find(int target, int [][] array) {
        boolean boo = false;
        for(int i=0;i<array.length;i++){
            for(int j=0;j<array[0].length;j++){
                if(target==array[i][j]){
                    boo = true;
                }
            }
        }
        if(boo==true) return true;
        else return boo;
    }
}
public class Solution {  
/*
    思路3:二维数组每行从左到右且每列从上到下排好序,所以我们选择从二维数组的左下角
    array[array.length-1][0]开始查找,如果要找的数字小于array[array.length-1][0],
    则纵坐标上移;如果要找的数字大于array[array.length-1][0],则横坐标右移。
*/   
    public boolean Find(int target, int [][] array) {          
        for(int i = array.length-1,j=0;i>=0&&j<array[0].length;){
            if(target<array[i][j]){
                i--;
                continue;
            }
            if(target==array[i][j]){
                return true;
            } 
            if(target>array[i][j]){
                j++;
                continue;
            }
        }
        return false;
       }
}

猜你喜欢

转载自blog.csdn.net/qq_38071429/article/details/83787726