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

算法沉淀——貪心算法七(leetcode真題剖析)

這篇具有很好參考價值的文章主要介紹了算法沉淀——貪心算法七(leetcode真題剖析)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

算法沉淀——貪心算法七(leetcode真題剖析),算法沉淀,算法,貪心算法,leetcode

01.整數(shù)替換

題目鏈接:https://leetcode.cn/problems/integer-replacement/

給定一個正整數(shù) n ,你可以做如下操作:

  1. 如果 n 是偶數(shù),則用 n / 2替換 n
  2. 如果 n 是奇數(shù),則可以用 n + 1n - 1替換 n 。

返回 n 變?yōu)?1 所需的 最小替換次數(shù) 。

示例 1:

輸入:n = 8
輸出:3
解釋:8 -> 4 -> 2 -> 1

示例 2:

輸入:n = 7
輸出:4
解釋:7 -> 8 -> 4 -> 2 -> 1
或 7 -> 6 -> 3 -> 2 -> 1

示例 3:

輸入:n = 4
輸出:2

提示:

  • 1 <= n <= 2^31 - 1

思路

這里我們要求得最小次數(shù),要進(jìn)行具體的分析討論,首先偶數(shù)只有一種情況,所以不必討論,若是奇數(shù)則分為一下三種情況:

1、n>1且n%3==1的時候,二進(jìn)制位后是……01,最優(yōu)的方式應(yīng)該選擇-1,這樣就可以把末尾的1去掉
2、n>3且n%3==3的時候,二進(jìn)制位后是……11,最優(yōu)的方式應(yīng)是選擇+1,這樣后續(xù)均為連續(xù)0,能夠更快趨近1
3、n==3時,變成1最優(yōu)操作數(shù)為2

代碼文章來源地址http://www.zghlxwxcb.cn/news/detail-842754.html

class Solution {
public:
    int integerReplacement(int n) {
        int ret=0;
        while(n>1){
            if(n%2==0){
                ret++;
                n/=2;
            }
            else
            {
                if(n==3){
                    ret+=2;
                    n=1;
                }
                else if(n%4==1){
                    ret+=2;
                    n/=2;
                }else{
                    ret+=2;
                    n=n/2+1;
                }
            }
        }
        return ret;
    }
};

02.俄羅斯套娃信封問題

題目鏈接:https://leetcode.cn/problems/russian-doll-envelopes/

給你一個二維整數(shù)數(shù)組 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 個信封的寬度和高度。

當(dāng)另一個信封的寬度和高度都比這個信封大的時候,這個信封就可以放進(jìn)另一個信封里,如同俄羅斯套娃一樣。

請計算 最多能有多少個 信封能組成一組“俄羅斯套娃”信封(即可以把一個信封放到另一個信封里面)。

注意:不允許旋轉(zhuǎn)信封。

示例 1:

輸入:envelopes = [[5,4],[6,4],[6,7],[2,3]]
輸出:3
解釋:最多信封的個數(shù)為 3, 組合為: [2,3] => [5,4] => [6,7]。

示例 2:

輸入:envelopes = [[1,1],[1,1],[1,1]]
輸出:1

提示:

  • 1 <= envelopes.length <= 105
  • envelopes[i].length == 2
  • 1 <= wi, hi <= 105

思路

重寫排序+貪心+二分的思想:

我們先按照左端點不同時升序排序,左端點相同時按右端點降序排序,這樣我們只需要考慮右端點,再使用貪心+二分就可以很好的解決這個問題

代碼

class Solution {
public:
    int maxEnvelopes(vector<vector<int>>& envelopes) {
        sort(envelopes.begin(),envelopes.end(),[&](const vector<int>& v1,const vector<int>& v2){
            return v1[0]!=v2[0]?v1[0]<v2[0]:v1[1]>v2[1];
        });

        vector<int> ret;
        ret.push_back(envelopes[0][1]);

        for(int i=1;i<envelopes.size();i++){
            int b=envelopes[i][1];
            if(b>ret.back()) ret.push_back(b);
            else{
                int left=0,right=ret.size()-1;
                while(left<right){
                    int mid=(left+right)/2;
                    if(ret[mid]>=b) right=mid;
                    else left=mid+1;
                }
                ret[left]=b;
            }
        }
        return ret.size();
    }
};

03.可被三整除的最大和

題目鏈接:https://leetcode.cn/problems/greatest-sum-divisible-by-three/

給你一個整數(shù)數(shù)組 nums,請你找出并返回能被三整除的元素最大和。

示例 1:

輸入:nums = [3,6,5,1,8]
輸出:18
解釋:選出數(shù)字 3, 6, 1 和 8,它們的和是 18(可被 3 整除的最大和)。

示例 2:

輸入:nums = [4]
輸出:0
解釋:4 不能被 3 整除,所以無法選出數(shù)字,返回 0。

示例 3:

輸入:nums = [1,2,3,4,4]
輸出:12
解釋:選出數(shù)字 1, 3, 4 以及 4,它們的和是 12(可被 3 整除的最大和)。

提示:

  • 1 <= nums.length <= 4 * 10^4
  • 1 <= nums[i] <= 10^4

思路

首先我們先將所有的值累加起來,那么就會有下面三種情況

1、剛好是3的倍數(shù),那么直接返回即可。
2、是3的倍數(shù)多1,那么我們找出除3的數(shù)中余1的最小的一個數(shù),用總和減去與除3的數(shù)中余2的最小的兩個數(shù),找出最大值即為所需
3、是3的倍數(shù)多2,那么我們找出除3的數(shù)中余2的最小的一個數(shù),用總和減去與除3的數(shù)中余1的最小的兩個數(shù),找出最大值即為所需

代碼

class Solution {
public:
    int maxSumDivThree(vector<int>& nums) {
        const int INF=0x3f3f3f3f;
        int sum=0,x1=INF,x2=INF,y1=INF,y2=INF;
        for(int& x:nums){
            sum+=x;
            if(x%3==1){
                if(x<x1) x2=x1,x1=x;
                else if(x<x2) x2=x;
            }else if(x%3==2){
                if(x<y1) y2=y1,y1=x;
                else if(x<y2) y2=x;
            }
        }

        if(sum%3==0) return sum;
        else if(sum%3==1) return max(sum - x1,sum-y1-y2);
        else return max(sum-y1,sum-x1-x2);
    }
};

04.距離相等的條形碼

題目鏈接:https://leetcode.cn/problems/distant-barcodes/

在一個倉庫里,有一排條形碼,其中第 i 個條形碼為 barcodes[i]。

請你重新排列這些條形碼,使其中任意兩個相鄰的條形碼不能相等。 你可以返回任何滿足該要求的答案,此題保證存在答案。

示例 1:

輸入:barcodes = [1,1,1,2,2,2]
輸出:[2,1,2,1,2,1]

示例 2:

輸入:barcodes = [1,1,1,1,2,2,3,3]
輸出:[1,3,1,3,2,1,2,1]

提示:

  • 1 <= barcodes.length <= 10000
  • 1 <= barcodes[i] <= 10000

思路

首先題目要求保證存在答案,我們只需將出現(xiàn)次數(shù)最多的那個數(shù)兩兩相隔放置,剩下的數(shù)接著兩兩相隔放置即可,關(guān)于剩下的數(shù)為什么也可以直接兩兩放置,這是因為我們可以通過鴿巢定理推出只有出現(xiàn)最多的數(shù)才會影響到相隔,而我們解決了出現(xiàn)次數(shù)最大的數(shù),所以剩下的數(shù)只要繼續(xù)按照兩兩相隔的順序繼續(xù)放置即可。

代碼

class Solution {
public:
    vector<int> rearrangeBarcodes(vector<int>& barcodes) {
        unordered_map<int,int> hash;
        int maxval=0,maxCount=0;
        for(int& x:barcodes){
            if(maxCount<++hash[x]){
                maxCount=hash[x];
                maxval=x;
            }
        }

        int n=barcodes.size(),index=0;
        vector<int> ret(n);
        for(int i=0;i<maxCount;i++){
            ret[index]=maxval;
            index+=2;
        }

        hash.erase(maxval);
        for(auto& [x,y]:hash){
            for(int i=0;i<y;i++){
                if(index>=n) index=1;
                ret[index]=x;
                index+=2;
            }
        }
        return ret;
    }
};

05.重構(gòu)字符串

題目鏈接:https://leetcode.cn/problems/reorganize-string/

給定一個字符串 s ,檢查是否能重新排布其中的字母,使得兩相鄰的字符不同。

返回 s 的任意可能的重新排列。若不可行,返回空字符串 ""

示例 1:

輸入: s = "aab"
輸出: "aba"

示例 2:

輸入: s = "aaab"
輸出: ""

提示:

  • 1 <= s.length <= 500
  • s 只包含小寫字母

思路

這一題和上一題思路基本一致,但需要注意的是,這一題并沒有說一定有解,所以這里我們需要給出不符合的判斷,其余代碼類似上一題。

代碼

class Solution {
public:
    string reorganizeString(string s) {
        int hash[26]={0};
        char maxChar=' ';
        int maxCount=0;
        for(char& ch:s){
            if(maxCount<++hash[ch-'a']){
                maxChar=ch;
                maxCount=hash[ch-'a'];
            }
        }

        int n=s.size();
        if(maxCount>(n+1)/2) return "";

        string ret(n,' ');
        int index=0;
        for(int i=0;i<maxCount;i++){
            ret[index]=maxChar;
            index+=2;
        }

        hash[maxChar-'a']=0;
        for(int i=0;i<26;i++){
            for(int j=0;j<hash[i];j++){
                if(index>=n) index=1;
                ret[index]='a'+i;
                index+=2;
            }
        }
        return ret;
    }
};

到了這里,關(guān)于算法沉淀——貪心算法七(leetcode真題剖析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 算法沉淀——貪心算法二(leetcode真題剖析)

    算法沉淀——貪心算法二(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/longest-increasing-subsequence/ 給你一個整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。 子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如, [3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。 示例 1: 示

    2024年03月19日
    瀏覽(68)
  • 算法沉淀——棧(leetcode真題剖析)

    算法沉淀——棧(leetcode真題剖析)

    棧(Stack)是一種基于先進(jìn)后出(Last In, First Out,LIFO)原則的數(shù)據(jù)結(jié)構(gòu)。棧具有兩個主要的操作: 壓棧(Push) :將元素添加到棧的頂部。 出棧(Pop) :從棧的頂部移除元素。 棧常常用于需要反轉(zhuǎn)操作順序的場景,或者在需要記錄操作歷史的情況下。在算法中,棧的應(yīng)用廣

    2024年02月20日
    瀏覽(19)
  • 算法沉淀——遞歸(leetcode真題剖析)

    算法沉淀——遞歸(leetcode真題剖析)

    遞歸是一種通過調(diào)用自身的方式來解決問題的算法。在遞歸算法中,問題被分解為更小的相似子問題,然后通過對這些子問題的解進(jìn)行組合來解決原始問題。遞歸算法通常包含兩個主要部分: 基本情況(Base Case): 定義問題的最小規(guī)模,直接解答而不再進(jìn)行遞歸。基本情況

    2024年02月20日
    瀏覽(20)
  • 算法沉淀——多源 BFS(leetcode真題剖析)

    算法沉淀——多源 BFS(leetcode真題剖析)

    多源 BFS 是指從多個源點同時進(jìn)行廣度優(yōu)先搜索的算法。在傳統(tǒng)的 BFS 中,我們通常從一個起始點開始,逐層遍歷所有的相鄰節(jié)點。而在多源 BFS 中,我們可以同時從多個源點開始,從這些源點出發(fā),逐層向外擴展,直到達(dá)到目標(biāo)或者遍歷完整個圖。 多源 BFS 可以用于解決一些

    2024年02月19日
    瀏覽(25)
  • 算法沉淀——BFS 解決 FloodFill 算法(leetcode真題剖析)

    算法沉淀——BFS 解決 FloodFill 算法(leetcode真題剖析)

    BFS(廣度優(yōu)先搜索)解決 Flood Fill 算法的基本思想是通過從起始點開始,逐層向外擴展,訪問所有與起始點相連且具有相同特性(顏色等)的區(qū)域。在 Flood Fill 中,通常是通過修改圖像的像素顏色。 下面是 BFS 解決 Flood Fill 算法的步驟: 初始化: 將起始點的顏色修改為新的

    2024年02月20日
    瀏覽(16)
  • 算法沉淀——BFS 解決拓?fù)渑判颍╨eetcode真題剖析)

    算法沉淀——BFS 解決拓?fù)渑判颍╨eetcode真題剖析)

    Breadth-First Search (BFS) 在拓?fù)渑判蛑械膽?yīng)用主要是用來解決有向無環(huán)圖(DAG)的拓?fù)渑判騿栴}。拓?fù)渑判蚴菍τ邢驁D中所有節(jié)點的一種線性排序,使得對于每一條有向邊 (u, v),節(jié)點 u 在排序中都出現(xiàn)在節(jié)點 v 的前面。如果圖中存在環(huán)路,則無法進(jìn)行拓?fù)渑判颉?BFS 解決拓?fù)渑判?/p>

    2024年02月21日
    瀏覽(27)
  • 算法沉淀——優(yōu)先級隊列(堆)(leetcode真題剖析)

    算法沉淀——優(yōu)先級隊列(堆)(leetcode真題剖析)

    優(yōu)先隊列(Priority Queue)是一種抽象數(shù)據(jù)類型,它類似于隊列(Queue),但是每個元素都有一個關(guān)聯(lián)的優(yōu)先級。在優(yōu)先隊列中,元素按照優(yōu)先級從高到低(或從低到高)排列,高優(yōu)先級的元素先出隊。這種數(shù)據(jù)結(jié)構(gòu)可以用堆(Heap)來實現(xiàn)。 堆是一種二叉樹結(jié)構(gòu),有兩種主要類

    2024年02月22日
    瀏覽(30)
  • 算法沉淀——BFS 解決最短路問題(leetcode真題剖析)

    算法沉淀——BFS 解決最短路問題(leetcode真題剖析)

    BFS (廣度優(yōu)先搜索)是解決最短路徑問題的一種常見算法。在這種情況下,我們通常使用BFS來查找從一個起始點到目標(biāo)點的最短路徑。 具體步驟如下: 初始化: 從起始點開始,將其放入隊列中,并標(biāo)記為已訪問。 BFS遍歷: 不斷從隊列中取出頂點,然后探索與該頂點相鄰且

    2024年02月20日
    瀏覽(21)
  • 算法沉淀——窮舉、暴搜、深搜、回溯、剪枝綜合練習(xí)一(leetcode真題剖析)

    算法沉淀——窮舉、暴搜、深搜、回溯、剪枝綜合練習(xí)一(leetcode真題剖析)

    題目鏈接:https://leetcode.cn/problems/permutations/ 給定一個不含重復(fù)數(shù)字的數(shù)組 nums ,返回其 所有可能的全排列 。你可以 按任意順序 返回答案。 示例 1: 示例 2: 示例 3: 提示: 1 = nums.length = 6 -10 = nums[i] = 10 nums 中的所有整數(shù) 互不相同 思路 這是一個典型的回溯問題,需要在每

    2024年02月21日
    瀏覽(23)
  • 2023華為OD機試真題【區(qū)間交疊/貪心算法】【Python Java】

    2023華為OD機試真題【區(qū)間交疊/貪心算法】【Python Java】

    給定坐標(biāo)軸上的一組線段,線段的起點和終點均為整數(shù)并且長度不小于1,請你從中找到最少數(shù)量的線段,這些線段可以覆蓋住所有線段。 輸入描述 第一行輸入為所有線段的數(shù)量,不超過10000,后面每行表示一條線段,格式為”x,y”, x和y 分別表示起點和終點,取值范圍是

    2024年02月13日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包