1005.K次取反后最大化的数组和
//按绝对值排序而非大小
int cmp(const void* str1,const void* str2){
return abs(*(int*)str1)>abs(*(int*)str2);
}
int largestSumAfterKNegations(int* nums, int numsSize, int k) {
qsort(nums,numsSize,sizeof(int),cmp);
int i=numsSize-1;//从右向左遍历
for(;i>=0;i--){
if(nums[i]<0&&k>0){
nums[i]*=-1;
k--;
}
}
if(k%2==1) nums[0]*=-1;//对绝对值最小的非负数进行取反;绝对值最小的数在最左边
//若剩余k为偶数,负负得正→不会改变和
int res=0;
for(int j=0;j<numsSize;j++){
res+=nums[j];
}
return res;
}
134.加油站
//用while模拟转圈比较容易
int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
int cur_sum=0;//从某个起点走一段距离后的剩余油量
int total_sum=0;//走过所有加油站剩余油量
int start=0;
for(int i=0;i<gasSize;i++){
cur_sum+=gas[i]-cost[i];
total_sum+=gas[i]-cost[i];
if(cur_sum<0){//当前start位置不能走到i+1→更新start
start=i+1;
cur_sum=0;
}
}
if(total_sum<0) return -1;//走过所有加油站剩余油量<0→无法走过所有加油站
return start;
}
135.分发糖果
int candy(int* ratings, int ratingsSize) {
int candies[20000]={0};
for(int i=0;i<ratingsSize;i++){
candies[i]=1;//初始值均为1
}
//遇到要考虑两个维度的问题(左右)→分别考虑每个维度,不要ton's't
for(int i=1;i<ratingsSize;i++){//比较右孩子比左孩子高的情况;从第二个元素开始
if(ratings[i]>ratings[i-1]) candies[i]=candies[i-1]+1;
}
for(int i=ratingsSize-2;i>=0;i--){//比较左孩子比右孩子高的情况;从倒数第二个元素开始
if(ratings[i]>ratings[i+1]){
candies[i]=fmax(candies[i],candies[i+1]+1);
}
}
int total=0;
for(int i=0;i<ratingsSize;i++){
//printf("candies[i]=%d ",candies[i]);
total+=candies[i];
}
return total;
}