AcWing之二维数组的查找
生活随笔
收集整理的這篇文章主要介紹了
AcWing之二维数组的查找
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目
在一個二維數組中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。 請完成一個函數,輸入這樣的一個二維數組和一個整數,判斷數組中是否含有該整數。樣例
輸入數組: [ [1,2,8,9], [2,4,9,12], [4,7,10,13], [6,8,11,15] ]如果輸入查找數值為7,則返回true, 如果輸入查找數值為5,則返回false。方法一:
(單調性掃描) O(n+m)O(n+m)
核心在于發現每個子矩陣右上角的數的性質:
如下圖所示,x左邊的數都小于等于x,x下邊的數都大于等于x
因此我們可以從整個矩陣的右上角開始枚舉,假設當前枚舉的數是 xx:
如果 xx 等于target,則說明我們找到了目標值,返回true;
如果 xx 小于target,則 xx 左邊的數一定都小于target,我們可以直接排除當前一整行的數;
如果 xx 大于target,則 xx 下邊的數一定都大于target,我們可以直接排序當前一整列的數;
排除一整行就是讓枚舉的點的橫坐標加一,排除一整列就是讓縱坐標減一。
當我們排除完整個矩陣后仍沒有找到目標值時,就說明目標值不存在,返回false。
時間復雜度分析
每一步會排除一行或者一列,矩陣一共有 nn 行,mm 列,所以最多會進行 n+mn+m 步。所以時間復雜度是 O(n+m)O(n+m)。
心得
記住這個矩陣的形狀即可
總結
以上是生活随笔為你收集整理的AcWing之二维数组的查找的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用python控制钉钉软件_Python
- 下一篇: 线性规划 - 用单纯形法解决LP问题 -