Problem 3:二維數組中的查找

1、題目描述

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。算法

2、思路分析

首先分析該數組的特色,在向下和向右方向上,數值會遞增。以二維數組中任意位置元素爲例,同行右側元素皆大於該點,同列下側元素皆大於該點,所以該點右下側元素皆大於該點。數組

clipboard.png

而右上側和左下側點均可能有大於該點的點,初步可認爲,大於該值的點位於右側和下側。
所以,咱們能夠根據該數組的特色進行逐行剔除,達到縮小範圍,查找目標值的目的。函數

算法思路

首先肯定初始點,因爲剔除某行/列,須要與目標值對比。初始點大於目標值,須要往小側移動;初始點小於目標值,須要往大側移動。而四個頂點,只有左下角和右下角,進行橫向和縱向移動能高效篩選和剔除行列。spa

選擇右上角爲初始點,執行下述操做
1)若是該點等於目標值,結束查找
2)若是該點小於目標值,往大側移動,下移一行(列索引不變)
3)若是該點大於目標值,往小側移動,左移一列(行索引不變)
重複上述過程,直到索引超過數組邊界。若是符合1,退出重複。這裏,咱們認爲本題找到目標值便可,無需查找是否有其餘位置的目標值。code

根據上述思路,經過向左下移動,達到整行或者整列的剔除,實現比較快速的查找。能夠把這個過程理解爲剝洋蔥,一層層剝開外層的非目標層,查找內部的目標值。blog

3、Java實現

源程序:排序

package jz_offer;

public class problem03
{
    /**
     * -查找二維數據arr中是否存在數值num
     * @param   arr:二維數組
     *            num:目標值
     * @return  在二維數組中是否找到了目標值num,返回類型boolean
     */
    public static boolean findNum(int[][] arr,int num){
        boolean flag=false;  //標誌位,爲true時表示找到目標值
        int i=0;
        int j=arr[0].length-1;
        while(flag!=true&&i<arr.length&&j>=0){
            if(arr[i][j]==num){
                flag = true;
                break;
            }else if(arr[i][j]<num){
                i++;
            }else{
                j--;
            }            
        }
        return flag;
    }
    public static void main(String[] args){
        int[][] array={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
        boolean found=findNum(array,7);
        System.out.println("if the num 7 is in the array?"+found);
    }    
}
相關文章
相關標籤/搜索