class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
// Step 1: 按照从小到大排序数组
sort(nums.begin(), nums.end());
int sum = 0;
// Step 2: 将尽可能多的负数转换为正数
for (int i = 0; i < nums.size() && k > 0 && nums[i] < 0; ++i) {
nums[i] = -nums[i]; // 翻转负数
--k; // 每翻转一次,k 减少一次
}
// Step 3: 重新计算总和
for (int num : nums) {
sum += num;
}
// Step 4: 如果 k 仍然是奇数,翻转最小的绝对值元素
if (k % 2 == 1) {
sort(nums.begin(),nums.end());
int min_element=nums[0];
// 减去两倍最小值,因为要翻转它
sum -= 2 * min_element;
}
return sum;
}
};
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
for (int i = 0; i < cost.size(); i++) {
int rest = gas[i] - cost[i]; // 记录剩余油量
int index = (i + 1) % cost.size();
while (rest > 0 && index != i) { // 模拟以i为起点行驶一圈(如果有rest==0,那么答案就不唯一了)
rest += gas[index] - cost[index];
index = (index + 1) % cost.size();
}
// 如果以i为起点跑一圈,剩余油量>=0,返回该起始位置
if (rest >= 0 && index == i) return i;
}
return -1;
}
};
思路:没用贪心使用暴力解法得到答案
class Solution {
public:
int candy(vector<int>& ratings) {
int n = ratings.size();
vector<int> candies(n, 1); // 每个孩子至少分到一颗糖果
// 从左到右遍历,确保每个孩子比左边评分高的糖果更多
for (int i = 1; i < n; i++) {
if (ratings[i] > ratings[i - 1]) {
candies[i] = candies[i - 1] + 1;
}
}
// 从右到左遍历,确保每个孩子比右边评分高的糖果更多
for (int i = n - 2; i >= 0; i--) {
if (ratings[i] > ratings[i + 1]) {
candies[i] = max(candies[i], candies[i + 1] + 1);
}
}
// 统计结果
int result = 0;
for (int i = 0; i < n; i++) {
result += candies[i];
}
return result;
}
};
思路:逻辑问题要捋清楚
class Solution {
public:
bool lemonadeChange(vector<int>& bills) {
int five = 0, ten = 0; // 分别记录5美元和10美元的数量
for (int i = 0; i < bills.size(); i++) {
if (bills[i] == 5) {
five++; // 5美元直接收入
}
else if (bills[i] == 10) {
if (five > 0) { // 用一张5美元找零
five--;
ten++;
} else {
return false; // 无法找零
}
}
else { // bills[i] == 20
if (ten > 0 && five > 0) { // 优先使用一张10美元和一张5美元找零
ten--;
five--;
}
else if (five >= 3) { // 如果没有10美元,用三张5美元找零
five -= 3;
}
else {
return false; // 无法找零
}
}
}
return true; // 所有账单都能顺利找零
}
};