1005.K次取反後最大化的陣列和
題目連結 文章講解 影片講解
思路:
按絕對值從大到小排序
遍歷陣列,遇到負數,如果次數未用完就取反
最後如果剩餘次數未用完且為奇數就將陣列最後一個元素取反
class Solution {
static bool myCompare(const int& lhs, const int& rhs) {
return abs(lhs) > abs(rhs);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int result = 0;
sort(nums.begin(), nums.end(), myCompare);
for(int i = 0; i < nums.size(); ++i) {
if(nums[i] < 0 && k > 0) {
nums[i] *= -1;
--k;
}
}
// 處理剩餘的次數
if(k % 2 == 1) nums[nums.size() - 1] *= -1;
for(int val : nums) result += val;
return result;
}
};
134.加油站
題目連結 文章講解 影片講解
class Solution {
public:
int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
// 記錄最後剩餘的油量
int totalSum = 0;
// 記錄當前剩餘的油量
int curSum = 0;
int startIndex = 0;
for(int i = 0; i < gas.size(); ++i) {
curSum += (gas[i] - cost[i]);
totalSum += (gas[i] - cost[i]);
// 如果當前剩餘油量為負數,那麼從下一個位置開始重新記錄
if(curSum < 0) {
startIndex = i + 1;
curSum = 0;
}
}
if(totalSum < 0) return -1;
return startIndex;
}
};
135.分發糖果
題目連結 文章講解 影片講解
思路:
先從左向右遍歷,如果當前孩子的分數相較於前者高,則糖果數為前者加一
如果沒有前者高則預設為1
再從後向前遍歷,如果當前孩子得分比後者高,則再當前糖果和後者糖果加一的糖果數中取更大的一個
同時累加總的糖果數
class Solution {
public:
int candy(vector<int>& ratings) {
int total = 0;
vector<int> candys(ratings.size(), 1);
// 從前向後遍歷,保證比左邊的孩子得分高者符合要求
for(int i = 1; i < ratings.size(); ++i) {
if(ratings[i] > ratings[i - 1]) {
candys[i] = candys[i - 1] + 1;
}
}
total += candys[ratings.size() - 1];
// 從右向左遍歷,保證比右邊孩子得分高者符合要求
for(int i = ratings.size() - 2; i >= 0; --i) {
if(ratings[i] > ratings[i + 1]) candys[i] = max(candys[i], candys[i + 1] + 1);
total += candys[i];
}
return total;
}
};