題目大意是給定乙個n*n的矩陣,每行從左到右和每列從上到下是遞增的序列,找出矩陣中第k小的數。
最簡單的方式是將矩陣中的數都放在乙個序列中,重新由小到大排序,然後輸出第k個數,暴力解法。
實現**:
class因為矩陣每行和每列都是有序的,可以使用二分查詢來進行;取矩陣中前後兩個數值的平均值來做查詢,平均值跟矩陣中的數做對比,從上到下,從右到左,假如平均值大於等於矩陣的某一行的第n個值那麼,那行就有n個數小於平均值,下一行就從第n個數開始比較,因為上一行的第n+1個數值比平均值大,下一行的肯定比平均值大,所以可以從第n個數開始;然後得到平均值比矩陣中的數大於等於的個數s,如果s大於等於k,最右邊的數值r=平均值,否則,最左邊的數值l=平均值+1;按照上述查詢s的個數,然後和k比較,直到r不再大於l,輸出l。solution
}sort(m, m+nnum);
return m[k-1
]; }
};
下面為部分流程的**:
例子:[[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上面的步驟有乙個問題需要講解一下:為什麼s大於等於k的時候r不是m-1,而是r=m?solution
else
}if(nsize >=k)
else
}return
nleft;}};
因為當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 此題用二分法。給定二維...