兩道找第k小元素利口378 668

2021-10-04 23:29:00 字數 908 閱讀 7425

在乙個矩陣中找到第k小的元素,矩陣可包含重複值,每行,每列遞增。

利用二分法主要是要找到區間,並不斷縮小。區間又主要來自兩個地方:序列號和元素值,大部分都是依據陣列的序列號,也有小部分是通過元素值,本體就是。

l設為矩陣最小值,r為最大值

每次取其中值m,計算矩陣中小於m的元素的個數count

如果count小於k,說明m最多是第count小的,而第k小的元素肯定比m大,往m值後面找

否則,第k小的元素肯定小於等於m,往前面繼續找

public

intkthsmallest

(int

matrix,

int k)

//如果count小於k,說明m最多是第count小的,而第k小的元素肯定比m大,往m值後面找

//否則,第k小的元素肯定小於等於m,往前面繼續找

if(count < k)

l = m +1;

else

r = m;

}return l;

}

和上題幾乎一樣,只是矩陣換成了乙個乘法表,找第k小的元素。

首先乘法表是固定的,給出了m,n,k。我們就可以比較這幾個值的大小來縮小查詢範圍,比如m > k,那麼大於k的部分就沒有看的必要了,因為大於k的所有行肯定全都大於k

剩下的解題結構和上題也幾乎一樣,只不過每次迴圈算大於m的元素個數的計算方式發生了變化

public

intfindkthnumber

(int m,

int n,

int k)

if(count < k)

l = mid +1;

else

r = mid;

}return l;

}

找n個數字中第k小的元素

利用快速排序的方法尋找第k小的資料,該方法的時間複雜度平均為o n 可以滿足一般情況下的查詢演算法 include res代表開始查詢的元素的位址,n代表查詢的範圍,nth代表查詢該範圍內的第nth小的元素 int findnth int res,int n,int nth int i 0,j n ...

兩個有序數序列中找第k小

description 已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 分析 既然說明了分治,那肯定是劃分為子問題。又已經排好序,模擬於二分查詢,每次丟棄一半,我們可以將x的一半元素與y的一半元素合併...

17082 兩個有序數序列中找第k小(優先做)

已知兩個已經排好序 非減序 的序列x和y,其中x的長度為m,y長度為n,現在請你用分治演算法,找出x和y的第k小的數,演算法時間複雜度為o max 此題請勿採用將序列x和y合併找第k小的o m n 的一般方法,要充分利用x和y已經排好序的這一特性。第一行有三個數,分別是長度m 長度n和k,中間空格相...