1. 程式人生 > >劍指Offer_4_二維數組中的查找

劍指Offer_4_二維數組中的查找

-h clu int() pre log urn static sca 區域

題目描述

在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。 例 : 1 2 8 9      2 4 9 12      4 7 10 13
     6 8 11 15
    在這個數組中查找數字 9 , 則返回true 。 查找數子5 ,則返回false 。  分析 : 因為二位數組每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。
     通常的思路可能是比較對角線,但是如果要查找的數相對於當前位置可能在兩個區域出現,而且有重疊,
     那就麻煩了。      所以一個更簡單的方法是選取數組右上角的數字(當前數),要查找的數(目標數),如果當前數大於目標數,因為列是 按從上到下遞增,那麽當前數所在的一列就可以排除掉了,令當前數行標減一,成為新的當前數,再去做比較。     例:          技術分享圖片 查找數字7       技術分享圖片 從右上角開始,當前數是9 , 9大於7 ,那麽9所在的列不可能有數7 , 此列排除 。       技術分享圖片 行標減一後生成新的二位數組,選定新的當前數8 , 8大於7 ,同理刪去此列 。

          技術分享圖片 當前數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_二維數組中的查找