题一:K 次取反后最大化的数组和
题目链接: K 次取反后最大化的数组和
解题思路: 先排序,然后每次选择最小的元素
解题代码:
var largestSumAfterKNegations = function (nums, k) {
// 排序
nums.sort((a, b) => a - b);
// 每次都取最小的元素负数
while (k--) {
nums.sort((a, b) => a - b);
nums[0] = -1 * nums[0];
}
let sum = nums.reduce((total,cur)=>total + cur,0);
return sum;
};
题二:加油站
题目链接:加油站
解题思路: 有点难 等二刷
解题代码:
var canCompleteCircuit = function(gas, cost) {
for(let i = 0; i<cost.length; i++){
let rest = gas[i] - cost[i]; // 记录剩余油量
let index = (i+1) % cost.length;
while(rest > 0 && index !== i){
rest+=gas[index] - cost[index];
index = (index + 1)% cost.length;
}
// 如果以i为起点跑一圈,剩余油量>= 0,返回该起始位置
if(rest >= 0 && index === i)return i;
}
return -1;
};
题三:分发糖果
题目链接: 分发糖果
解题思路: 有点难 等二刷
解题代码:
var candy = function(ratings) {
let candys = new Array(ratings.length).fill(1)
for(let i = 1; i < ratings.length; i++) {
if(ratings[i] > ratings[i - 1]) {
candys[i] = candys[i - 1] + 1
}
}
for(let i = ratings.length - 2; i >= 0; i--) {
if(ratings[i] > ratings[i + 1]) {
candys[i] = Math.max(candys[i], candys[i + 1] + 1)
}
}
let count = candys.reduce((a, b) => {
return a + b
})
return count
};