貪心的思路很簡單
在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,它所做出的僅僅是在某種意義上的區域性最優解,也就是當前最貪婪的解。
跳躍遊戲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...