860.檸檬水找零
分三種情況:
5、10炮障、20?
如果是5直接找零 10判斷有沒有5元 20的話優(yōu)先找10目派,沒有再用5找零
boollemonadeChange(vector<int>&bills){intfive=0,ten=0,twenty=0;for(intbill:bills){// 情況一if(bill==5)five++;// 情況二if(bill==10){if(five<=0)returnfalse;ten++;five--;}// 情況三if(bill==20){// 優(yōu)先消耗10美元,因為5美元的找零用處更大胁赢,能多留著就多留著if(five>0&&ten>0){five--;ten--;twenty++;// 其實這行代碼可以刪了企蹭,因為記錄20已經(jīng)沒有意義了,不會用20來找零}elseif(five>=3){five-=3;twenty++;// 同理智末,這行代碼也可以刪了}elsereturnfalse;}}returntrue;}
406.根據(jù)身高重建隊列?
遇到兩個維度權(quán)衡的時候谅摄,一定要先確定一個維度,再確定另一個維度
按照身高h(yuǎn)來排序呢系馆,身高一定是從大到小排(身高相同的話則k小的站前面)送漠,讓高個子在前面
局部最優(yōu):優(yōu)先按身高高的people的k來插入。插入操作過后的people滿足隊列屬性
全局最優(yōu):最后都做完插入操作由蘑,整個隊列滿足題目隊列屬性
staticboolcmp(constvector<int>&a,constvector<int>&b){if(a[0]==b[0])returna[1]<b[1];returna[0]>b[0];}vector<vector<int>>reconstructQueue(vector<vector<int>>&people){sort(people.begin(),people.end(),cmp);vector<vector<int>>que;for(inti=0;i<people.size();i++){intposition=people[i][1];que.insert(que.begin()+position,people[i]);}returnque;}
452.?用最少數(shù)量的箭引爆氣球?
局部最優(yōu):當(dāng)氣球出現(xiàn)重疊闽寡,一起射,所用弓箭最少尼酿。全局最優(yōu):把所有氣球射爆所用弓箭最少爷狈。
intfindMinArrowShots(vector<vector<int>>&points){if(points.size()==0)return0;sort(points.begin(),points.end(),cmp);intresult=1;// points 不為空至少需要一支箭for(inti=1;i<points.size();i++){if(points[i][0]>points[i-1][1]){// 氣球i和氣球i-1不挨著,注意這里不是>=result++;// 需要一支箭}else{// 氣球i和氣球i-1挨著points[i][1]=min(points[i-1][1],points[i][1]);// 更新重疊氣球最小右邊界}}returnresult;}