// jump ... // 最少的跳跃次数,则从前开始贪心,每次跳最大步数 // 也就是从后开始,可以到达最后结果的最远步数,下标最小的那个 func jump(nums []int) int { count := 0 tmp := len(nums) - 1 for tmp > 0 { // 每次从头开始循环,找到最先满足的值,然后break,更新tmp // 每次都是最先满足,最优解,贪心算法 for i := 0; i < tmp; i++ { if nums[i] + i >= tmp { count += 1 tmp = i break } } } return count }
// 优化贪心,减少for循环 // 从前往后找其每次能跳跃的最大步数,实现贪心 func jump(nums []int) int { count := 0 end := 0 maxTmp := 0 // 一次循环 for i := 0; i < len(nums) - 1; i++ { // 每次循环找其跳的最大步数 maxTmp = max(maxTmp, nums[i] + i) // 遍历到end,说明要发生跳跃,加1,并更新end if i == end { count += 1 end = maxTmp } } return count }
柠檬水找零
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// 两个指针记录5, 10的数量,通过,5,10,20的计算,每次循环判断数量小于0则false func lemonadeChange(bills []int) bool { f, t := 0, 0 for i := 0; i < len(bills); i++ { if bills[i] == 5 {f += 1} if bills[i] == 10 { t += 1 f -= 1 } if bills[i] == 20 { if t > 0 { t -= 1 f -= 1 } else {f -= 3} } if f < 0 || t < 0 {returnfalse} } returntrue }
买卖股票的最佳时机
1 2 3 4 5 6 7 8 9 10
// 每次循环,只要有收益就进行计算,完成收益累加 func maxProfit(prices []int) int { res := 0 for i := 1; i < len(prices); i++ { if prices[i] > prices[i - 1] { res += prices[i] - prices[i - 1] } } return res }