一組資料取前m個最大數及對應的索引

2021-08-01 22:20:40 字數 1041 閱讀 1708

一組資料長度n,取前m個最大數及對應的索引

思路:分為3種情況:取前m個最大數;只取第m個最大數;取前m個最大數及索引

情況1:取前m個最大數

(1) 取這組資料的前m個數,sort從小到大排序

(2) 迴圈這組資料的第m+1 到第n 個數

比對這個資料在(1)中的m個數的位置,有3種情況:小於等於最小值【捨棄】;大於等於最大值【插入最後,0位置刪除】;處於最大最小中間【二分法查詢位置,插入,0位置刪除】

得到結果為從小到大排序的前m個最大數

情況2:如果僅僅是求第m個最大數

當m比n/2小:可以直接取情況1返回的結果的第乙個數。

當m比n/2大:可以直接取情況1返回的結果的第乙個數。但是從效率角度出發,應該反過來考慮,取n-m+1個最小數,返回結果後取結果中最大的數。

取m個最小數的思路:

(1) 取這組資料的前m個數,sort從小到大排序

(2) 迴圈這組資料的第m+1 到第n 個數

比對這個資料在(1)中的m個數的位置,有3種情況:小於最小值【插入,0位置刪除】;大於等於最大值【捨棄】;處於最大最小中間【二分法查詢位置,插入,0位置刪除】

得到結果為從小到大排序的前m個最小數

情況3:取前m個最大數及索引【其中要求相同資料的索引要從大到小】

思路同情況1。注意下面幾點:

(1) 前m個數,用二叉樹排序。並記錄index變化。

(2) 迴圈m+1到n時,比對這個資料在(1)中的m個數的位置,有4種情況:小於等於最小值【捨棄】;大於最大值【插入最後,0/1位置刪除】;等於最大值,插【入倒數第2位置,0/1位置刪除】;處於最大最小中間【二分法查詢位置,插入,0/1位置刪除】,並記錄index變化

特別要注意0/1位置刪除時,如果0位置跟1位置的資料相同,那要比對index的大小,刪除index大的,可能是0位置也可能是1位置。

(3)獲得結果後,對於相同資料的index需要再次排序

遍歷m個點,對相同資料進行分組,對於分組中的index,排序。更新前2步獲得的結果。

得到結果為從小到大排序的前m個最大數,相同資料的索引從大到小。

對一組資料進行排序

如果有這種可能的話,三路快排是最好的選擇。是否大部分資料距離它的正確的位置很近?是否近乎有序?如果這樣,插入排序是很好的選擇。是否資料取值的範圍非常有限?比如對學生的成績排序。如果這樣,計數排序是很好的選擇 對排序有什麼額外的要求?是否需要穩定的排序?如果是的話,歸併排序是更好的選擇,快排就不行了。...

k個一組翻轉鍊錶

題目描述 給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5當 k 2 時,應當返回 2 1 4 3 5當 k 3 時,應當返回 3 2 1...

LeetCode k個一組翻轉鍊錶

給出乙個鍊錶,每 k 個節點一組進行翻轉,並返回翻轉後的鍊錶。k 是乙個正整數,它的值小於或等於鍊錶的長度。如果節點總數不是 k 的整數倍,那麼將最後剩餘節點保持原有順序。示例 給定這個鍊錶 1 2 3 4 5 當 k 2 時,應當返回 2 1 4 3 5 當 k 3 時,應當返回 3 2 1 4 ...