想法:先翻转负数,再翻转最小值
class Solution {
public:
static bool cmp(const int left, const int right) {
return abs(left)>abs(right);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), cmp);
for(int i=0; i<nums.size(); ++i) {
if(nums[i]<=0 && k>0) {
nums[i] *= -1;
k--;
}
}
if(k%2!=0) nums[nums.size()-1]*=-1;
int result = 0;
for(int num:nums) {
result += num;
}
return result;
}
};
想法:剩余量进行计算,一旦剩余量<0,则进行更新start
如果总的剩余量<0也同样不可能抵达一圈
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
int curLeave = 0;
int totalLeave = 0;
int startIndex = 0;
for(int i=0; i<gas.size(); ++i) {
curLeave += gas[i] - cost[i];
totalLeave += gas[i] - cost[i];
if(curLeave<0) {
startIndex = i+1;
curLeave = 0;
}
}
if(totalLeave<0) {
return -1;
}
return startIndex;
}
};
class Solution {
public:
int candy(vector<int>& ratings) {
vector<int> canny(ratings.size(), 1);
// 右孩子大于左孩子
for(int i=1; i<ratings.size(); ++i) {
if(ratings[i]>ratings[i-1]) {
canny[i] = canny[i-1]+1;
}
}
// 左孩子大于右孩子
for(int i=ratings.size()-2; i>=0; --i) {
if(ratings[i]>ratings[i+1]) {
canny[i] = max(canny[i], canny[i+1]+1);
}
}
int result = 0;
for(int num:canny) {
result += num;
}
return result;
}
};