国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

力扣刷題之優(yōu)先隊(duì)列

這篇具有很好參考價(jià)值的文章主要介紹了力扣刷題之優(yōu)先隊(duì)列。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

前言:優(yōu)先隊(duì)列底層是由大根堆或小根堆數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的。

前K個(gè)高頻元素

347.?前 K 個(gè)高頻元素

給你一個(gè)整數(shù)數(shù)組?nums?和一個(gè)整數(shù)?k?,請(qǐng)你返回其中出現(xiàn)頻率前?k?高的元素。你可以按?任意順序?返回答案。

示例 1:

輸入: nums = [1,1,1,2,2,3], k = 2
輸出: [1,2]

示例 2:

輸入: nums = [1], k = 1
輸出: [1]

題目解讀:題目的要求是要我們找出在一個(gè)數(shù)組中找出k個(gè)出現(xiàn)頻率最多的元素。

剛看到這個(gè)題目時(shí)候,直接冒出一個(gè)解決思路,就是利用桶排序的思想,?定義一個(gè)很大長(zhǎng)度的數(shù)組,數(shù)組哪個(gè)位置有數(shù),那就在哪個(gè)下標(biāo)所在位置加一,然后排序,取出前k個(gè)最大值。


但是,如果利用這種思想來(lái)做題,直接大大浪費(fèi)了很多的空間,還有一些沒有必要的時(shí)間。

所有就引出了哈希表這個(gè)數(shù)據(jù)結(jié)構(gòu)。我們可以把數(shù)組中出現(xiàn)的元素值作為哈希表的key值,然后出現(xiàn)的頻率作為它的value,在遍歷一遍數(shù)組之后,哈希表已經(jīng)存儲(chǔ)完畢了,再將哈希表進(jìn)行排序,就可以得到前k個(gè)最大元素了。

public class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] ak = new int[k];
        int cnt = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        int len = nums.length;

        for (int i = 0; i < len; i++) {
            map.put(nums[i], map.getOrDefault(nums[i], 0) + 1);
        }

        // 根據(jù)哈希表的Value值進(jìn)行的排序
        List<Map.Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
        list.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));

        for (int i = 0; i < k; i++) {
            ak[cnt++] = list.get(i).getKey();
        }

        return ak;
    }
}

雖說這樣就可以做完了,但是它的時(shí)間復(fù)雜度是O(n*k),我們并不滿足如此,如果使用優(yōu)先隊(duì)列,我們就可以將時(shí)間復(fù)雜度減少到O(n*logk)。如果k越大,兩者時(shí)間復(fù)雜度還會(huì)更大。

大根堆其實(shí)是一顆二叉樹,是一顆二叉平衡樹,它的根結(jié)點(diǎn)就是最大的數(shù),左邊結(jié)點(diǎn)會(huì)小于右邊結(jié)點(diǎn)。

public class Solution {
    public int[] topKFrequent(int[] nums, int k) {
        int[] ak = new int[k];
        HashMap<Integer, Integer> map = new HashMap<>();
        //這里是大頂堆
        // PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair2[1]-pair1[1]);

        //小根堆
         PriorityQueue<int[]> pq = new PriorityQueue<>((pair1, pair2)->pair1[1]-pair2[1]);
        for(int num : nums){
            map.put(num, map.getOrDefault(num,0) +1);   //default
           
        }
        for(Map.Entry<Integer,Integer> entry : map.entrySet()){
            // pq.add(new int[]{entry.getKey(),entry.getValue()});
              if(pq.size()<k){//小頂堆元素個(gè)數(shù)小于k個(gè)時(shí)直接加
                pq.add(new int[]{entry.getKey(),entry.getValue()});
            }else{
                if(entry.getValue()>pq.peek()[1]){
                    //當(dāng)前元素出現(xiàn)次數(shù)大于小頂堆的根結(jié)點(diǎn)(這k個(gè)元素中出現(xiàn)次數(shù)最少的那個(gè))
                    pq.poll();
                    //彈出隊(duì)頭(小頂堆的根結(jié)點(diǎn)),即把堆里出現(xiàn)次數(shù)最少的那個(gè)刪除,留下的就是出現(xiàn)次數(shù)多的了
                    pq.add(new int[]{entry.getKey(),entry.getValue()});
                }
            }
        }
        for(int i =k-1;i >=0 ;i--){
            ak[i] = pq.poll()[0];
        }

        return ak;
    }
}

滑動(dòng)窗口最大值

239.?滑動(dòng)窗口最大值

給你一個(gè)整數(shù)數(shù)組?nums,有一個(gè)大小為?k?的滑動(dòng)窗口從數(shù)組的最左側(cè)移動(dòng)到數(shù)組的最右側(cè)。你只可以看到在滑動(dòng)窗口內(nèi)的?k?個(gè)數(shù)字。滑動(dòng)窗口每次只向右移動(dòng)一位。

返回?滑動(dòng)窗口中的最大值?。

示例 1:

輸入:nums = [1,3,-1,-3,5,3,6,7], k = 3
輸出:[3,3,5,5,6,7]
解釋:
滑動(dòng)窗口的位置                最大值
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

示例 2:

輸入:nums = [1], k = 1
輸出:[1]

?如果做完第一題,直接來(lái)做第二題的,肯定第一秒想到的是直接使用循環(huán)+大根堆來(lái)實(shí)現(xiàn),那真的能實(shí)現(xiàn)嗎?we can try

?

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        
        int cnt = 0;
        int len = nums.length;
        int[] ans = new int[len - k +1 ];
        for(int i=0;i <= len-k;i++){
            PriorityQueue<Integer> pq = new PriorityQueue(k, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2.compareTo(o1);
            }
            });;
            for(int j = i;j < i+k ; j++)
                pq.add(nums[j]);

            ans[cnt++] = pq.poll();
        }
        return ans;
    }
}

力扣刷題之優(yōu)先隊(duì)列,leetcode,算法,職場(chǎng)和發(fā)展

直接一整個(gè)時(shí)間超限了。

那這個(gè)題目要怎么來(lái)做呢?

class myQueue{
    Deque<Integer> deque = new LinkedList<>();
    void poll(int val){
        if(!deque.isEmpty() && deque.peek() == val)
            deque.poll();
    }

    void add(int val){
        while (!deque.isEmpty() && val > deque.getLast()) {
            deque.removeLast();
        }
        deque.add(val);
    }

    int peek(){
        return deque.peek();
    }

}

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
          if (nums.length == 1) {
            return nums;
        }
        int len = nums.length - k + 1;
        //存放結(jié)果元素的數(shù)組
        int[] res = new int[len];
        int cnt = 0;

        myQueue myQueue = new myQueue();
        //先將前k的元素放入隊(duì)列
        for (int i = 0; i < k; i++) {
            myQueue.add(nums[i]);
        }
        res[cnt++] = myQueue.peek();
        for (int i = k; i < nums.length; i++) {
            //滑動(dòng)窗口移除最前面的元素,移除是判斷該元素是否放入隊(duì)列
            myQueue.poll(nums[i - k]);
            //滑動(dòng)窗口加入最后面的元素
            myQueue.add(nums[i]);
            //記錄對(duì)應(yīng)的最大值
            res[cnt++] = myQueue.peek();
        }
        return res;
    }
}

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-744803.html

到了這里,關(guān)于力扣刷題之優(yōu)先隊(duì)列的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【leetcode 力扣刷題】移除鏈表元素 多種解法

    【leetcode 力扣刷題】移除鏈表元素 多種解法

    題目鏈接:203.移除鏈表元素 題目?jī)?nèi)容: 理解題意:就是單純的刪除鏈表中所有值等于給定的val的節(jié)點(diǎn)。上一篇博客中介紹了鏈表的基礎(chǔ)操作,在刪除鏈表中節(jié)點(diǎn)時(shí),需要注意的是頭節(jié)點(diǎn): 如果沒有虛擬頭節(jié)點(diǎn),那么對(duì)頭節(jié)點(diǎn)的刪除需要做不同的處理,head = head-next; 如果有

    2024年02月12日
    瀏覽(25)
  • 【leetcode 力扣刷題】鏈表基礎(chǔ)知識(shí) 基礎(chǔ)操作

    【leetcode 力扣刷題】鏈表基礎(chǔ)知識(shí) 基礎(chǔ)操作

    在數(shù)據(jù)結(jié)構(gòu)的學(xué)習(xí)過程中,我們知道線性表【一種數(shù)據(jù)組織、在內(nèi)存中存儲(chǔ)的形式】是線性結(jié)構(gòu)的,其中線性表包括順序表和鏈表。數(shù)組就是順序表,其各個(gè)元素在內(nèi)存中是連續(xù)存儲(chǔ)的。 鏈表則是由 數(shù)據(jù)域 和 指針域 組成的 結(jié)構(gòu)體 構(gòu)成的,數(shù)據(jù)域是一個(gè)節(jié)點(diǎn)的數(shù)據(jù),指針域

    2024年02月12日
    瀏覽(22)
  • 【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動(dòng)態(tài)規(guī)劃)

    【leetcode 力扣刷題】回文串相關(guān)題目(KMP、動(dòng)態(tài)規(guī)劃)

    題目鏈接:5. 最長(zhǎng)回文子串 題目?jī)?nèi)容: 題目就是要我們找s中的回文子串,還要是最長(zhǎng)的。其實(shí)想想,暴力求解也行……就是遍歷所有的子串,同時(shí)判斷是不是回文串,是的話再和記錄的最大長(zhǎng)度maxlen比較,如果更長(zhǎng)就更新。時(shí)間復(fù)雜度直接變成O(n^3)。 優(yōu)化的點(diǎn)在于,假設(shè)子

    2024年02月09日
    瀏覽(27)
  • 【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP!?。? decoding=

    【leetcode 力扣刷題】字符串匹配之經(jīng)典的KMP?。?!

    以下是能用KMP求解的算法題,KMP是用于字符串匹配的經(jīng)典算法【至今沒學(xué)懂………啊啊啊】 題目鏈接:28. 找出字符串中第一個(gè)匹配項(xiàng)的下標(biāo) 題目?jī)?nèi)容: 題意還是很好理解的,要在字符串haystack中查找一個(gè)完整的needle,即字符串匹配。 暴力求解就是用 兩層循環(huán) :haystack從第

    2024年02月09日
    瀏覽(33)
  • 【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    【leetcode 力扣刷題】字符串翻轉(zhuǎn)合集(全部反轉(zhuǎn)///部分反轉(zhuǎn))

    題目鏈接:344. 反轉(zhuǎn)字符串 題目?jī)?nèi)容: 題目中重點(diǎn)強(qiáng)調(diào)了必須 原地修改 輸入數(shù)組,即不能新建一個(gè)數(shù)組來(lái)完成字符串的反轉(zhuǎn)。我們注意到: 原來(lái)下標(biāo)為0的,反轉(zhuǎn)后是size - 1【原來(lái)下標(biāo)是size - 1的,反轉(zhuǎn)后是0】; 原來(lái)下標(biāo)是1的,反轉(zhuǎn)后是size - 2【原來(lái)下標(biāo)是size -2的,反轉(zhuǎn)后

    2024年02月11日
    瀏覽(33)
  • 力扣刷題-動(dòng)態(tài)規(guī)劃算法3:完全背包問題

    力扣刷題-動(dòng)態(tài)規(guī)劃算法3:完全背包問題

    問題描述: 1)有N件物品和一個(gè)最多能背重量為W的背包。第i件物品的重量是weight[i],得到的價(jià)值是value[i] 。 2) 每件物品都有無(wú)限個(gè)(也就是可以放入背包多次) (比0-1背包多出的條件) 3) 求解將哪些物品裝入背包里物品價(jià)值總和最大。 求解步驟: 1)首先遍歷物品,然

    2023年04月13日
    瀏覽(136)
  • 【leetcode 力扣刷題】數(shù)學(xué)題之除法:哈希表解決商的循環(huán)節(jié)?快速乘求解商

    【leetcode 力扣刷題】數(shù)學(xué)題之除法:哈希表解決商的循環(huán)節(jié)?快速乘求解商

    題目鏈接:166. 分?jǐn)?shù)到小數(shù) 題目?jī)?nèi)容: 題目是要我們把一個(gè)分?jǐn)?shù)變成一個(gè)小數(shù),并以字符串的形式返回。按道理,直接將分子numerator除以分母denominator就得到了小數(shù),轉(zhuǎn)換成string返回就好。題目要求里指出了特殊情況—— 小數(shù)部分如果有循環(huán),就把循環(huán)節(jié)括在括號(hào)里 。 那么

    2024年02月10日
    瀏覽(21)
  • 力扣刷題之旅:高級(jí)篇(六)—— 網(wǎng)絡(luò)流算法:Edmonds-Karp 算法與實(shí)際應(yīng)用

    力扣刷題之旅:高級(jí)篇(六)—— 網(wǎng)絡(luò)流算法:Edmonds-Karp 算法與實(shí)際應(yīng)用

    ?????????? 力扣(LeetCode) 是一個(gè)在線編程平臺(tái),主要用于幫助程序員提升算法和數(shù)據(jù)結(jié)構(gòu)方面的能力。以下是一些力扣上的入門題目,以及它們的解題代碼。 ? ? ???????? 目錄 引言? 一、Edmonds-Karp 算法簡(jiǎn)介 二、算法實(shí)現(xiàn) 下面是使用 Python 實(shí)現(xiàn)的 Edmonds-Karp 算法:

    2024年02月22日
    瀏覽(17)
  • 力扣刷題:刪除重復(fù)元素

    當(dāng)處理排序數(shù)組時(shí),刪除重復(fù)元素是一個(gè)常見的問題。首先,我們來(lái)看一下如何解決這個(gè)問題,然后再進(jìn)一步討論如何處理允許最多重復(fù)兩次的情況。 問題描述:給定一個(gè)已排序的數(shù)組,刪除重復(fù)的元素,使得每個(gè)元素只出現(xiàn)一次,并返回新的長(zhǎng)度。 使用雙指針方法。一個(gè)

    2024年02月13日
    瀏覽(23)
  • 力扣刷題 - 數(shù)組篇

    力扣刷題 - 數(shù)組篇

    https://leetcode.cn/problems/max-consecutive-ones/ 暴力解法: 定義一個(gè)變量來(lái)統(tǒng)計(jì)是否連續(xù) https://leetcode.cn/problems/teemo-attacking/ 暴力解法: 記錄每次中的開始時(shí)間與結(jié)束時(shí)間, 然后如果下一次中毒的是在結(jié)束時(shí)間之前, 就去更新開始時(shí)間(讓它加上這個(gè)持續(xù)時(shí)間減去結(jié)束時(shí)間),如果是在之后

    2024年02月16日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包