第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

優(yōu)化程序以找到數(shù)組中的第 k 個(gè)最小元素(Java,預(yù)期時(shí)間復(fù)雜度 O(n))

優(yōu)化程序以找到數(shù)組中的第 k 個(gè)最小元素(Java,預(yù)期時(shí)間復(fù)雜度 O(n))

人到中年有點(diǎn)甜 2023-02-23 15:50:53
問(wèn):給定一個(gè)數(shù)組 arr[] 和一個(gè)數(shù)字 K,其中 K 小于數(shù)組的大小,任務(wù)是在給定數(shù)組中找到第 K 個(gè)最小的元素。假設(shè)所有數(shù)組元素都是不同的。我已經(jīng)瀏覽了與這個(gè)問(wèn)題相關(guān)的所有帖子,但沒(méi)有一個(gè)能幫助我解決時(shí)間復(fù)雜度問(wèn)題。我是編碼新手,很難優(yōu)化我的解決方案。預(yù)期時(shí)間復(fù)雜度為 O(n)這是我的函數(shù),時(shí)間復(fù)雜度為 O(nlogn):public static void smallestk(int arr[],int k){    Arrays.sort(arr);    System.out.println(arr[k-1]);}輸出是正確的,但我想將我的代碼從 O(nlogn) 優(yōu)化到 O(n)
查看完整描述

1 回答

?
侃侃爾雅

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊

這個(gè)問(wèn)題的最佳情況是 O(nlogk),我們可以使用最大或最小堆數(shù)據(jù)結(jié)構(gòu)來(lái)解決這個(gè)問(wèn)題。如果 k 很小,這將接近 O(n)。這個(gè)想法是我們不必對(duì)整個(gè)數(shù)組進(jìn)行排序,而是取一個(gè)大小為 k 的堆,并始終對(duì)堆中存在的 k 個(gè)元素進(jìn)行排序。

  1. O(n) 遍歷數(shù)組

  2. O(logk) 用于使用堆排序?qū)?k 個(gè)元素進(jìn)行排序。

public Integer getKthEle(Integer[] numbers, int k) {


PriorityQueue<Integer> maxHeap = new PriorityQueue(k, new Comparator<Integer>() {


    public int compare(Integer a, Integer b) {

        return b-a;

    }


    }

);


for(int i=0;i<k;i++) {

    maxHeap.offer(numbers[i]);

}

// maintain the size k by adding to the queue if the next element is smaller than the head of the queue; remove from the head of the queue which is the largest element in the queue

for(int i=k;i<numbers.length;i++) {

    if(numbers[i] < maxHeap.peek()) {

        maxHeap.offer(numbers[i]);

        maxHeap.poll();

    } 

}



return maxHeap.peek();

}


查看完整回答
反對(duì) 回復(fù) 2023-02-23
  • 1 回答
  • 0 關(guān)注
  • 116 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)