摘要:因此我們可以采用部分元素堆排序即可。即我們每次只需要可能構(gòu)成第個元素的值進(jìn)行堆排序就可以了。
題目要求
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix. Note that it is the kth smallest element in the sorted order, not the kth distinct element. Example: matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15] ], k = 8, return 13. Note: You may assume k is always valid, 1 ≤ k ≤ n2.
在一個從左到右,從上到下均有序的二維數(shù)組中,找到從小到第k個數(shù)字,這里需要注意,不要求一定要是唯一的值,即假設(shè)存在這樣一個序列1,2,2,3,則第三個數(shù)字是2而不是3。
思路一:優(yōu)先隊列當(dāng)涉及到從一個集合中查找一個元素這樣的問題時,我們往往會立刻想到查找的幾種方式:有序數(shù)組查找,無序數(shù)組查找,堆排序。這里如果將二維數(shù)組轉(zhuǎn)化為一維有序數(shù)組,成本未免太大了。同理,將其中所有元素都轉(zhuǎn)化為堆,也會存在內(nèi)存不足的問題。因此我們可以采用部分元素堆排序即可。即我們每次只需要可能構(gòu)成第k個元素的值進(jìn)行堆排序就可以了。
public int kthSmallest(int[][] matrix, int k) { //優(yōu)先隊列 PriorityQueue思路二:二分法查找queue = new PriorityQueue (); //將每一行的第一個元素放入優(yōu)先隊列中 for(int i = 0 ; i { int x; int y; int value; public Tuple(int x, int y, int value) { this.x = x; this.y = y; this.value = value; } @Override public int compareTo(Tuple o) { // TODO Auto-generated method stub return this.value - o.value; } }
二分查找的核心問題在于,如何找到查找的上界和下屆。這邊我們可以矩陣中的最大值和最小值作為上界和下界。然后不停的與中間值進(jìn)行比較,判斷當(dāng)前矩陣中小于該中間值的元素有幾個,如果數(shù)量不足k,就將左指針右移,否則,就將右指針左移。直到左右指針相遇。這里需要注意,不能在數(shù)量等于k的時候就返回mid值,因為mid值不一定在矩陣中存在。
public int kthSmallest2(int[][] matrix, int k){ int low = matrix[0][0], high = matrix[matrix.length-1][matrix[0].length-1]; while(low <= high) { int mid = low + (high - low) / 2; int count = 0; int i = matrix.length-1 , j = 0; //自矩陣左下角開始計算比mid小的數(shù)字的個數(shù) while(i>=0 && j < matrix.length){ if(matrix[i][j]>mid) i--; else{ count+=i+1; j++; } } if(count < k) { low = mid + 1; }else{ high = mid - 1; } } return low; }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73264.html
摘要:先放一行,或一列把堆頂?shù)淖钚≡厝〕鰜恚〈危绻撚邢乱恍邢乱涣械模湃攵阎凶钚〉膫€元素已經(jīng)在上面的循環(huán)被完了,下一個堆頂元素就是 Problem Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in...
摘要:復(fù)雜度是,其中。這做法和異曲同工。看了網(wǎng)上給的解法,沒有二分,二分的是結(jié)果。每次找到一個,然后求比它小的元素的個數(shù),根據(jù)個數(shù)大于還是小于來二分。參考算的時候可以優(yōu)化 378. Kth Smallest Element in a Sorted Matrix 題目鏈接:https://leetcode.com/problems... 求矩陣?yán)锩娴趉小的數(shù),首先比較容易想到的是用heap來做...
Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix.Note that it is the kth smallest element in the sorted order, not the...
摘要:中序遍歷復(fù)雜度時間空間思路因為左節(jié)點小于根節(jié)點小于右節(jié)點,二叉搜索樹的一個特性就是中序遍歷的結(jié)果就是樹內(nèi)節(jié)點從小到大順序輸出的結(jié)果。這里采用迭代形式,我們就可以在找到第小節(jié)點時馬上退出。這樣我們就可以用二叉樹搜索的方法來解決這個問題了。 Kth Smallest Element in a BST Given a binary search tree, write a function...
摘要:解題思路本題需要找的是第小的節(jié)點值,而二叉搜索樹的中序遍歷正好是數(shù)值從小到大排序的,那么這題就和中序遍歷一個情況。 Kth Smallest Element in a BSTGiven a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You ...
閱讀 1718·2021-10-18 13:34
閱讀 3906·2021-09-08 10:42
閱讀 1551·2021-09-02 09:56
閱讀 1606·2019-08-30 15:54
閱讀 3127·2019-08-29 18:44
閱讀 3298·2019-08-26 18:37
閱讀 2212·2019-08-26 12:13
閱讀 454·2019-08-26 10:20