給定乙個二維陣列,二維陣列每一行每一列都是公升序排列的,現在要求用最低的時間複雜度,來判斷乙個數是否存在於該二維陣列中。
例如:1、3、5、6
2、5、7、9
4、6、8、10
查詢4是否在該二維陣列中。
思路:
一般有特殊解法,或者有最優解法的題目,都是來自於這道題目的資料狀況或者特殊問法,比如這道題,資料狀況比較特殊,因此,這道題的最優思路就應該是基於這個特殊的資料狀況來思考。
因此,此題目的最優解應該是從左下角或者右上角開始,比如就拿右上角來舉例,當右上角的數大於需要查詢的數時,說明什麼?說明該數下方的所有數都大於它,因此,就該往左移動一位。同理,如果小於這個數,就說明第一行的所有數都小於它,此時應該往下移動一位。這樣一來,最多隻需要遍歷:行數+列數 , 就能找到。所以,時間複雜度為o(m+n)
**:
public
static
boolean
geinum
(int
arr,
int num)
else
if(arr[r]
[c]else
}return
false
;}
給你乙個二維陣列,現在要求,二維陣列的每一行,左邊全是0,右邊全是1,也就是在每一行中,0不可能在1的右邊,現在給你乙個這樣的二維陣列,請你求出1最多的是哪一行?
思路
這種題目拿到之後,最先想到的就是遍歷一遍,那樣,時間複雜度就是o(n*m),因此,參考上題的思路,是否可以從乙個點出發,在二維陣列中跑,每次只能向左方或者下方移動一步就能求出結果,這樣的時間複雜度就是o(m+n)。
當然,放在一起總結,肯定是用同樣的思路解決的,從右上角開始,如果是1,就左移一位,直到左邊不是1停止,開始向下移動,相當於找到當前最左邊1的邊界,讓後向下移動,如果下面一直都是0,說明剛才的把一行就是最多1的一行,否則,如果發現某一行左邊還有1,就向左移動,反正就是左邊有1就向左,否則向下移動,記錄下前面最左邊1的行數,就能解決此題。
題目1 二維陣列中的查詢
時間限制 1 秒 記憶體限制 32 兆 特殊判題 否 提交 3174 解決 485 題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。輸入 輸入可能包含多個測試樣例,對於每個...
題目1384 二維陣列中的查詢
時間限制 1 秒記憶體限制 32 兆特殊判題 否提交 11118解決 2207 題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。輸入 輸入可能包含多個測試樣例,對於每個測試...
題目1384 二維陣列中的查詢
題目描述 在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入的第一行為兩個整數m和n 1 m,n 1000 代表將要輸入的矩陣的行...