2025-01-12:求出最长好子序列Ⅱ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们认为一个整数序列 se

举报
福大大架构师每日一题 发表于 2025/01/12 16:57:12 2025/01/12
5.4k+ 0 0
【摘要】 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:

chatgpt

题目来自leetcode3177。

大体步骤如下:

  1. 首先定义了一个名为 maximumLength 的函数,它接收一个整数数组 nums 和一个非负整数 k 作为参数,返回一个整数值。

  2. 在函数中,首先初始化变量 lenNums 为数组 nums 的长度,创建一个映射 dp 用于存储计数信息,以及一个长度为 k+1 的数组 zd 用于存储结果。

  3. 接下来,对数组 nums 进行遍历,取出每个数字,并检查该数字是否在映射 dp 中。如果不在,则在 dp 中创建以该数字为 key 的数组,长度为 k+1

  4. 对于每个数字,更新对应的数组 tmp,并根据规则进行更新,其中 max 函数用于取两者中的最大值。

  5. 最后更新数组 zd 的值,保持最大长度信息。

  6. 返回数组 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
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。