代碼隨想錄第三十四天|1005.K次取反后最大化的數(shù)組和、134. 加油站、135. 分發(fā)糖果

1005.K次取反后最大化的數(shù)組和

思路:

先排序,在循環(huán)條件while(k>0?&&?i<nums.size()?&&?nums[i]<0)下,nums[i]=(-1)*nums[i],然后k--,i++.

再排序,如果k依舊大于0,如果k是奇數(shù),則將最小的數(shù)變成負(fù)數(shù)。最后sum加和所有元素。return sum ;

看視頻后:

本題包含了兩次貪心:

1. 找絕對值最大的負(fù)數(shù)進行取反

2. k沒用完 且 都為正數(shù)的情況 找最小值進行k次取反

按絕對值排只需要排序一次。


134.?加油站

思路:

用數(shù)組存儲差值,根據(jù)極點判斷極點加1是否為start,但部分用例過不去

看視頻后:

用currentSum和totalSum

totalSum用來最后判斷是否為-1;

currentSum用來尋找start節(jié)點,如果currentSum<0則意味著在這之前及該節(jié)點都不可能為start節(jié)點,start更新為i+1;

for(int?i=0;i<minor.size();i++)

????????{

????????????totalSum+=minor[i];

????????????currentSum+=minor[i];

????????????if(currentSum<0)

????????????{

????????????????start=i+1;

????????????????currentSum=0;

????????????}

????????}



135.?分發(fā)糖果

思路:

先小于判斷,后大于判斷,但數(shù)值不對。

看視頻后:

?這道題目一定是要確定一邊之后,再確定另一邊,例如比較每一個孩子的左邊,然后再比較右邊,如果兩邊一起考慮一定會顧此失彼

先確定右邊大于左邊的情況:(從前向后)

局部最優(yōu):只要右邊評分比左邊大,右邊的孩子就多一個糖果,全局最優(yōu):相鄰的孩子中,評分高的右孩子獲得比左邊孩子更多的糖果。

for(int?i=1;i<ratings.size();i++)

????????{

????????????if(ratings[i]>ratings[i-1])

????????????????candies[i]=candies[i-1]+1;

????????}

然后確定左邊大于右邊的情況:(從后往前)

因為 rating[5]與rating[4]的比較 要利用上 rating[5]與rating[6]的比較結(jié)果,所以 要從后向前遍歷。

獲得左邊大于右邊的最優(yōu)。

此時注意新的貪心:局部最優(yōu):取candyVec[i + 1] + 1 和 candyVec[i] 最大的糖果數(shù)量,保證第i個小孩的糖果數(shù)量既大于左邊的也大于右邊的。全局最優(yōu):相鄰的孩子中,評分高的孩子獲得更多的糖果。即取最大值。

for(int?i=ratings.size()-2;i>=0;i--)

????????{

????????????if(ratings[i]>ratings[i+1])

????????????????candies[i]=max(candies[i],candies[i+1]+1);

????????}

最后對candies進行加和。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容