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

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

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

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

01.買賣股票的最佳時機 II

題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/

給你一個整數(shù)數(shù)組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。

在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。

返回 你能獲得的 最大 利潤 。

示例 1:

輸入:prices = [7,1,5,3,6,4]
輸出:7
解釋:在第 2 天(股票價格 = 1)的時候買入,在第 3 天(股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。
     隨后,在第 4 天(股票價格 = 3)的時候買入,在第 5 天(股票價格 = 6)的時候賣出, 這筆交易所能獲得利潤 = 6 - 3 = 3 。
     總利潤為 4 + 3 = 7 。

示例 2:

輸入:prices = [1,2,3,4,5]
輸出:4
解釋:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5 - 1 = 4 。
     總利潤為 4 。

示例 3:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 交易無法獲得正利潤,所以不參與交易可以獲得最大利潤,最大利潤為 0 。 

提示:

  • 1 <= prices.length <= 3 * 104
  • 0 <= prices[i] <= 104

思路

通過畫圖我們不難看出上升區(qū)域利潤如果都拿到手即為最大利潤,這里有兩種寫法,一種是一次性加上一整段上升區(qū)域,另一種是計算每一小段上升區(qū)域

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

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret=0,n=prices.size();
        for(int i=0;i<n;i++){
            int j=i;
            while(j+1<n&&prices[j+1]>prices[j]) j++;
            ret+=prices[j]-prices[i];
            i=j;
        }
        return ret;
    }
};



class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int ret=0,n=prices.size();
        for(int i=1;i<n;i++){
            if(prices[i]>prices[i-1]) 
                ret+=prices[i]-prices[i-1];
        }
        return ret;
    }
};

02.K 次取反后最大化的數(shù)組和

題目鏈接:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/

給你一個整數(shù)數(shù)組 nums 和一個整數(shù) k ,按以下方法修改該數(shù)組:

  • 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。

重復(fù)這個過程恰好 k 次??梢远啻芜x擇同一個下標 i 。

以這種方式修改數(shù)組后,返回數(shù)組 可能的最大和 。

示例 1:

輸入:nums = [4,2,3], k = 1
輸出:5
解釋:選擇下標 1 ,nums 變?yōu)?[4,-2,3] 。

示例 2:

輸入:nums = [3,-1,0,2], k = 3
輸出:6
解釋:選擇下標 (1, 2, 2) ,nums 變?yōu)?[3,1,0,2] 。

示例 3:

輸入:nums = [2,-3,-1,5,-4], k = 2
輸出:13
解釋:選擇下標 (1, 4) ,nums 變?yōu)?[2,3,-1,5,4] 。 

提示:

  • 1 <= nums.length <= 104
  • -100 <= nums[i] <= 100
  • 1 <= k <= 104

思路

這里我們需要分情況討論,設(shè)整個數(shù)組中負數(shù)的個數(shù)為m個:

1、m>k:把前k小的負數(shù)全變成正數(shù)
2、m==k:把所有的負數(shù)全變成正數(shù);
3、m<k:先把負數(shù)變成正數(shù);然后根據(jù)k-m的奇偶情況分情況討論

代碼

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        int m=0,mini=INT_MAX,n=nums.size();
        for(auto x:nums){
            if(x<0) m++;
            mini=min(mini,abs(x));
        }

        int ret=0;
        if(m>k){
            sort(nums.begin(),nums.end());
            for(int i=0;i<k;i++) ret+=-nums[i];
            for(int i=k;i<n;i++) ret+=nums[i]; 
        }
        else{
            for(auto x:nums) ret+=abs(x);
            if((k-m)%2) ret-=mini*2;
        }
        return ret;
    }
};

03.按身高排序

題目鏈接:https://leetcode.cn/problems/sort-the-people/

給定一個字符串數(shù)組names和一個由不同正整數(shù)heights組成的數(shù)組。兩個數(shù)組的長度都是n

對于每個索引inames[i]heights[i]表示該人的姓名和身高。

返回按人物身高降序names排序。

示例1:

輸入: names = ["Mary","John","Emma"], heights = [180,165,170]
輸出: ["Mary","Emma","John"]
解釋: Mary 最高,其次是 Emma 和 John 。

示例2:

輸入: names = ["Alice","Bob","Bob"], heights = [155,185,150]
輸出: ["Bob","Alice","Bob"]
解釋:第一個 Bob 最高,其次是 Alice和第二個鮑勃。

限制條件:

  • n == names.length == heights.length
  • 1 <= n <= 103
  • 1 <= names[i].length <= 20
  • 1 <= heights[i] <= 105
  • names[i]由小寫和大寫英文字母組成。
  • 的所有值heights都是不同的。

思路

這道題目并不是一道貪心題,但是可以為下一道貪心題提供思路,這里我們額外建立一個下標數(shù)組,相對于身高對下標數(shù)組進行排序,最后映射名字輸出即可。

代碼

class Solution {
public:
    vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
        int n=names.size();
        vector<int> index(n);
        for(int i=0;i<n;i++) index[i]=i;

        sort(index.begin(),index.end(),[&](int i,int j){return heights[i]>heights[j];});

        vector<string> ret;
        for(int i:index) ret.push_back(names[i]);

        return ret;
    }
};

04.優(yōu)勢洗牌

題目鏈接:https://leetcode.cn/problems/advantage-shuffle/

給定兩個長度相等的數(shù)組 nums1nums2nums1 相對于 nums2優(yōu)勢可以用滿足 nums1[i] > nums2[i] 的索引 i 的數(shù)目來描述。

返回 nums1任意排列,使其相對于 nums2 的優(yōu)勢最大化。

示例 1:

輸入:nums1 = [2,7,11,15], nums2 = [1,10,4,11]
輸出:[2,11,7,15]

示例 2:

輸入:nums1 = [12,24,8,32], nums2 = [13,25,32,11]
輸出:[24,32,8,12]

提示:

  • 1 <= nums1.length <= 105
  • nums2.length == nums1.length
  • 0 <= nums1[i], nums2[i] <= 109

思路

當己方此時最差的比不過對面最差的時候,讓我方最差的去處理掉對面最好的(反正要輸,不如去拖掉對面?個最強的);
當己方此時最差的能比得上對面最差的時候,就讓兩者比對下去(最差的都能獲勝,為什么要輸呢)。
每次決策,都會使我方處于優(yōu)勢

代碼

class Solution {
public:
    vector<int> advantageCount(vector<int>& nums1, vector<int>& nums2) {
        int n=nums1.size();
        sort(nums1.begin(),nums1.end());
        vector<int> index(n);
        for(int i=0;i<n;i++) index[i]=i;
        sort(index.begin(),index.end(),[&](int i,int j){return nums2[i]<nums2[j];});

        vector<int> ret(n);
        int left=0,right=n-1;
        for(auto x:nums1){
            if(x>nums2[index[left]]) ret[index[left++]]=x;
            else ret[index[right--]]=x;
        }

        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īng)查實,立即刪除!

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

相關(guān)文章

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

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

    題目鏈接:https://leetcode.cn/problems/integer-replacement/ 給定一個正整數(shù) n ,你可以做如下操作: 如果 n 是偶數(shù),則用 n / 2 替換 n 。 如果 n 是奇數(shù),則可以用 n + 1 或 n - 1 替換 n 。 返回 n 變?yōu)?1 所需的 最小替換次數(shù) 。 示例 1: 示例 2: 示例 3: 提示: 1 = n = 2^31 - 1 思路 這里我們

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

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

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

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

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

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

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

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

    多源 BFS 是指從多個源點同時進行廣度優(yōu)先搜索的算法。在傳統(tǒng)的 BFS 中,我們通常從一個起始點開始,逐層遍歷所有的相鄰節(jié)點。而在多源 BFS 中,我們可以同時從多個源點開始,從這些源點出發(fā),逐層向外擴展,直到達到目標或者遍歷完整個圖。 多源 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日
    瀏覽(15)
  • 算法沉淀——優(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日
    瀏覽(29)
  • 算法沉淀——BFS 解決拓撲排序(leetcode真題剖析)

    算法沉淀——BFS 解決拓撲排序(leetcode真題剖析)

    Breadth-First Search (BFS) 在拓撲排序中的應(yīng)用主要是用來解決有向無環(huán)圖(DAG)的拓撲排序問題。拓撲排序是對有向圖中所有節(jié)點的一種線性排序,使得對于每一條有向邊 (u, v),節(jié)點 u 在排序中都出現(xiàn)在節(jié)點 v 的前面。如果圖中存在環(huán)路,則無法進行拓撲排序。 BFS 解決拓撲排序

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

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

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

    2024年02月20日
    瀏覽(20)
  • 算法沉淀——窮舉、暴搜、深搜、回溯、剪枝綜合練習(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】

    給定坐標軸上的一組線段,線段的起點和終點均為整數(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)紅包