二維數組中的尋找 之 二分法

來源:互聯網
上載者:User
在一個二維數組中,每一行都按照從左至右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。例如下面的二維數組就是每行、每列都遞增排序。如果在這個數組中尋找數字7,則返回true;如果尋找數字5,由於數組不含有該數字,則返回false。 我的解題思路是這樣的矩陣行列都是從小到大排好序的,要尋找的話自然用二分效率比較高,而且這樣的矩陣有個性質,最左上方的元素必定是最小值,最右下角的是最大值,在一個n*n的矩陣中,對角線的元素也是排好序的,找到對角線上的一個元素,使得這個元素小於待尋找的key,並且下一元素大於待尋找的key,那麼只要在這個元素的左下角矩陣和右上方矩陣遞迴繼續對角線尋找就可以了,例如例子裡尋找7,只要找到對角線的元素4,然後遞迴尋找紅圈的矩陣就可以了,左上方矩陣最大值4<7,右下角矩陣最小值10>7,無需尋找了,但是此題並沒有告訴我們原始矩陣是n*n的,這是比較麻煩的地方,不過思路是一樣的,無非不能用對角線尋找這樣簡單的辦法了,假設m*n的矩陣,對角線尋找的辦法改進為i = (m1+m2)/2,j = (n1+n2)/2 進行尋找就可以了,(m1,n1)為矩陣最左上方元素下標,(m2,n2)為最右下角元素下標假設尋找17,第一次比較10,然後比較25,然後比較13,返回元素13,這時候再遞迴尋找13左下角的矩陣和右上方的矩陣就可以了(紅色橢圓部分);如果是尋找9,第一次比較10,然後比較4,然後比較6,返回元素6,這時候遞迴尋找6左下角的矩陣和右上方矩陣(綠色橢圓部分)代碼如下:a是二維數組首地址,(m1, n1)左上方座標,(m2, n2)右下角座標,參數n是矩陣一行的元素個數int binsearch(int value, int *a, int n, int m1, int n1, int m2, int n2)

{        int begin_m1 = m1, begin_n1 = n1, end_m2 = m2, end_n2 = n2;

        int left_result = 0,  right_result = 0;

        int i = (m1+m2)/2, j = (n1+n2)/2;        if (a == NULL)                return 0;

        if (value < *(a+m1*n+n1) || value > *(a+m2*n+n2))

                return 0;

        else if (value == *(a+m1*n+n1) || value == *(a+m2*n+n2))

                return 1;

 

        while ((i!=m1 || j!=n1) && (i!=m2 || j!=n2)){

                 if ( value == *(a+i*n+j) )

                         return 1;

                 else if ( value < *(a+i*n+j) ){

                         m2 = i;

                         n2 = j;

                         i = (i+m1)/2;

                         j = (j+n1)/2;

                  }

                 else{

                         m1 = i;

                         n1 = j;

                         i = (i+m2)/2;

                         j = (j+n2)/2;

                 }

           }

                     //search left & right

           if ( i<end_m2 )

                   left_result = binsearch(value, a, n, i+1, begin_n1, end_m2, j);

           if ( j<end_n2 )

                   right_result = binsearch(value, a, n, begin_m1, j+1, i, end_n2);

           if (left_result | right_result )

                   return 1;           else

                   return 0;

}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.