LeetCode 378 有序矩陣中第K小的元素

2022-08-15 03:45:17 字數 2075 閱讀 8703

題目大意是給定乙個n*n的矩陣,每行從左到右和每列從上到下是遞增的序列,找出矩陣中第k小的數。

最簡單的方式是將矩陣中的數都放在乙個序列中,重新由小到大排序,然後輸出第k個數,暴力解法。

實現**:

class

solution

}sort(m, m+nnum);

return m[k-1

]; }

};

因為矩陣每行和每列都是有序的,可以使用二分查詢來進行;取矩陣中前後兩個數值的平均值來做查詢,平均值跟矩陣中的數做對比,從上到下,從右到左,假如平均值大於等於矩陣的某一行的第n個值那麼,那行就有n個數小於平均值,下一行就從第n個數開始比較,因為上一行的第n+1個數值比平均值大,下一行的肯定比平均值大,所以可以從第n個數開始;然後得到平均值比矩陣中的數大於等於的個數s,如果s大於等於k,最右邊的數值r=平均值,否則,最左邊的數值l=平均值+1;按照上述查詢s的個數,然後和k比較,直到r不再大於l,輸出l。

下面為部分流程的**:

例子:[[1,3,5],[2,3,6],[4,5,7]],找第k=4個小的數

l:最左邊的數值

r:最右邊的數值

m:l和r的平均值

s:矩陣中小於m的個數

x:當前行最右邊的位置

y:當前行位置

圖一:初始化資料,l=1,r=7,計算出m=4

圖二到六:進行平均值m與矩陣的數值做對比,圖二的matrix[y][x]=5比m=4大,x=x-1,比較前一位的數值;圖三matrix[y][x]=3比m=4小,則s加上第0行的個數,y=y+1,比較下一行;圖四matrix[y][x]=3比m=4小,則s加上第1行的個數,y=y+1,比較下一行;圖五matrix[y][x]=5比m=4大,x=x-1,比較前一位的數值;圖六matrix[y][x]=4與m=4相等,則s加上第1行的個數;完成矩陣的比較,得到最終的s。

圖七:s=5比k=4大,所以r=m=4

實現**:

class

solution

else

}if(nsize >=k)

else

}return

nleft;}};

上面的步驟有乙個問題需要講解一下:為什麼s大於等於k的時候r不是m-1,而是r=m?

因為當s==k的時候,有可能m就是等於矩陣中的某乙個值,加入m-1就會導致答案錯誤。

步驟1計算出s等於2,剛好跟k相等,m的值與陣列中的也剛好相等,如果m-1的話r就等於2,然後最終結果就變成2。假如矩陣中有多個相同的值,s有可能大於k,m與要求的數相等,也會出現最後錯誤答案。l能加1的原因是,l的s個數比k要少,所以+1有可能變成s==k,直到l==r。

leetcode 378 有序矩陣中第K小的元素

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。說明 你可以假設 k 的值永遠是有效的,1 k n2 class solut...

leetcode 378 有序矩陣中第K小的元素

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。說明 你可以假設 k 的值永遠是有效的,1 k n2 解題方法 使用優先佇列...

LeetCode 378 有序矩陣中第K小的元素

給定乙個 n x n 矩陣,其中每行和每列元素均按公升序排序,找到矩陣中第k小的元素。請注意,它是排序後的第k小元素,而不是第k個元素。示例 matrix 1,5,9 10,11,13 12,13,15 k 8,返回 13。說明 你可以假設 k 的值永遠是有效的,1 k n2 此題用二分法。給定二維...