3201. 找出有效子序列的最大长度 I

Powered by:NEFU AB-IN

Link

文章目录

  • 3201. 找出有效子序列的最大长度 I
    • 题意
    • 思路
    • 代码
    • 拓展

3201. 找出有效子序列的最大长度 I

  • 题意

给你一个整数数组 nums。

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

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

一个 子序列 指的是从原数组中删除一些元素(也可以不删除任何元素),剩余元素保持原来顺序组成的新数组。

  • 思路

  1. 贪心:最长有效子序列有三种可能:

    • 全都是奇元素
    • 全都是偶元素
    • 奇偶元素交替
      代码注意:
    • odd := sum(x & 1 for x in nums), 是海象表达式,赋值的同时返回值
    • sum((x & 1) ^ (y & 1) for x, y in std.pairwise(nums)) 这句话非常的巧妙,首先获取每一对相邻的元素,然后 (x & 1) ^ (y & 1) 会比较 x 和 y 的奇偶性,算和是计算所有相邻元素对的奇偶性差异
      • 比如 2 1 3 3 4 6,生成 [(2, 1), (1, 3), (3, 3), (3, 4), (4, 6)],其中只有 (2, 1), (3, 4) 是奇偶性差异的 pair
        • 当出现 (0, 1) 的时候,如果再出现一个 (0, 1),期间一定会夹杂着一个 (1, 0) 对
      • 但显然这个是 (0, 1) (1, 0),即使 1 和 3 不同,但是我们可以选择一个,那么序列就可以为 214 或者 234,长度为 2 + 1 = 3
      • 所以 1 + sum((x & 1) ^ (y & 1) for x, y in pairwise(nums)) 等价于 奇偶交替的最长子序列长度
  2. dfs + 记忆化搜索
    为了考虑所有可能的初始状态,代码调用 dfs 函数四次,分别对应四种不同的初始状态:

    dfs(0, 0, 1):从索引 0 开始,初始奇偶性为偶数,需要的奇偶性变化为 奇
    dfs(0, 0, 0):从索引 0 开始,初始奇偶性为偶数,需要的奇偶性变化为 偶
    dfs(0, 1, 0):从索引 0 开始,初始奇偶性为奇数,需要的奇偶性变化为 偶
    dfs(0, 1, 1):从索引 0 开始,初始奇偶性为奇数,需要的奇偶性变化为 奇

    其实也是上面一样的思路,只不过用的dfs
    lru_cache 类似 cache,可以实现记忆化搜索

  • 代码

'''
Author: NEFU AB-IN
Date: 2024-06-30 10:30:18
FilePath: \LeetCode\CP404\b\b.py
LastEditTime: 2024-07-01 20:39:53
'''
# 3.8.19 import
from bisect import bisect_left, bisect_right
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, fabs, floor, gcd, log, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin, stdout
from typing import Any, Dict, Generic, List, TypeVar, UnionTYPE = TypeVar('TYPE')# Data structure
class SA(Generic[TYPE]):def __init__(self, x: TYPE, y: TYPE):self.x = xself.y = ydef __lt__(self, other: 'SA[TYPE]') -> bool:return self.x < other.xdef __eq__(self, other: 'SA[TYPE]') -> bool:return self.x == other.x and self.y == other.ydef __repr__(self) -> str:return f'SA(x={self.x}, y={self.y})'# Constants
N = int(2e5 + 10)  # If using AR, modify accordingly
M = int(20)  # If using AR, modify accordingly
INF = int(2e9)
OFFSET = int(100)# Set recursion limit
setrecursionlimit(INF)# Read
def input(): return stdin.readline().rstrip("\r\n")  # Remove when Mutiple data
def read(): return map(int, input().split())
def read_list(): return list(read())# Func
class std:letter_to_num = staticmethod(lambda x: ord(x.upper()) - 65)  # A -> 0num_to_letter = staticmethod(lambda x: ascii_uppercase[x])  # 0 -> Aarray = staticmethod(lambda x=0, size=N: [x] * size)array2d = staticmethod(lambda x=0, rows=N, cols=M: [std.array(x, cols) for _ in range(rows)])max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)removeprefix = staticmethod(lambda s, prefix: s[len(prefix):] if s.startswith(prefix) else s)removesuffix = staticmethod(lambda s, suffix: s[:-len(suffix)] if s.endswith(suffix) else s)@staticmethoddef find(container: Union[List[TYPE], str], value: TYPE):"""Returns the index of value in container or -1 if value is not found."""if isinstance(container, list):try:return container.index(value)except ValueError:return -1elif isinstance(container, str):return container.find(value)@staticmethoddef pairwise(iterable):"""Return successive overlapping pairs taken from the input iterable."""a, b = tee(iterable)next(b, None)return zip(a, b)# ————————————————————— Division line ——————————————————————class Solution:def maximumLength(self, nums: List[int]) -> int:return max(odd := sum(x & 1 for x in nums),len(nums) - odd,1 + sum((x & 1) ^ (y & 1) for x, y in std.pairwise(nums)))def maximumLength(self, nums: List[int]) -> int:@lru_cache(None)def dfs(index, expected_parity, original_parity):# 递归终止条件:如果索引达到数组末尾,返回0if index == len(nums):return 0# 当前元素奇偶性符合预期if nums[index] % 2 == expected_parity:# 将当前元素加入子序列,并继续递归下一个元素# 更新expected_parity为(original_parity - expected_parity) % 2return 1 + dfs(index + 1, (original_parity - expected_parity) % 2, original_parity)else:# 当前元素不符合预期,不加入子序列,继续递归下一个元素return dfs(index + 1, expected_parity, original_parity)# 考虑所有可能的初始状态return max(dfs(0, 0, 1), dfs(0, 0, 0), dfs(0, 1, 0), dfs(0, 1, 1))
  • 拓展

当2变为k时,可以用dp解决

'''
Author: NEFU AB-IN
Date: 2024-06-30 10:30:18
FilePath: \LeetCode\CP404\c\c.py
LastEditTime: 2024-07-01 22:18:53
'''
# 3.8.19 import
from bisect import bisect_left, bisect_right
from collections import Counter, defaultdict, deque
from datetime import datetime, timedelta
from functools import lru_cache
from heapq import heapify, heappop, heappush, nlargest, nsmallest
from itertools import combinations, compress, permutations, starmap, tee
from math import ceil, fabs, floor, gcd, log, sqrt
from string import ascii_lowercase, ascii_uppercase
from sys import exit, setrecursionlimit, stdin, stdout
from typing import Any, Dict, Generic, List, TypeVar, UnionTYPE = TypeVar('TYPE')# Data structure
class SA(Generic[TYPE]):def __init__(self, x: TYPE, y: TYPE):self.x = xself.y = ydef __lt__(self, other: 'SA[TYPE]') -> bool:return self.x < other.xdef __eq__(self, other: 'SA[TYPE]') -> bool:return self.x == other.x and self.y == other.ydef __repr__(self) -> str:return f'SA(x={self.x}, y={self.y})'# Constants
N = int(2e5 + 10)  # If using AR, modify accordingly
M = int(20)  # If using AR, modify accordingly
INF = int(2e9)
OFFSET = int(100)# Set recursion limit
setrecursionlimit(INF)# Read
def input(): return stdin.readline().rstrip("\r\n")  # Remove when Mutiple data
def read(): return map(int, input().split())
def read_list(): return list(read())# Func
class std:letter_to_num = staticmethod(lambda x: ord(x.upper()) - 65)  # A -> 0num_to_letter = staticmethod(lambda x: ascii_uppercase[x])  # 0 -> Aarray = staticmethod(lambda x=0, size=N: [x] * size)array2d = staticmethod(lambda x=0, rows=N, cols=M: [std.array(x, cols) for _ in range(rows)])max = staticmethod(lambda a, b: a if a > b else b)min = staticmethod(lambda a, b: a if a < b else b)removeprefix = staticmethod(lambda s, prefix: s[len(prefix):] if s.startswith(prefix) else s)removesuffix = staticmethod(lambda s, suffix: s[:-len(suffix)] if s.endswith(suffix) else s)@staticmethoddef find(container: Union[List[TYPE], str], value: TYPE):"""Returns the index of value in container or -1 if value is not found."""if isinstance(container, list):try:return container.index(value)except ValueError:return -1elif isinstance(container, str):return container.find(value)@staticmethoddef pairwise(iterable):"""Return successive overlapping pairs taken from the input iterable."""a, b = tee(iterable)next(b, None)return zip(a, b)# ————————————————————— Division line ——————————————————————class Solution:def maximumLength(self, nums: List[int], k: int) -> int:n = len(nums)dp = std.array2d(0, n, k + OFFSET)if n <= 2:return nfor j in range(k):dp[0][j] = 1res = 0for i in range(n):for j in range(i):dp[i][(nums[i] + nums[j]) % k] = std.max(dp[i][(nums[i] + nums[j]) % k], dp[j][(nums[i] + nums[j]) % k] + 1)res = std.max(res, max(dp[i]))return res

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

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

相关文章

concurrent.futures模块中ThreadPoolExecutor用法

ThreadPoolExecutor 是 Python 的 concurrent.futures 模块中的一个类&#xff0c;用于并发执行多个任务。通过使用线程池&#xff0c;它允许你将任务分配给池中的线程来执行&#xff0c;而不是每次需要执行任务时都创建新线程。这种方式可以显著提高性能和效率&#xff0c;特别…

YOLOv10改进教程|C2f-CIB加入注意力机制

一、 导读 论文链接&#xff1a;https://arxiv.org/abs/2311.11587 代码链接&#xff1a;GitHub - CV-ZhangXin/AKConv YOLOv10训练、验证及推理教程 二、 C2f-CIB加入注意力机制 2.1 复制代码 打开ultralytics->nn->modules->block.py文件&#xff0c;复制SE注意力机…

Docker期末复习

云计算服务类型有: IaaS 基础设施及服务 PaaS 平台及服务 SaaS 软件及服务 服务类型辨析示例: IaaS 服务提供的云服务器软件到操作系统,具体应用软件自己安装,如腾讯云上申请的云服务器等;SaaS提供的服务就是具体的软件,例如微软的Office套件等。 云计算部署模式有: 私有云…

Rust学习笔记 (命令行命令) : 用override set 设置工具链

在cargo run某个项目时出现了如下错误&#xff1a;error: failed to run custom build command for ring v0.16.20&#xff08;无法运行“Ring v0.16.20”的自定义构建命令&#xff09;&#xff0c;在PowerShell命令行运行命令 rustup override set stable-msvc后成功运行。 o…

发那科机床采集数据

前面两篇重点介绍了理论&#xff0c;从这篇开始&#xff0c;我们开始进行实战。首先从发那科机床开始&#xff0c;为何第一个将发那科。因为发那科系统机床有三最。最广泛&#xff08;中国保有量最多&#xff09;、 最多资料&#xff08;发那科系统的开发包历史悠久&#xff0c…

Linux——移动文件或目录,查找文件,which命令

移动文件或目录 作用 - mv命令用于剪切或重命名文件 格式 bash mv [选项] 源文件名称 目标文件名称 注意 - 剪切操作不同于复制操作&#xff0c;因为它会把源文件删除掉&#xff0c;只保留剪切后的文件。 - 如果在同一个目录中将某个文件剪切后还粘贴到当前目录下&#xff0c;…

CS144 Lab3 TCPSender复盘

一.基础概念 1.TCPSender在TCPSocket中的地位与作用 Lab0中实现了基于内存模拟的流控制-字节流&#xff08;ByteStream&#xff09;&#xff0c;底层使用std::deque实现&#xff0c;根据最大容量Capacity进行容量控制。个人理解它相当于应用层的输入输出缓存区&#xff0c;用户…

江协科技51单片机学习- p23 DS1302实时时钟

&#x1f680;write in front&#x1f680; &#x1f50e;大家好&#xff0c;我是黄桃罐头&#xff0c;希望你看完之后&#xff0c;能对你有所帮助&#xff0c;不足请指正&#xff01;共同学习交流 &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd;​…

巴比达内网穿透:深度剖析其在解决远程连接挑战中的技术优势

在信息技术日新月异的今天&#xff0c;远程协作与管理的需求日益增长&#xff0c;但内网环境的隔离性一直是横亘在高效远程操作面前的一道坎。本文将深入探讨一款专为打破此壁垒而生的工具——巴比达内网穿透&#xff0c;如何以其技术创新和高效性能&#xff0c;成为解决远程连…

汽车内饰塑料件光照老化实验箱

塑料件光照老化实验箱概述 塑料件光照老化实验箱&#xff0c;又称为氙灯老化试验箱&#xff0c;是一种模拟自然光照条件下塑料材料老化情况的实验设备。它通过内置的氙灯或其他光源&#xff0c;产生接近自然光的紫外线辐射&#xff0c;以此来加速塑料及其他材料的光老化过程。…

数据挖掘常见算法(分类算法)

K&#xff0d;近邻算法&#xff08;KNN&#xff09; K-近邻分类法的基本思想&#xff1a;通过计算每个训练数据到待分类元组Zu的距离&#xff0c;取和待分类元组距离最近的K个训练数据&#xff0c;K个数据中哪个类别的训练数据占多数&#xff0c;则待分类元组Zu就属于哪个类别…

Python + OpenCV 酷游地址教学V鄋KWK3589

本篇文章汇整了一系列的Python OpenCV 教学&#xff0c;只要按照教学文的顺序阅读和实作&#xff0c;就可以轻松入门OpenCV&#xff0c;并透过OpenCV 实现许多影像相关的创意应用。 接下来我们来介绍OpenCV-- OpenCV 是一个跨平台的电脑视觉函式库( 模组) &#xff0c;可应用…

Python容器 之 字符串--字符串的常用操作方法

1.字符串查找方法 find() 说明&#xff1a;被查找字符是否存在于当前字符串中。 格式&#xff1a;字符串.find(被查找字符) 结果&#xff1a;如果存在则返回第一次出现 被查找字符位置的下标 如果不存在则返回 -1 需求&#xff1a; 1. 现有字符串数据: 我是中国人 2. 请设计程序…

Gavin大咖亲自授课:将大语言模型与直接偏好优化对齐

Gavin大咖亲自授课&#xff1a;将大语言模型与直接偏好优化对齐 Align LLMs with Direct Preference Optimization 直接偏好优化&#xff08; Direct Preference Optimization&#xff09;这绝对是天才性的算法。你会看到数学的巨大力量和巨大价值&#xff0c;你一定会很兴奋和…

【计算机网络期末复习】例题汇总(一)

重点例题选择填空简答题与传输媒体的接口的特性重点 计算机网络的性能指标计算机网络体系结构例题 选择

Linux高并发服务器开发(八)Socket和TCP

文章目录 1 IPV4套接字结构体2 TCP客户端函数 3 TCP服务器流程函数代码粘包 4 三次握手5 四次挥手6 滑动窗口 1 IPV4套接字结构体 2 TCP客户端 特点&#xff1a;出错重传 每次发送数据对方都会回ACK&#xff0c;可靠 tcp是打电话的模型&#xff0c;建立连接 使用连接 关闭连接…

泛微E9开发 根据故障来源新增明细行,并且初始化错误类型

根据故障来源新增明细行&#xff0c;并且初始化错误类型 1、需求说明2、实现方法3、扩展知识点3.1 批量修改字段值或显示属性3.1.1 格式3.1.2 参数3.1.3 演示 3.2 根据字段ID获取字段信息3.2.1 格式3.2.2 参数3.2.3 演示 1、需求说明 用户对出现故障的机器或设备进行判断问题判…

pdf如何转成图片(不带水印)

PDF 文件格式是一种广泛应用于电子文档分享和打印的格式&#xff0c;而图像文件格式&#xff08;如 JPEG、PNG 等&#xff09;则更常用于在网页上展示图片或进行进一步的图像处理。将 PDF 转换为图像的需求可能源于多种原因&#xff1a;可能是为了在无法直接查看 PDF 的设备上查…

C++进阶 | [4.3] 红黑树

摘要&#xff1a;什么是红黑树&#xff0c;模拟实现红黑树 红黑树 &#xff0c;是一种 二叉搜索树 &#xff0c;但 在每个结点上增加一个存储位表示结点的颜色&#xff0c;可以是 Red 或 Black 。 通过对 任何一条从根到叶子的路径上各个结点着色方式的限制&#xff0c;红黑树…

分享一个在 WinForm 桌面程序中使用进度条展示报表处理进度的例子,提升用户体验

前言 在有些比较消耗时间的业务场景中&#xff0c;比如生成报表等&#xff0c;如果没有在操作的过程中向用户反馈操作进度&#xff0c;会让用户以为程序 “死” 掉了&#xff0c;用户体验非常不好。 WinForm 桌面程序项目与 Console 项目不一样&#xff0c;如果 Console 项目…