持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情🚀🚀
1005. K 次取反后最大化的数组和 - 力扣(LeetCode)
代码
var largestSumAfterKNegations = function(nums, k) {
nums.sort((a,b) => Math.abs(b) - Math.abs(a))
for(let i = 0 ;i < nums.length; i++){
if(nums[i] < 0 && k > 0){
nums[i] = - nums[i];
k--;
}
}
while(k>0){
nums[nums.length-1] = - nums[nums.length-1]
k--;
}
return nums.reduce((a, b) => {
return a + b
})
};
思路
这里的思路还是比较清晰的
- 我这里是对数组进行了从大到小的排序,用从小到大排序也可以,只不过后面也要变一下。
注意是按照
绝对值的大小进行排序 - 排完序后就去寻找数组中绝对值最大的负数,并将其取反。
- 如果取反后,k还有值,就要对数组最小值进行不断取反操作。
- 最后进行求和
134. 加油站 - 力扣(LeetCode)
代码
var canCompleteCircuit = function(gas, cost) {
const gasLen = gas.length
let start = 0
let curSum = 0
let totalSum = 0
for(let i = 0; i < gasLen; i++) {
curSum += gas[i] - cost[i]
totalSum += gas[i] - cost[i]
if(curSum < 0) {
curSum = 0
start = i + 1
}
}
if(totalSum < 0) return -1
return start
};
难点
这里正常情况还是能想到的,当时主要被如何才算环绕一周这个一周给卡到了,想在数组上直接操作。看了题解之后发现可以把这个问题巧妙的绕开。
- totalSum => 取代通过数组实现环绕一周
totalSum的作用是,不管三七二十一,直接把每次油的剩余量给加起来,如果加油站的总油量大于总的耗油量,直接可以在第一次curSum不小于零的地方把其索引值输出。
- 这题确实不太好想,后面有时间应该多刷几次。