659.分割数组为连续子序列

617 阅读1分钟

题目:
给你一个按升序排序的整数数组 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
}