2025-01-12:求出最长好子序列Ⅱ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们认为一个整数序列 se
【摘要】 2025-01-12:求出最长好子序列Ⅱ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们认为一个整数序列 seq 是“好序列”,当且仅当在索引范围 [0, seq.length - 2] 内,最多有 k 个位置 i 满足 seq[i] 与 seq[i + 1] 不相等。你的任务是找出 nums 中的“好子序列”的最长长度。1 <= nums.length <= 5 * 10...
2025-01-12:求出最长好子序列Ⅱ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们认为一个整数序列 seq 是“好序列”,当且仅当在索引范围 [0, seq.length - 2] 内,最多有 k 个位置 i 满足 seq[i] 与 seq[i + 1] 不相等。
你的任务是找出 nums 中的“好子序列”的最长长度。
1 <= nums.length <= 5 * 1000。
1 <= nums[i] <= 1000000000。
0 <= k <= min(50, nums.length)。
输入:nums = [1,2,1,1,3], k = 2。
输出:4。
解释:
最长好子序列为 [1,2,1,1,3] 中的1,2,1,1。
答案2025-01-12:
题目来自leetcode3177。
大体步骤如下:
-
首先定义了一个名为
maximumLength
的函数,它接收一个整数数组nums
和一个非负整数k
作为参数,返回一个整数值。 -
在函数中,首先初始化变量
lenNums
为数组nums
的长度,创建一个映射dp
用于存储计数信息,以及一个长度为k+1
的数组zd
用于存储结果。 -
接下来,对数组
nums
进行遍历,取出每个数字,并检查该数字是否在映射dp
中。如果不在,则在dp
中创建以该数字为 key 的数组,长度为k+1
。 -
对于每个数字,更新对应的数组 tmp,并根据规则进行更新,其中
max
函数用于取两者中的最大值。 -
最后更新数组
zd
的值,保持最大长度信息。 -
返回数组
zd
中索引为k
的值作为最终结果。
总的时间复杂度较高,大致为 O(n*k),其中 n 为 nums
数组的长度,k 为参数传入的非负整数。
总的额外空间复杂度也较高,为 O(n*k)。
Go完整代码如下:
package main
import (
"fmt"
)
func maximumLength(nums []int, k int) int {
lenNums := len(nums)
dp := make(map[int][]int)
zd := make([]int, k + 1)
for i := 0; i < lenNums; i++ {
v := nums[i]
if _, ok := dp[v]; !ok {
dp[v] = make([]int, k + 1)
}
tmp := dp[v]
for j := 0; j <= k; j++ {
tmp[j]++
if j > 0 {
tmp[j] = max(tmp[j], zd[j - 1] + 1)
}
}
for j := 0; j <= k; j++ {
zd[j] = max(zd[j], tmp[j])
}
}
return zd[k]
}
func main() {
nums := []int{1,2,1,1,3}
k := 2
result := maximumLength(nums,k)
fmt.Println(result)
}
Rust完整代码如下:
use std::collections::HashMap;
fn maximum_length(nums: Vec<i32>, k: i32) -> i32 {
let len_nums = nums.len();
let mut dp: HashMap<i32, Vec<i32>> = HashMap::new();
let mut zd = vec![0; (k + 1) as usize];
for i in 0..len_nums {
let v = nums[i];
dp.entry(v).or_insert(vec![0; (k + 1) as usize]);
let tmp = dp.get_mut(&v).unwrap();
for j in 0..=k {
tmp[j as usize] += 1;
if j > 0 {
tmp[j as usize] = tmp[j as usize].max(zd[(j - 1) as usize] + 1);
}
}
for j in 0..=k {
zd[j as usize] = zd[j as usize].max(tmp[j as usize]);
}
}
return zd[k as usize];
}
fn main() {
let nums = vec![1, 2, 1, 1, 3];
let k = 2;
let result = maximum_length(nums, k);
println!("{}", result);
}
C++完整代码如下:
#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>
int maximumLength(std::vector<int>& nums, int k) {
int lenNums = nums.size();
std::unordered_map<int, std::vector<int>> dp;
std::vector<int> zd(k + 1, 0);
for (int i = 0; i < lenNums; i++) {
int v = nums[i];
if (dp.find(v) == dp.end()) {
dp[v] = std::vector<int>(k + 1, 0);
}
std::vector<int>& tmp = dp[v];
for (int j = 0; j <= k; j++) {
tmp[j]++;
if (j > 0) {
tmp[j] = std::max(tmp[j], zd[j - 1] + 1);
}
}
for (int j = 0; j <= k; j++) {
zd[j] = std::max(zd[j], tmp[j]);
}
}
return zd[k];
}
int main() {
std::vector<int> nums = {1, 2, 1, 1, 3};
int k = 2;
int result = maximumLength(nums, k);
std::cout << result << std::endl;
return 0;
}
Python完整代码如下:
def maximum_length(nums, k):
len_nums = len(nums)
dp = {}
zd = [0] * (k + 1)
for i in range(len_nums):
v = nums[i]
if v not in dp:
dp[v] = [0] * (k + 1)
tmp = dp[v]
for j in range(k + 1):
tmp[j] += 1
if j > 0:
tmp[j] = max(tmp[j], zd[j - 1] + 1)
for j in range(k + 1):
zd[j] = max(zd[j], tmp[j])
return zd[k]
def main():
nums = [1, 2, 1, 1, 3]
k = 2
result = maximum_length(nums, k)
print(result)
if __name__ == "__main__":
main()
JavaScript完整代码如下:
function maximumLength(nums, k) {
let lenNums = nums.length;
let dp = {};
let zd = new Array(k + 1).fill(0);
for (let i = 0; i < lenNums; i++) {
let v = nums[i];
if (!(v in dp)) {
dp[v] = new Array(k + 1).fill(0);
}
let tmp = dp[v];
for (let j = 0; j <= k; j++) {
tmp[j]++;
if (j > 0) {
tmp[j] = Math.max(tmp[j], zd[j - 1] + 1);
}
}
for (let j = 0; j <= k; j++) {
zd[j] = Math.max(zd[j], tmp[j]);
}
}
return zd[k];
}
let nums = [1, 2, 1, 1, 3];
let k = 2;
let result = maximumLength(nums, k);
console.log(result);
Java完整代码如下:
import java.util.HashMap;
import java.util.Map;
public class Main {
public static int maximumLength(int[] nums, int k) {
int lenNums = nums.length;
Map<Integer, int[]> dp = new HashMap<>();
int[] zd = new int[k + 1];
for (int i = 0; i < lenNums; i++) {
int v = nums[i];
if (!dp.containsKey(v)) {
dp.put(v, new int[k + 1]);
}
int[] tmp = dp.get(v);
for (int j = 0; j <= k; j++) {
tmp[j]++;
if (j > 0) {
tmp[j] = Math.max(tmp[j], zd[j - 1] + 1);
}
}
for (int j = 0; j <= k; j++) {
zd[j] = Math.max(zd[j], tmp[j]);
}
}
return zd[k];
}
public static void main(String[] args) {
int[] nums = {1, 2, 1, 1, 3};
int k = 2;
int result = maximumLength(nums, k);
System.out.println(result);
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
- 2025-07-20:收集连续 K 个袋子可以获得的最多硬币数量。用go语言,在一条数轴上,每个整数坐标对应一个独立的袋子。某些
- 2025-07-19:计算字符串的镜像分数。用go语言,给定一个字符串 s,定义每个英文字母的“镜像”为字母表反转后对应的位置字
- 2025-07-18:最长乘积等价子数组。用go语言,给定一个只包含正整数的数组 nums。 定义:如果一个数组 arr 满足所
- 2025-07-17:删除所有值为某个元素后的最大子数组和。用go语言,给定一个整数数组 nums,你可以进行以下操作最多一次:
- 2025-07-16:最长相邻绝对差递减子序列。用go语言,给定一个整数数组 nums,需要找出其中的一个最长子序列 seq,满
评论(0)