?860.檸檬水找零
思路:
設(shè)立錢箱count(3,0)
分成三種情況:
1. 5元鈔票,count[0]++;
2. 10元鈔票, 判斷count[0]是否有錢返回(count[0]==0),沒有返回false. count[0]--,count[1]++
3. 20元鈔票,分情況判斷,優(yōu)先用10塊:count[0]>=1?&&?count[1]>=1?;蛘撸篶ount[0]>=3,否則return false;
最后return true;
看視頻后:
局部最優(yōu):遇到賬單20,優(yōu)先消耗美元10,完成本次找零。全局最優(yōu):完成全部賬單的找零。
406.根據(jù)身高重建隊列
思路:
本題有兩個需要處理的參數(shù):身高和排序,需要分別進(jìn)行處理。先確定身高再確定排序,但是找不到排序固定的判斷。
看視頻后:
如果按照k來從小到大排序,排完之后,會發(fā)現(xiàn)k的排列并不符合條件,身高也不符合條件,兩個維度哪一個都沒確定下來。
按照身高h(yuǎn)來排序呢,身高一定是從大到小排(身高相同的話則k小的站前面),讓高個子在前面。那么只需要按照k為下標(biāo)重新插入隊列就可以了。后序插入節(jié)點也不會影響前面已經(jīng)插入的節(jié)點,最終按照k的規(guī)則完成了隊列。
局部最優(yōu):優(yōu)先按身高高的people的k來插入。插入操作過后的people滿足隊列屬性
全局最優(yōu):最后都做完插入操作,整個隊列滿足題目隊列屬性
for(int?i=0;i<people.size();i++)
????????{
????????????int?position?=?people[i][1];
????????????result.insert(result.begin()+position,?people[i]);
????????}
注意自定義sort排序:
sort(people.begin(),people.end(),cmp);
cmp一定是static的:
static?bool?cmp(vector<int>?&a,?vector<int>?&b)
????{
????????if(a[0]==b[0])
????????????return?a[1]?<?b[1];
????????return?a[0]?>?b[0];
????}
輸出result;
?452.?用最少數(shù)量的箭引爆氣球?
思路:
先sort原數(shù)組,根據(jù)內(nèi)部數(shù)組的[0]進(jìn)行從小到大的排列。
數(shù)組compare為points[0]。用compare記錄每次與新數(shù)組的交集。如果交集為空compare[1]<points[i][0],則count加1且compare更新為新數(shù)組。最后count++,return count。
局部最優(yōu):按順序找到兩個區(qū)域的交集,再更新下一個區(qū)域。
全局最優(yōu):按順序找到最多區(qū)域的交集,再更新下一個區(qū)域。
看視頻后:
局部最優(yōu):當(dāng)氣球出現(xiàn)重疊,一起射,所用弓箭最少。
全局最優(yōu):把所有氣球射爆所用弓箭最少。
先對數(shù)組進(jìn)行排序,如果數(shù)組元素個數(shù)等于0則return 0. 如果不為0,則至少一只箭,所以result初始化等于1.
如果氣球和前一個氣球不挨著,即points[i][0]>points[i-1][1], result++;如果挨著,則縮小右邊界找交集,point[i][1]= min(points[i-1][1], points[i][1]);最后返回result。
在原數(shù)組上修改則不需要建一個數(shù)組進(jìn)行記錄。
for(int?i=1;?i<points.size();?i++)
????????{
????????????if(points[i][0]>points[i-1][1])
????????????{
????????????????result++;
????????????}
????????????else
????????????{
????????????????points[i][1]=min(points[i-1][1],points[i][1]);
????????????}
????????}