算法 -贪心02(Swift版本)

89 阅读1分钟

题目1:122.买卖股票的最佳时机 II

讲解
leetcode

每天的利润取正数 加和即可。

// @lc code=start
class Solution {
    // 
    func maxProfit(_ prices: [Int]) -> Int {
        var res = 0
        for i in 1..<prices.count {
            res += max(0, prices[i] - prices[i - 1])
        }
        return res
    }
}
// @lc code=end

题目2:55. 跳跃游戏

讲解
leetcode

覆盖范围的使用, 只要每次更新覆盖范围, 当发现覆盖范围 能覆盖到终点即可。
写代码时注意的一点是, 遍历的时候 就是遍历的覆盖范围,而不是数组。
这样发生中断的时候才可以 遍历中断。

// @lc code=start
class Solution {
    func canJump(_ nums: [Int]) -> Bool {
        if (nums.count == 1) { return true }
        var cover = 0
        var cur = 0
        while cur <= cover {
            cover = max(cover, cur + nums[cur])
            if (cover >= nums.count - 1) {
                return true
            }
            cur += 1
        }
        return false
    }
}
// @lc code=end

题目3:45.跳跃游戏 II

讲解
leetcode
同样使用覆盖范围:查询上一覆盖范围内,可以找到的最大覆盖范围。
下次直接跳到最远端,继续找下一次的最大覆盖范围。
这样确保用最少得步数到达终点

class Solution {
    func jump(_ nums: [Int]) -> Int {
        if nums.count == 1 { return 0 }
        var res = 0
        var curDistance = 0
        var nextDistance = 0
        for i in 0..<nums.count {
            if curDistance >= nums.count - 1 { break }
            nextDistance = max(nextDistance, i + nums[i])
            if i == curDistance {
                res += 1
                curDistance = nextDistance
            }
        }
        return res
    }
}

题目4:1005.K次取反后最大化的数组和

讲解
leetcode
绝对值排序后 将负数取反,剩余次数给绝对值最小的数。


// @lc code=start
class Solution {
    func largestSumAfterKNegations(_ nums: [Int], _ k: Int) -> Int {
        var k = k
        var nums = nums.sorted { abs($0) > abs($1) }
        for i in 0..<nums.count where k > 0 {
            if nums[i] < 0 {
                nums[i] = -nums[i]
                k -= 1
            }
        }
        if k % 2 == 1 { nums[nums.count - 1] = -nums[nums.count - 1] }
        return nums.reduce(0) { $0 + $1 }
    }
}
// @lc code=end