当前位置: 首页 > news >正文

LeetCode 3202.找出有效子序列的最大长度 II:取模性质(动态规划)

【LetMeFly】3202.找出有效子序列的最大长度 II:取模性质(动态规划)

力扣题目链接:https://leetcode.cn/problems/find-the-maximum-length-of-valid-subsequence-ii/

给你一个整数数组 nums 和一个  整数 k 。

nums 的一个 子序列 sub 的长度为 x ,如果其满足以下条件,则称其为 有效子序列 :

  • (sub[0] + sub[1]) % k == (sub[1] + sub[2]) % k == ... == (sub[x - 2] + sub[x - 1]) % k
返回 nums 的 最长 有效子序列 的长度。

 

示例 1:

输入:nums = [1,2,3,4,5], k = 2

输出:5

解释:

最长有效子序列是 [1, 2, 3, 4, 5] 。

示例 2:

输入:nums = [1,4,2,3,1,4], k = 3

输出:4

解释:

最长有效子序列是 [1, 4, 1, 4] 。

 

提示:

  • 2 <= nums.length <= 103
  • 1 <= nums[i] <= 107
  • 1 <= k <= 103

解题方法:动态规划(DP)

一个序列[a1,b1,a2,b2,a3,…][a_1,b_1,a_2,b_2,a_3,\dots][a1,b1,a2,b2,a3,]满足(a1+b1)%k==(b1+a2)%k==(a2+b2)%k==…(a_1+b_1)\% k == (b_1+a_2)\%k == (a_2+b2)\%k==\dots(a1+b1)%k==(b1+a2)%k==(a2+b2)%k==的话,则有:

a1,a2,…a_1, a_2,\dotsa1,a2,kkk同余,b1,b2,…b_1,b_2,\dotsb1,b2,kkk同余。

所谓同余,就是模kkk后的结果相等。

使用一个动态规划数组dp[i][j]dp[i][j]dp[i][j]代表a∗a_*akkk等于iiib∗b_*bkkk等于jjj[a1,b1,a2,b2…][a_1,b_1,a_2,b_2\dots][a1,b1,a2,b2]序列的最大长度,则可以:

遍历numsnumsnums数组,若当前元素(对kkk取模后)为xxx,则任何yxyxyxyxyxyx序列的长度都可以在xyxyxyxyxyxy序列的基础上再加一个xxx从而变成yxyxyxyxyxyx序列。

dp[y][x]=dp[x][y]+1dp[y][x]=dp[x][y]+1dp[y][x]=dp[x][y]+1

注意,dp[a][b]dp[a][b]dp[a][b]代表的abababababab序列,结尾一定是bbb,但开头不一定是aaa(可以是abababababab也可以是bababbababbabab)。

  • 时间复杂度O(O(O(k^2+nk)))
  • 空间复杂度O(k2)O(k^2)O(k2)

AC代码

C++
/** @Author: LetMeFly* @Date: 2025-07-18 22:33:22* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-07-20 19:32:05*/
#if defined(_WIN32) || defined(__APPLE__)
#include "_[1,2]toVector.h"
#endifclass Solution {
public:int maximumLength(vector<int>& nums, int k) {vector<vector<int>> dp(k, vector<int>(k));int ans = 0;for (int x : nums) {x %= k;for (int y = 0; y < k; y++) {dp[y][x] = dp[x][y] + 1;ans = max(ans, dp[y][x]);}}return ans;}
};
Python
'''
Author: LetMeFly
Date: 2025-07-18 22:33:22
LastEditors: LetMeFly.xyz
LastEditTime: 2025-07-20 22:23:43
'''
from typing import Listclass Solution:def maximumLength(self, nums: List[int], k: int) -> int:dp = [[0] * k for _ in range(k)]for x in nums:x %= kfor y in range(k):dp[y][x] = dp[x][y] + 1return max(map(max, dp))
Go
/** @Author: LetMeFly* @Date: 2025-07-18 22:33:22* @LastEditors: LetMeFly.xyz* @LastEditTime: 2025-07-20 22:28:07*/
package mainfunc maximumLength(nums []int, k int) (ans int) {dp := make([][]int, k)for i := range dp {dp[i] = make([]int, k)}for _, x := range nums {x %= kfor y := range dp {dp[y][x] = dp[x][y] + 1ans = max(ans, dp[y][x])}}return
}

同步发文于CSDN和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~

千篇源码题解已开源

http://www.lryc.cn/news/594311.html

相关文章:

  • 智能制造——48页毕马威:汽车营销与研发数字化研究【附全文阅读】
  • 【图像处理基石】什么是畸变校正?
  • 2025牛客暑期多校训练营2(部分补题)
  • 【LeetCode 热题 100】124. 二叉树中的最大路径和——DFS
  • 网络安全隔离技术解析:从网闸到光闸的进化之路
  • 【机器学习深度学习】魔塔社区模型后缀全解析:Base、Chat、Instruct、Bit、Distill背后的技术密码
  • leetcode丑数II计算第n个丑数
  • Java行为型模式---解释器模式
  • 大语言模型:人像摄影的“达芬奇转世”?——从算法解析到光影重塑的智能摄影革命
  • 核电子数字多道分析(DMCA)系统中,脉冲展宽的核心目的
  • 力扣:动态规划java
  • 基于单片机的火灾报警系统设计
  • 每日算法刷题Day50:7.20:leetcode 栈8道题,用时2h30min
  • 处理Electron Builder 创建新进程错误 spawn ENOMEM
  • C++ primer知识点总结
  • D. Traffic Lights 【Codeforces Round 1038, Div. 1 + Div. 2】
  • docker制作前端镜像
  • securecrt连接服务器报错 Key exchange failed 怎么办
  • Direct3D 11学习(一)
  • 股票账户数据及其数据获取
  • Python dataclass 高阶用法与技巧
  • ADC和DMA简述
  • Java中List<int[]>()和List<int[]>[]的区别
  • k8s:离线添加集群节点
  • MySQL—表设计和聚合函数以及正则表达式
  • 【性能测试】性能压测3个阶段+高频面试题回答(详细)
  • 第三章自定义检视面板_创建自定义编辑器类_编辑器操作的撤销与恢复(本章进度3/9)
  • Android 项目中如何在执行 assemble 或 Run 前自动执行 clean 操作?
  • Milvus Dify 学习笔记
  • Unity学习笔记(五)——3DRPG游戏(2)