class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k)
{
sort(nums.begin(), nums.end());
int num = INT_MAX;
int ans = 0;
for (int i=0; i<nums.size(); i++)
{
num = min(num, abs(nums[i]));
if (nums[i]<=0 && k>0)
{
ans += -nums[i];
k--;
}
else ans+=nums[i];
}
if (k!=0 && k%2==0) return ans;
else if (k!=0) return ans-num*2;
return ans;
}
};
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost)
{
int tank = 0;
int start = 0;
int sum = 0;
for (int i=0; i<gas.size(); i++)
{
sum += gas[i] - cost[i];
}
if (sum<0) return -1;
for (int i=0; i<gas.size(); i++)
{
tank += gas[i]-cost[i];
if (tank<0)
{
tank = 0;
start = i+1;
}
}
return start==gas.size() ? 0 : start;
}
};
局部最优推出全局做优,虽然思路是这样,但对于具体的题还是会想不出来,多多练习吧
class Solution {
public:
int candy(vector<int>& ratings)
{
vector<int> candyVec(ratings.size(), 1);
// 从前向后
for (int i = 1; i < ratings.size(); i++) {
if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
}
// 从后向前
for (int i = ratings.size() - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1] ) {
candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
}
}
// 统计结果
int result = 0;
for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
return result;
}
};