找到第k個最大的數

2021-07-29 14:52:53 字數 1442 閱讀 7442

一、問題描述

給定乙個陣列,陣列中的資料無序,在乙個陣列中找出其第k個最小的數,例如對於陣列x,x = ,則其第2個最小的數為2。

二、解題思路

本演算法跟快排的思想相似,首先在陣列中選取乙個數centre作為樞紐,將比centre小的數,放到centre的前面將比centre大的數,放到centre的後面。如果此時centre的位置剛好為k,則centre為第k個最小的數;如果此時centre的位置比k前,則第k個最小數一定在centre後面,遞迴地在其右邊尋找;如果此時centre的位置比k後,則第k個最小數一定在centre後面,遞迴地在其左邊尋找。

注意:centre的位置=其下標值+1,因為陣列中的第乙個元素的下標為0。

從上面的描述中,我們可以看到這個演算法運用了減治的方法求解。減治的思想與分治非常相似,同樣是在一次操作中,削減問題的規模,只是分治把每個子問題求解後,要合併每個子問題的解才能得到問題,而減治的方法,卻不用合併子問題的解,子問題的解,直接就是原問題的解。舉個例子來說,就像快排和二分查詢演算法,前者是分治,後者是減治。因為快排要等到所有的子陣列都排完序,原陣列才有序,而二分查詢卻不用,它每執行一次查詢,直接丟棄一半的陣列,而不用合併子問題的解。不過也有不少書,把他們都歸為分治法。

/*** 輸入n個整數,找出其中最小的k個整數,找出其中最小的k個數。

* 例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字為1,2,3,4

*/public

class

e30kleastnumbers   

arr[left] = arr[right];  

while

(left < right && arr[left] < result)   

arr[right] = arr[left];  

}  arr[left] = result;  

return

left;  

}  public

int getleastnumbers(

int input,

intk)  

else

}  for(

inti = 0;i

output[i] = input[i];  

}  return

output;  

}  public

static

void

main(string args);  

e30kleastnumbers test = new

e30kleastnumbers();  

int output=test.getleastnumbers(arr, 

4);  

for(

inti = 0;i

system.out.print(output[i]+","

);  

}  }  

}  

第K個最大的數

思路一 暴力破解,無序陣列排序,排完序之後找到第k個最大的數,排序方法有多種,但是無序陣列排序快排時間複雜度比較低是o nlogn 思路二 快速選擇 快速選擇是在快速排序的基礎上進行的優化,快速選擇是把找到的基準點與要找的第k個數的下標做比較,如果正好是第k個最大的數直接返回即可,如果是比基準點大則...

演算法 尋找第K個最大的數

解題思路 通過快速排序的思想方法,每次隨機獲取指定範圍內乙個樹的排序位置,然後根據這個位置,再重新指定範圍,直到這個位置索引滿足k。class solution else index part nums,left,right return nums k public intpart int nums...

找到第N個醜數

把只包含因子2 3和5的數稱作醜數 ugly number 例如6 8都是醜數,但14不是,因為它包含因子7。習慣上我們把1當做是第乙個醜數。求按從小到大的順序的第n個醜數。找到第n個醜數 方法1 存放num之前所有元素是否是醜數的flag int getuglynumber solution in...