题目:
给你一个按升序排序的整数数组 num(可能包含重复数字),请你将它们分割成一个或多个长度至少为 3 的子序列,其中每个子序列都由连续整数组成。
如果可以完成上述分割,则返回 true ;否则,返回 false 。
算法:
方法一:贪心
长度至少为 3 的子序列 对3个这个数字敏感一些
func isPossible(nums []int) bool {
dp1, dp2, dp3 := 0, 0, 0
i := 0
for i < len(nums) {
start := i
cnt := 0
for i < len(nums){
if nums[i] != nums[start] {
break
}
cnt ++
i ++
}
if start > 0 && nums[start - 1] + 1 != nums[start] {
// 开一个新的序列
if dp1 + dp2 != 0 {
return false
} else {
dp1 = cnt
dp2, dp3 = 0, 0
}
} else {
// 更新dp1,dp2,dp3
if dp1 + dp2 > cnt {
return false
}
// nums[i]先分配个dp1,dp2
// 然后分配给dp3,如果还有多余的,分配给dp1生成新序列
left := cnt - dp1 - dp2
// 分配给dp3的nums[i]数量
dp3KeepCnt := min(left, dp3)
dp3 = dp2 + dp3KeepCnt
dp2 = dp1
dp1 = left - dp3KeepCnt
}
}
return dp1 == 0 && dp2 == 0
}
func min(a, b int) int {
if a < b {
return a
}
return b
}