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ù)變成負數(shù)。最后sum加和所有元素蛀骇。return sum ;
看視頻后:
本題包含了兩次貪心:
1. 找絕對值最大的負數(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]的比較結果珊搀,所以 要從后向前遍歷。
獲得左邊大于右邊的最優(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進行加和千埃。