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

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

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

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

01.最長遞增子序列

題目鏈接:https://leetcode.cn/problems/longest-increasing-subsequence/

給你一個(gè)整數(shù)數(shù)組 nums ,找到其中最長嚴(yán)格遞增子序列的長度。

子序列 是由數(shù)組派生而來的序列,刪除(或不刪除)數(shù)組中的元素而不改變其余元素的順序。例如,[3,6,2,7] 是數(shù)組 [0,3,1,6,2,2,7] 的子序列。

示例 1:

輸入:nums = [10,9,2,5,3,7,101,18]
輸出:4
解釋:最長遞增子序列是 [2,3,7,101],因此長度為 4 。

示例 2:

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

示例 3:

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

提示:

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

思路

可以通過維護(hù)一個(gè)數(shù)組,其中 ret[i] 表示長度為 i+1 的遞增子序列中,最后一個(gè)元素的最小值。在遍歷數(shù)組過程中,不斷更新這個(gè)數(shù)組,以確保它仍然滿足遞增的性質(zhì)。

每當(dāng)新元素加入時(shí),可以利用二分查找找到當(dāng)前元素在 ret 數(shù)組中的插入位置,然后更新這個(gè)位置上的值。這樣,就能夠在數(shù)組中維護(hù)遞增子序列的信息。

這種方法的關(guān)鍵點(diǎn)在于,我們只關(guān)心遞增子序列的最后一個(gè)元素,而不是整個(gè)遞增子序列的具體形狀。通過維護(hù)最后一個(gè)元素的最小值,可以在遍歷數(shù)組時(shí)保持遞增子序列的長度信息,并在需要時(shí)更新。

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

class Solution {
public:
    int lengthOfLIS(vector<int>& nums) {
        int n=nums.size();
        vector<int> ret;
        ret.push_back(nums[0]);

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

02.遞增的三元子序列

題目鏈接:https://leetcode.cn/problems/increasing-triplet-subsequence/

給你一個(gè)整數(shù)數(shù)組 nums ,判斷這個(gè)數(shù)組中是否存在長度為 3 的遞增子序列。

如果存在這樣的三元組下標(biāo) (i, j, k) 且滿足 i < j < k ,使得 nums[i] < nums[j] < nums[k] ,返回 true ;否則,返回 false 。

示例 1:

輸入:nums = [1,2,3,4,5]
輸出:true
解釋:任何 i < j < k 的三元組都滿足題意

示例 2:

輸入:nums = [5,4,3,2,1]
輸出:false
解釋:不存在滿足題意的三元組

示例 3:

輸入:nums = [2,1,5,0,4,6]
輸出:true
解釋:三元組 (3, 4, 5) 滿足題意,因?yàn)?nums[3] == 0 < nums[4] == 4 < nums[5] == 6

提示:

  • 1 <= nums.length <= 5 * 105
  • -231 <= nums[i] <= 231 - 1

思路

上一題的精簡版,可以直接用上面的代碼返回長度是否大于等于三即可,但在這里我們不需要這么復(fù)雜,僅需連個(gè)變量即可。

代碼

class Solution {
public:
    bool increasingTriplet(vector<int>& nums) {
        int n=nums.size();
        int a=nums[0],b=INT_MAX;
        for(int i=1;i<n;i++){
            if(nums[i]>b) return true;
            else if(nums[i]>a) b=nums[i];
            else a=nums[i];
        }
        return false;
    }
};

03.最長連續(xù)遞增序列

題目鏈接:https://leetcode.cn/problems/longest-continuous-increasing-subsequence/

給定一個(gè)未經(jīng)排序的整數(shù)數(shù)組,找到最長且 連續(xù)遞增的子序列,并返回該序列的長度。

連續(xù)遞增的子序列 可以由兩個(gè)下標(biāo) lrl < r)確定,如果對(duì)于每個(gè) l <= i < r,都有 nums[i] < nums[i + 1] ,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]] 就是連續(xù)遞增子序列。

示例 1:

輸入:nums = [1,3,5,4,7]
輸出:3
解釋:最長連續(xù)遞增序列是 [1,3,5], 長度為3。
盡管 [1,3,5,7] 也是升序的子序列, 但它不是連續(xù)的,因?yàn)?5 和 7 在原數(shù)組里被 4 隔開。 

示例 2:

輸入:nums = [2,2,2,2,2]
輸出:1
解釋:最長連續(xù)遞增序列是 [2], 長度為1。 

提示:

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

思路

當(dāng)找到以某個(gè)位置為起點(diǎn)的最長連續(xù)遞增序列后,可以直接將下一個(gè)位置作為新的起點(diǎn),繼續(xù)尋找下一個(gè)最長連續(xù)遞增序列。

代碼

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

04.買賣股票的最佳時(shí)機(jī)

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

給定一個(gè)數(shù)組 prices ,它的第 i 個(gè)元素 prices[i] 表示一支給定股票第 i 天的價(jià)格。

你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個(gè)不同的日子 賣出該股票。設(shè)計(jì)一個(gè)算法來計(jì)算你所能獲取的最大利潤。

返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0 。

示例 1:

輸入:[7,1,5,3,6,4]
輸出:5
解釋:在第 2 天(股票價(jià)格 = 1)的時(shí)候買入,在第 5 天(股票價(jià)格 = 6)的時(shí)候賣出,最大利潤 = 6-1 = 5 。
     注意利潤不能是 7-1 = 6, 因?yàn)橘u出價(jià)格需要大于買入價(jià)格;同時(shí),你不能在買入前賣出股票。

示例 2:

輸入:prices = [7,6,4,3,1]
輸出:0
解釋:在這種情況下, 沒有交易完成, 所以最大利潤為 0。

提示:

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

思路

遍歷數(shù)組,在每個(gè)位置 i 處計(jì)算當(dāng)前價(jià)格與之前最低價(jià)格的差值,更新最大利潤。在遍歷過程中,始終保持記錄前面最低價(jià)格的變量。當(dāng)找到更低的價(jià)格時(shí),更新這個(gè)變量;當(dāng)計(jì)算當(dāng)前位置的利潤時(shí),與之前記錄的最大利潤進(jìn)行比較,如果更大則更新最大利潤。

代碼

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

到了這里,關(guān)于算法沉淀——貪心算法二(leetcode真題剖析)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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真題剖析)

    貪心算法(Greedy Algorithm)是一種基于貪心策略的優(yōu)化算法,它通常用于求解最優(yōu)化問題,每一步都選擇當(dāng)前狀態(tài)下的最優(yōu)解,以期望通過局部最優(yōu)的選擇最終達(dá)到全局最優(yōu)。貪心算法的思想是在每一步都做出在當(dāng)前狀態(tài)下局部最優(yōu)的選擇,而不考慮未來可能造成的影響。 在

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2024年02月13日
    瀏覽(22)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包