leetcode 404 周赛 找出有效子序列的最大长度 II「暴力」「动态规划」

3202. 找出有效子序列的最大长度 II

题目描述

给你一个整数数组 n u m s nums nums和一个正整数 k k k

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

( s u b [ 0 ] + s u b [ 1 ] ) % k = = ( s u b [ 1 ] + s u b [ 2 ] ) % k = = . . . = = ( s u b [ x − 2 ] + s u b [ x − 1 ] ) % k (sub[0] + sub[1]) \% k == (sub[1] + sub[2]) \% k == ... == (sub[x - 2] + sub[x - 1]) \% k (sub[0]+sub[1])%k==(sub[1]+sub[2])%k==...==(sub[x2]+sub[x1])%k

返回 n u m s nums nums最长有效子序列 的长度。

数据范围:

  • 2 <= nums.length <= 1 0 3 10^3 103
  • 1 <= nums[i] <= 1 0 7 10^7 107
  • 1 <= k <= 1 0 3 10^3 103

思路1:巧妙的“暴力”

这是我赛时的思路,一种比较巧妙的暴力,就是写起来有点费力

观察数据范围,n和k都是1000,显然正确答案的复杂度应该类似于O(n * k),即1000 * 1000

由于题目的要求:相邻两个数求和对k去模后结果一样,所以我们可以考虑先枚举余数p

此时问题变成了,给定余数 p p p和数组 n u m s nums nums,求一个最长的子序列,满足相邻两项求和模 k k k等于 p p p,此时考虑枚举子序列的起点 n u m s [ i ] nums[i] nums[i],由于余数 p p p是固定的,我们可以求出子序列的下一个数为 ( p − n u m s [ i ] + k ) (p - nums[i] + k)%k (pnums[i]+k),这样我们就不难发现,只要确定了第一个数字和余数p,这条最长的子序列就能确定下来

比如,1 1 2 0 1 1 2 1 2 1 2,假设k是4,当前枚举的余数p是3,只要确定了起点1,那其对应的最长的子序列就是1 2 1 2 1 2 1 2,此时我们需要一种方法可以快速获得下标大于 i i i 的某个特定数的下标,从而实现下标的跳转

虽然 n u m s [ i ] < = 1 e 7 nums[i]<=1e7 nums[i]<=1e7,但是对k取模后,数据范围就变成0到k-1了,所以我们可以考虑开一个vector数组v,对于nums[i]我们在vector数组里存下他的下标,即 v [ n u m s [ i ] % k ] . p u s h _ b a c k ( i ) v[nums[i]\%k].push\_back(i) v[nums[i]%k].push_back(i),然后再搞一个id数组,id[x]代表vector[x]现在用到的下标,这样可以避免重复遍历

我们可以再搞一个vis数组标记一下,因为我们通过跳转得到的一个子序列,从中间的任意一个元素开始跳都不会比起点开始更长,所以标记一下以后这些点就不会再重复计算了,当然还有一种情况是,存在一些中间多余的数字,比如1 1 2 1 1 2 1 2 1 2,最长的序列是1(1) 2 1 (1) 2 1 2 1 2,中间的两个1在跳转的过程中不会被遍历到,vis也不会标记它,此时id[1]和id[2]的位置也已经到了最后面,理论上从它开始跳转根本不会按正常的跳转方式得到一个完整的子序列,这种情况下是否会影响答案呢?

答案是不会影响的,看刚刚的例子,被省略的两个1,前面已经存在过1了,以1开头最长的子序列长度已经确定了,其他的1再开始也不会比他更长,所以是不会影响答案

不难发现,第二层看上去虽然是一层for一层while,但其实每个点只访问了一次,所以是O(n)的,所以这个代码的复杂度是O(n * k)

class Solution {
public:int maximumLength(vector<int>& nums, int k) {int tr[1005];int n = nums.size();vector<int>v[1005];for(int i = 1; i <= n; ++i){tr[i] = nums[i - 1];tr[i] %= k;v[tr[i]].push_back(i);}int ans = 0;for(int p = 0; p < k; ++p){//枚举余数bool vis[1005];memset(vis, 0, sizeof(vis));int id[1005];memset(id, 0, sizeof(id));for(int i = 1; i <= n; ++i){//枚举起点if(vis[i])continue;vis[i] = 1;int num = 1;int a = tr[i];int pos = i;while(1){int b = (p - a + k) % k;while(id[b] < v[b].size()){if(v[b][id[b]] <= pos){++id[b];}else break;}if(id[b] < v[b].size() && v[b][id[b]] > pos){pos = v[b][id[b]];vis[pos] = 1;++num;a = b;}else break;}ans = max(ans, num);}}return ans;}
};

思路2:dp

确定了余数p和第一个数,这个序列就确定了,会是两个数字循环

所以我们可以考虑用 d p [ n u m [ i ] ] dp[num[i]] dp[num[i]]表示以 n u m [ i ] num[i] num[i] 结尾的子序列的最长长度

转移方程很简单, d p [ n u m s [ i ] ] = d p [ ( p − n u m s [ i ] + k ) dp[nums[i]] = dp[(p - nums[i] + k) % k] + 1 dp[nums[i]]=dp[(pnums[i]+k)

class Solution {
public:int maximumLength(vector<int>& nums, int k) {int ans = 0;for(int p = 0; p < k; ++p){vector<int>dp(k, 0);for(int i = 0; i < nums.size(); ++i){nums[i] %= k;dp[nums[i]] = dp[(p - nums[i] + k) % k] + 1;ans = max(ans, dp[nums[i]]);}}return ans;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/365736.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python容器 之 字符串--定义

目录 1.字符串如何定义&#xff1f; 2.定义字符串时遇到特殊内容怎么处理&#xff1f; 1)字符串本身包含引号&#xff0c;如&#xff1a;定义字符串 Im 小明、他叫“小明”。 &#xff08;1&#xff09;如果字符串本身包含单引号,定义的时候不能使用 单引号。 &#xff08…

【Linux】Linux下使用套接字进行网络编程

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​ 用于网络应用开…

SAP 替代关系完全替代简介

最近用户在对长周期物料进行备料的时候又提出替代料的问题,主料库存不足的时候需要考虑替代料的在途库存,经常会忘了SAP标准的替代料逻辑,这次一次性把这个逻辑写清楚。 关于替代料的逻辑在前面的博文中测试多个替代料的使用场景 1、后继物料 2、组合替代 本文主要测试一下…

Sentinel如何使用BlockExceptionHandler实现限流/降级错误页面显示

1、修改配置项&#xff0c;打开对Spring MVC端点的保护 spring.cloud.sentinel.filter.enabledtrue 2、编写 BlockExceptionHandler的实现类 MyUrlBlockHandler.java package com.codex.terry.sentinel.urlblockhandler;/*** 文件名称: MyUrlBlockHandler.java* 编写人: yh…

解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)

错误消息 ssh: connect to host IP port 22: Connection timed out 指出 SSH 客户端尝试连接到指定的 IP 地址和端口号&#xff08;默认 SSH 端口是 22&#xff09;&#xff0c;但是连接超时了。这意味着客户端没有在预定时间内收到来自服务器的响应。 可能的原因 SSH 服务未…

昇思25天学习打卡营第6天|linchenfengxue

​​​​​​SSD目标检测 SSD&#xff0c;全称Single Shot MultiBox Detector&#xff0c;是Wei Liu在ECCV 2016上提出的一种目标检测算法。使用Nvidia Titan X在VOC 2007测试集上&#xff0c;SSD对于输入尺寸300x300的网络&#xff0c;达到74.3%mAP(mean Average Precision)以…

MATLAB-振动问题:单自由度阻尼振动系统受迫振动

一、基本理论 二、MATLAB实现 单自由度阻尼振动系统受迫振动&#xff0c;MATLAB代码如下&#xff1a; clear; clc; close allA 1; psi 0; F0 10; D 20; Rm 0.5; M 1; omega 2; delta Rm / (2*M); omega0 sqrt(D / M); Omega sqrt(omega0^2 - delta^2); Zm Rm i *…

Python学习路线图(2024最新版)

这是我最开始学Python时的一套学习路线&#xff0c;从入门到上手。&#xff08;不敢说精通&#xff0c;哈哈~&#xff09; 一、Python基础知识、变量、数据类型 二、Python条件结构、循环结构 三、Python函数 四、字符串 五、列表与元组 六、字典与集合 最后再送给大家一套免费…

Qt界面中的子窗口实现鼠标拖动边缘改变大小以及移动(完整demo代码)

目录 效果 拖拽 移动​编辑 实现 DragResizeWgt类.h文件 DragResizeWgt类.cpp文件 使用 testwidget窗口.ui文件 testwidget窗口.h文件 testwidget窗口.cpp文件 参考 效果 想要的效果就是类似于QT IDE中的效果&#xff0c;可以拖动边缘改变大小&#xff0c;用户自身可…

短视频抓取:成都柏煜文化传媒有限公司

短视频抓取&#xff1a;技术挑战、法律边界与未来趋势 随着移动互联网的迅猛发展&#xff0c;短视频平台如雨后春笋般涌现&#xff0c;成为现代人生活娱乐的重要组成部分。然而&#xff0c;在海量短视频内容中&#xff0c;如何高效、准确地抓取目标视频&#xff0c;成为了一个…

3D立体卡片动效(附源码)

3D立体卡片动效 欢迎关注&#xff1a;xssy5431 小拾岁月参考链接&#xff1a;https://mp.weixin.qq.com/s/9xEjPAA38pRiIampxjXNKQ 效果展示 思路分析 需求含有立体这种关键词&#xff0c;我们第一反应是采用动画中的平移、倾斜等实现。如果是立体&#xff0c;必然产生阴影&…

这才是CSDN最系统的网络安全学习路线(建议收藏)

01 什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防两面…

24 年程序员各岗位薪资待遇汇总(最新)

大家好&#xff0c;我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢&#xff1f;其实很简单&#xff0c;BOSS 直聘上有一个免费的薪酬查询工具&#xff0c;只要认证成为招聘者就能直接看&#xff0c;便于招聘者了解市场&#xff0c;…

线性代数基础概念:行列式

目录 线性代数基础概念&#xff1a;行列式 1. 行列式的定义 1.1 递归定义 1.2 代数余子式定义 1.3 几何定义 2. 行列式的性质 2.1 行列式等于其转置的行列式 2.2 交换两行或两列&#xff0c;行列式变号 2.3 将一行或一列乘以一个数 k&#xff0c;行列式乘以 k 2.4 将…

加密与安全_三种方式实现基于国密非对称加密算法的加解密和签名验签

文章目录 国际算法基础概念常见的加密算法及分类签名和验签基础概念常见的签名算法应用场景 国密算法对称加密&#xff08;DES/AES⇒SM4&#xff09;非对称加密&#xff08;RSA/ECC⇒SM2&#xff09;散列(摘要/哈希)算法&#xff08;MD5/SHA⇒SM3&#xff09; Code方式一 使用B…

App测试技术(纯理论)

之前我们也学习过一些普通用例的设计, 如功能, 性能, 安全性, 兼容性, 易用性, 界面的测试用例设计, 之前我们讲的基本都是对于Web应用而言的, 这里我们来讲一下移动端的App测试用例设计. 功能方面 安装&卸载测试 这是只属于App的一类测试, 再平常我们使用移动设备(手机…

鸿蒙 HarmonyOs 动画效果 快速入门

一、理论 1.1 animation属性 名称参数类型必填描述durationnumber否设置动画时长&#xff0c;默认值&#xff1a;1000&#xff0c;单位&#xff1a;毫秒temponumber否动画播放速度。数值越大&#xff0c;速度越快&#xff0c;默认为1curvestring | Curve否 设置动画曲线。 默…

喜提一等奖!白鲸开源在“创业北京”创业创新大赛海淀区选拔赛决赛表现亮眼

6月25日&#xff0c;第七届“创业北京”创业创新大赛海淀区选拔赛决赛在中关村东升国际科学园成功举办。本次活动由海淀区人力资源和社会保障局、中关村科学城管委会主办&#xff0c;以“创响新时代 共圆中国梦”为主题&#xff0c;活动现场主体赛先进制造赛道和主体赛现代服务…

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 桌面编辑器 8.1 ONLYOFFICE 简介一、轻松编辑器 PDF 文件二、用幻灯片版式快速修改幻灯片三、无缝切换文档编辑、审阅和查看模式四、**改进从右至左语言的支持 & 新的本地化选项**五、隐藏“连接到云”板块六、在演示文稿中播放视频和音频文件七、版本 8.1&…

Asp.NET identity以及Owin

》》》Identity是集成到Owin框架中中 ● Microsoft.AspNet.Identity.Core&#xff1a;Identity的核心类库&#xff0c;实现了身份验证的核心功能&#xff0c;并提供了拓展接口。● Microsoft.AspNet.Identity.EntityFramework&#xff1a;Identity数据持久化的EF实现。   ● …