球球速刷LC 貪心

2021-10-07 08:12:51 字數 1973 閱讀 7921

貪心的思路很簡單

在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解,也就是當前最貪婪的解。

跳躍遊戲1

維護乙個當前所能到達的視窗,並在這個視窗內遍歷每個點,看能達到的最遠距離farest。

從而將視窗更新到當前視窗[end+1,farest]。直到當前能到達視窗》=n

bool

canjump

(vector<

int>

& nums)

//能接觸到最後乙個位置,直接返回

if(farest>=nums.

size()

-1)return

true

;//最遠點還在當前視窗內,也即是不能前進了,返回失敗

if(farest <= curr_end)

return

false

;//更新當前所在視窗到剛探索的地方

curr_start=curr_end+1;

curr_end=farest;

}return

false

;}

跳躍遊戲2

思路同一,需要記錄跳躍次數。

int

jump

(vector<

int>

& nums)

if(farest>=nums.

size()

-1)//更新當前所在視窗到剛探索的地方

curr_start=curr_end+1;

curr_end=farest;

}return jump;

}

加油站

假設一開始以i站為出發站,記為start,i+1站為終點站,記為end。區間為[start,end)。一開始油箱裡的油為tank=gas[start]-cost[start]

<1>則當tank>0時,可以從當前i站走到i+1站,因此油箱裡的油更新為到下一站tank+=gas[end]-cost[end],期望達到的終點位置可以繼續向前拓展。即end++

<2> 當tank<=0時,證明油箱沒有油了,也就是從當前start站出發,到了當前end處就會沒油。所以我們寄希望於把start位置往後挪一站,

期望從更前面的地方出發能夠獲得更多的油。

因此通過有油就++end, 沒油就–start的方法來擴充套件視窗。直到所有站被探索到。

此處的乙個技巧是,end總是加,start總是減,有可能出現負數,處理不方便。

由於加油站是環形的。對於站點 0,2,3,4…n-1

我們可以將從n-1站出發,將0站作為end的起始值。即start=n-1,end=0

這樣–start,++end時避免了負數處理以及end索引超過陣列長度。

int

cancompletecircuit

(vector<

int>

& gas, vector<

int>

& cost)

else

}return tank>=

0?start:-1

;}

按成績發糖果

/*

int

candy

(vector<

int>

& ratings)

}//從右往左,如果分數比右邊高,糖果卻比右邊少,則增加i的糖果

for(

int i=ratings.

size()

-2;i>=0;

--i)

}return

accumulate

(candys.

begin()

,candys.

end(),

0);}

以下兩道為棧與貪心的結合,球球見棧的部落格。

去除重複字元

刪除k個數字

球球速刷LC 排序

最大數字 將字串排序,兩兩比較,二者組成的數字越大,則對於字串在前面。bool cmp const string a const string b class solution if result 0 0 result 0 return result 以下兩題思路類似。合併區間 插入區間 引用指數 ...

球球速刷LC之雙指標 二輪

無序兩數之和 對於當前num i 要找的是target num i 可利用集合逐漸構建搜尋集合 class solution table nums i i return ret 有序數字兩數之和 採用雙指標 class solution return ret else if curr else if...

球球速刷LC BFS DFS 二輪

二叉樹裡已經大量使用了dfs,bfs,二叉樹的前序遍歷,中序遍歷 後序遍歷就是dfs,層序遍歷 就是bfs。對於二叉樹這種具有單向分層結構,進行dfs bfs時無需擔心會重複訪問,但是對於無向圖或者 有向有環圖等結構,需要使用輔助資料結構來記錄當前節點是否已經訪問過。島嶼數目 class solut...