劍指Offer_4_二維數組中的查找
阿新 • • 發佈:2017-12-04
-h clu int() pre log urn static sca 區域
6 8 11 15
在這個數組中查找數字 9 , 則返回true 。 查找數子5 ,則返回false 。 分析 : 因為二位數組每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
通常的思路可能是比較對角線,但是如果要查找的數相對於當前位置可能在兩個區域出現,而且有重疊,
那就麻煩了。
所以一個更簡單的方法是選取數組右上角的數字(當前數),要查找的數(目標數),如果當前數大於目標數,因為列是 按從上到下遞增,那麽當前數所在的一列就可以排除掉了,令當前數行標減一,成為新的當前數,再去做比較。
例:
查找數字7
從右上角開始,當前數是9 , 9大於7 ,那麽9所在的列不可能有數7 , 此列排除 。
行標減一後生成新的二位數組,選定新的當前數8 , 8大於7 ,同理刪去此列 。
題目描述
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 例 : 1 2 8 9 2 4 9 12 4 7 10 136 8 11 15
在這個數組中查找數字 9 , 則返回true 。 查找數子5 ,則返回false 。 分析 : 因為二位數組每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
通常的思路可能是比較對角線,但是如果要查找的數相對於當前位置可能在兩個區域出現,而且有重疊,
當前數2 ,小於7 , 此時列表加一,去除第一行 。
當前數4 ,小於7 ,此時列表加一,去除第一行 。
當前數7 , 等於7 , 返回true。
下面分別列出c++和Java實現
c++ :
1 #include<bits/stdc++.h> 2 3 using namespace std ; 4 5 int main() 6 { 7 int a[4][4] = { 8 {1,2,8,9}, 9 {2,4,9,12}, 10 {4,7,10,13}, 11 {6,8,11,15}, 12 } ; 13 int n ; 14 cin >> n ; // 要查找的元素 15 int i=0 ; 16 int j=3 ; 17 while((i<=3)&&(j>=0)){ 18 if(a[i][j]>n){ 19 j-- ; 20 }else if(a[i][j]<n){ 21 i++ ; 22 }else if(a[i][j]==n){ 23 cout << "yes" <<endl ; 24 break ; 25 } 26 } 27 return 0 ; 28 }
Java:
1 import java.util.Scanner; 2 3 public class Find { 4 public static void main(String[] args) { 5 int a[][] = { 6 {1, 2, 8, 9}, 7 {2, 4, 9, 12}, 8 {4, 7, 10, 13}, 9 {6, 8, 11, 15}, 10 }; 11 int n ; 12 Scanner cin = new Scanner(System.in) ; 13 n = cin.nextInt() ; 14 int i=0 ; 15 int j=a.length - 1; 16 while((i<=3)&&(j>=0)){ 17 if(a[i][j]>n){ 18 j-- ; 19 }else if(a[i][j]<n){ 20 i++ ; 21 }else if(a[i][j]==n){ 22 System.out.println("yes"); 23 break ; 24 } 25 } 26 } 27 }
劍指Offer_4_二維數組中的查找