題目:
在乙個 n * m 的二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。
示例:現有矩陣 matrix 如下:
[[1, 4, 7, 11, 15],
[2, 5, 8, 12, 19],
[3, 6, 9, 16, 22],
[10, 13, 14, 17, 24],
[18, 21, 23, 26, 30]
]給定 target = 5,返回 true。
給定 target = 20,返回 false。
限制:0 <= n <= 1000
0 <= m <= 1000
首先最先想到的暴力方法是通過遍歷整個二維陣列,通過每個元素與目標值比對來判斷目標值是否在陣列中。不過由於題目給定的限制條件是n(0-1000)、m(0-1000),所以考慮到演算法的時間複雜度,這種方法不可用。
然後通過題目可知,矩陣的行和列都是遞增的,因此我們可以想到從矩陣的右上角的第乙個元素開始,通過元素與目標值進行比對,若目標值小於當前元素,那麼讓當前元素在當前行左移一位;若目標值大於當前元素,那麼讓當前元素在當前列下移一位;
如下圖所示:假設目標值target=16,而右上角第乙個元素為15.由於15<16,故讓元素從當前列下移一位再進行判斷。
下移後的效果圖如下所示:
可以看到下移後19>16,於是讓元素從當前行向左移動一位再進行判斷。
到這裡可以發現12<16,故讓元素從當前列下移一位再進行判斷。
這個例子可以發現下一步就能找到與目標值匹配的元素,所以返回true;如果通過迴圈條件判斷,當元素移出了矩陣邊界還沒有找到匹配項,那麼返回false,表示矩陣無與目標值匹配到的元素。
**如下(示例):
class
solution
//獲取矩陣的行、列
int n=matrix.
size()
;int m=matrix[0]
.size()
;//從矩陣的右上角第乙個元素開始
int i=
0,j=m-1;
//判斷邊界條件
while
(i=0)
//如果當前元素的值小於目標值,則向下移動一位再進行判斷
else
if(target>matrix[i]
[j])
//若兩者相等,則直接返回true
else
}return
false;}
};
執行用時:52 ms, 在所有 c++ 提交中擊敗了94.98%的使用者
記憶體消耗:13 mb, 在所有 c++ 提交中擊敗了86.58%的使用者
二維陣列中的查詢 C
class solution if array i j target if array i j target if flag true return false else return true 個人總結 這裡有三個地方需要注意 1 用vector表示二位陣列的表示方法 vector array 注...
二維陣列中查詢
1.問題描述 在乙個二維陣列中,每一行按照從左到右的遞增順序排序,每一列按照從上到下的遞增的順序排序,請完成這樣乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列是否含有該整數。來自 劍指offer 2.分析 首先選取陣列中右上角的數字。如果該數字等於要查詢的數字,查詢過程結束 如果該數字大於要查...
二維陣列中查詢
乙個二維陣列,每一行從左到右,每一列從上到下,都是按遞增順序排列,輸入乙個二維陣列和某個數,判斷陣列中是否存在這個數 排除行和列 比如從右上角元素出發。先確定列的範圍,如果查詢數大於當前列的第一行數,那麼這一行的所有數都大於查詢數,排除,繼續查詢左邊列 確定行範圍,在前面列的範圍內,如果最右邊元素小...