
2026-02-15:稳定子序列的数量。用go语言,给定一个整数数组 nums。我们把从原数组中按原有顺序挑出至少一个元素构成的序列称为“子序列”。若某个子序列中任意连续的三个元素并非同为奇数或同为偶数(即不会出现三个相邻元素奇偶性都相同的情况),则称该子序列为“稳定”。请计算所有稳定子序列的数量,并对 1000000007 取模后返回结果。
1 <= nums.length <= 100000。
1 <= nums[i] <= 100000。
输入: nums = [1,3,5]。
输出: 6。
解释:
稳定子序列为:[1], [3], [5], [1, 3], [1, 5], 和 [3, 5]。
子序列 [1, 3, 5] 不稳定,因为它包含三个连续的奇数。因此答案是 6。
题目来自力扣3686。
把每个数只看奇偶性(0 表示偶,1 表示奇),用动态规划在线统计截至当前处理位置为止的“稳定子序列”的数量。为避免子序列中出现三个连续同奇偶性的元素,维护关于“结尾一段相同奇偶性长度”的状态,只允许结尾相同奇偶性长度为 1 或 2 的子序列存在,任何会产生长度为 3 的扩展都被禁止。
状态定义(关键):
初始化:
对数组按顺序处理每个元素(设当前元素的奇偶性为 x,x ∈ {0,1}): (注意:下面描述的“旧值”表示处理当前元素前 f 中的值。实际实现中更新顺序要保证用到的是旧值,从而不把同一轮的更新混入计算。)
结果收集:
为什么这样能覆盖且仅覆盖“稳定子序列”:
举例(简短示范,nums = [1, 3, 5],均为奇数,奇偶用 1 表示):
额外说明:
.
package main
import (
"fmt"
)
func countStableSubsequences(nums []int)int {
const mod = 1_000_000_007
f := [2][2]int{}
for _, x := range nums {
x %= 2
f[x][1] = (f[x][1] + f[x][0]) % mod
f[x][0] = (f[x][0] + f[x^1][0] + f[x^1][1] + 1) % mod
}
return (f[0][0] + f[0][1] + f[1][0] + f[1][1]) % mod
}
func main() {
nums := []int{1, 3, 5}
result := countStableSubsequences(nums)
fmt.Println(result)
}

.
# -*-coding:utf-8-*-
def countStableSubsequences(nums):
MOD = 10**9 + 7
# f[even][type], type0 表示以该数结尾的稳定子序列,type1 表示不以该数结尾但涉及该数的稳定子序列
f = [[0, 0], [0, 0]]
for x in nums:
x %= 2
# 先更新 f[x][1]:因为要用到旧的 f[x][0],所以要先保存旧值
f[x][1] = (f[x][1] + f[x][0]) % MOD
# 更新 f[x][0]
f[x][0] = (f[x][0] + f[x^1][0] + f[x^1][1] + 1) % MOD
# 返回所有类型的子序列总数
return (f[0][0] + f[0][1] + f[1][0] + f[1][1]) % MOD
def main():
nums = [1, 3, 5]
result = countStableSubsequences(nums)
print(result)
if __name__ == "__main__":
main()

.
#include <iostream>
#include <vector>
using namespace std;
constint MOD = 1000000007;
int countStableSubsequences(vector<int>& nums) {
// f[even][type], type 0 表示以该数结尾的稳定子序列,type 1 表示不以该数结尾但涉及该数的稳定子序列
int f[2][2] = {{0, 0}, {0, 0}};
for (int x : nums) {
x %= 2;
// 先更新 f[x][1]:因为要用到旧的 f[x][0],所以要先保存旧值
f[x][1] = (f[x][1] + f[x][0]) % MOD;
// 更新 f[x][0]
f[x][0] = (f[x][0] + f[x^1][0] + f[x^1][1] + 1) % MOD;
}
// 返回所有类型的子序列总数
return (f[0][0] + f[0][1] + f[1][0] + f[1][1]) % MOD;
}
int main() {
vector<int> nums = {1, 3, 5};
int result = countStableSubsequences(nums);
cout << result << endl;
return0;
}

·
我们相信人工智能为普通人提供了一种“增强工具”,并致力于分享全方位的AI知识。在这里,您可以找到最新的AI科普文章、工具评测、提升效率的秘籍以及行业洞察。 欢迎关注“福大大架构师每日一题”,发消息可获得面试资料,让AI助力您的未来发展。
·