int first = nums[0]; int second = nums[0] > nums[1] ? nums[0] : nums[1]; for(int i=2; i < numsSize-1; i++) { int tmp = first; first = second; second = (tmp + nums[i]) > second ? (tmp + nums[i]) : second; } int max = second; first = nums[1]; second = nums[1] > nums[2] ? nums[1] : nums[2]; for(int i=3; i < numsSize; i++) { int tmp = first; first = second; second = (tmp + nums[i]) > second ? (tmp + nums[i]) : second; } return second > max ? second : max;
total := map[int]int{} max := nums[0] for i:=0; i < length; i++ { num := nums[i] total[num] += num if num > max { max = num } } pre1 := 0 pre2 := total[0] pre3 := total[1] res := total[2] m := 0 for i:=2; i <=max; i++ { res = total[i] if pre1 > pre2 { m = pre1 } else { m = pre2 } res += m pre1 = pre2 pre2 = pre3 pre3 = res } if pre3 > pre2 { return pre3 } return pre2 }
// 优化之后 funcdeleteAndEarn(nums []int)int { maxValue := nums[0] for _, value := range nums { if value > maxValue { maxValue = value } } total := make([]int, maxValue+1) for _, value := range nums { total[value] += value } return rob(total) }
funcrob(nums []int)int { first := nums[0] second := max(nums[0], nums[1]) for i:=2; i<len(nums); i++ { first, second = second, max(first+nums[i], second) } return second }
funcmax(a, b int)int { if a > b { return a } return b }
55 跳跃游戏
给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
判断你是否能够到达最后一个下标。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
funccanJump(nums []int)bool { farthestJump := nums[0] for i := 1; i < len(nums); i++ { farthestJump-- if farthestJump < 0 { returnfalse } farthestJump = max(farthestJump, nums[i]) } returntrue }
funcmax(a, b int)int { if a > b { return a } return b }