✅✅代码随想录算法训练营Day34 || 1005.K次取反后最大化的数组和 134. 加油站

100 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第24天,点击查看活动详情🚀🚀

1005. K 次取反后最大化的数组和 - 力扣(LeetCode)

image.png

代码

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)

image.png

代码

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不小于零的地方把其索引值输出。

  • 这题确实不太好想,后面有时间应该多刷几次。