题目1:122.买卖股票的最佳时机 II
每天的利润取正数 加和即可。
// @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. 跳跃游戏
覆盖范围的使用, 只要每次更新覆盖范围, 当发现覆盖范围 能覆盖到终点即可。
写代码时注意的一点是, 遍历的时候 就是遍历的覆盖范围,而不是数组。
这样发生中断的时候才可以 遍历中断。
// @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