日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第k大的数 java_一道算法题:第K大的数

發布時間:2025/3/19 编程问答 13 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第k大的数 java_一道算法题:第K大的数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

給一個無序的包涵n個元素的數組,找出其中第k大的數(n > k)。

初看到這個題的時候,作為一個寫了一段時間java的人,立刻能想到的一種解法就是:

class Solution {

public int kthLargestElement(int k, int[] nums) {

Arrays.sort(nums);

return nums[nums.length - k];

}

};

時間復雜度時NlgN, 空間復雜度時O(1).

看起來貌似不錯,但既然這道題目被廣泛地討論,就肯定還有其他解法,比如說:

class Solution {

public int kthLargestElement(int k, int[] nums) {

// write your code here

PriorityQueue pq = new PriorityQueue<>();

for(int val : nums) {

pq.add(val);

if(pq.size() > k) {

pq.poll();

}

}

return pq.peek();

}

};

當然建堆需要額外的空間,而且時間復雜度上并沒有多少提升,所以不能算什么優化。

更好的一種解法是利用快速排序的劃分思想,這種解法是一種O(n)的解法

class Solution {

public int kthLargestElement(int k, int[] nums) {

//打亂數組避免最壞情況

shuffle(nums);

k = nums.length - k;

int lo = 0, hi = nums.length - 1;

while(lo < hi){

int j = partition(nums, lo, hi);

if(j < k){

lo = j + 1;

}else if(j > k){

hi = j - 1;

}else{

break;

}

}

return nums[k];

}

private int partition(int[] nums, int lo, int hi){

int i = lo;

int j = hi + 1;

while(true){

while(i < hi && nums[++i] < nums[lo]);

while(j > lo && nums[lo] < nums[--j]);

if(j <= i) break;

exch(nums, i, j);

}

exch(nums, lo, j);

return j;

}

private void exch(int[] nums, int i, int j){

int temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

private void shuffle(int a[]) {

Random random = new Random();

for(int ind = 1; ind < a.length; ind++) {

int r = random.nextInt(ind + 1);

exch(a, ind, r);

}

}

};

總結

以上是生活随笔為你收集整理的第k大的数 java_一道算法题:第K大的数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。