Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。

2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。

作者头像
福大大架构师每日一题
发布于 2025-03-24 06:04:07
发布于 2025-03-24 06:04:07
5700
代码可运行
举报
运行总次数:0
代码可运行

2025-03-23:单调数组对的数目Ⅱ。用go语言,给定一个长度为 n 的正整数数组 nums,我们需要找出所有的单调数组对。

单调数组对的定义是:两个非负整数数组 (arr1, arr2) 同时满足以下条件:

1.两个数组均为长度 n。

2.arr1 是单调非递减的,即 arr1[0] <= arr1[1] <= ... <= arr1[n - 1]。

3.arr2 是单调非递增的,即 arr2[0] >= arr2[1] >= ... >= arr2[n - 1]。

4.对于所有的 0 <= i <= n - 1,arr1[i] + arr2[i] 必须等于 nums[i]。

我们需要返回满足条件的单调数组对的总数。由于结果可能很大,因此需要将其对 1000000007 进行取余。

1 <= n == nums.length <= 2000。

1 <= nums[i] <= 1000。

输入:nums = [2,3,2]。

输出:4。

解释:

单调数组对包括:

([0, 1, 1], [2, 2, 1])

([0, 1, 2], [2, 2, 0])

([0, 2, 2], [2, 1, 0])

([1, 2, 2], [1, 1, 0])

题目来自leetcode3251。

大体步骤如下:

  1. 1. 初始化变量:首先统计nums数组中最大的数m,并初始化一个模数mod为10^9 + 7。创建一个二维数组dp用来存储动态规划的结果,其中dp[i][j]表示在索引为i时,arr1的最后一个元素为j时的方案数。
  2. 2. 初始化dp数组:根据nums数组的首个元素,初始化dp[0][a]为1,其中a的范围是从0到nums[0]。
  3. 3. 动态规划求解:从第二个元素开始,对于每个元素nums[i],计算出前一个元素和当前元素的差值d,然后根据动态规划关系式更新dp数组中的值。
    • • 对于j从d到nums[i],如果j等于0,则dp[i][j]等于dp[i-1][j-d],否则,dp[i][j]等于(dp[i][j-1] + dp[i-1][j-d]) % mod。
  4. 4. 统计结果:遍历dp数组的最后一行,将所有元素相加并取模,得到最终的结果res。

总的时间复杂度是O(n * m),其中n为nums的长度,m为数组中的最大值;额外空间复杂度是O(n * m),用于存储dp数组。

Go完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package main

import (
    "fmt"
)

func countOfPairs(nums []int)int {
    n := len(nums)
    m := 0
    for _, num := range nums {
        if num > m {
            m = num
        }
    }
    mod := int(1e9 + 7)
    dp := make([][]int, n)
    for i := range dp {
        dp[i] = make([]int, m+1)
    }
    for a := 0; a <= nums[0]; a++ {
        dp[0][a] = 1
    }
    for i := 1; i < n; i++ {
        d := max(0, nums[i]-nums[i-1])
        for j := d; j <= nums[i]; j++ {
            if j == 0 {
                dp[i][j] = dp[i-1][j-d]
            } else {
                dp[i][j] = (dp[i][j-1] + dp[i-1][j-d]) % mod
            }
        }
    }
    res := 0
    for _, num := range dp[n-1] {
        res = (res + num) % mod
    }
    return res
}

func max(a, b int)int {
    if a > b {
        return a
    }
    return b
}

func main() {
    nums := []int{2, 3, 2}
    result := countOfPairs(nums)
    fmt.Println(result)
}

Python完整代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# -*-coding:utf-8-*-

defcount_of_pairs(nums):
    n = len(nums)
    m = max(nums)
    mod = 10**9 + 7

    dp = [[0] * (m + 1) for _ inrange(n)]

    for a inrange(nums[0] + 1):
        dp[0][a] = 1

    for i inrange(1, n):
        d = max(0, nums[i] - nums[i - 1])
        for j inrange(d, nums[i] + 1):
            if j == 0:
                dp[i][j] = dp[i - 1][j - d]
            else:
                dp[i][j] = (dp[i][j - 1] + dp[i - 1][j - d]) % mod

    res = sum(dp[n - 1]) % mod
    return res

if __name__ == "__main__":
    nums = [2, 3, 2]
    result = count_of_pairs(nums)
    print(result)

·

我们相信 Go 语言和算法为普通开发者提供了强有力的“面试利器”,并致力于分享全面的编程知识。在这里,您可以找到最新的 Go 语言教程、算法解析、提升面试竞争力的秘籍以及行业动态。 欢迎关注“福大大架构师每日一题”,让 Go 语言和算法助力您的职业发展

·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2025-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
2025-04-18:求出数组中最大序列值。用go语言,给定一个整数数组 nums 和一个正整数 k。 定义一个长度为 2*k
2025-04-18:求出数组中最大序列值。用go语言,给定一个整数数组 nums 和一个正整数 k。 定义一个长度为 2*k 的子序列 seq 的值为:
福大大架构师每日一题
2025/04/18
410
2025-04-18:求出数组中最大序列值。用go语言,给定一个整数数组 nums 和一个正整数 k。 定义一个长度为 2*k
文心一言 VS 讯飞星火 VS chatgpt (205)-- 算法导论15.4 1题
在Go语言中,求两个序列的最长公共子序列(Longest Common Subsequence, LCS)可以使用动态规划(Dynamic Programming, DP)的方法。下面是一个Go语言实现的示例代码,用于找到给定两个序列的LCS:
福大大架构师每日一题
2024/03/06
1910
文心一言 VS 讯飞星火 VS chatgpt (205)-- 算法导论15.4 1题
链表问题
A stringSof lowercase letters is given. We want to partition this string into as many parts as possible so that each letter appears in at most one part, and return a list of integers representing the size of these parts.
大学里的混子
2019/03/01
4830
2025-03-25:长度为 K 的子数组的能量值Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,你
2025-03-25:长度为 K 的子数组的能量值Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,你需要计算每个长度为 k 的子数组的能量值。
福大大架构师每日一题
2025/03/27
490
2025-03-25:长度为 K 的子数组的能量值Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,你
2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一
2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一个正整数 k。
福大大架构师每日一题
2025/01/02
890
2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一
2025-01-03:优质数对的总数Ⅱ。用go语言,给定两个整数数组 nums1 和 nums2,分别具有长度 n 和 m,同时
2025-01-03:优质数对的总数Ⅱ。用go语言,给定两个整数数组 nums1 和 nums2,分别具有长度 n 和 m,同时还有一个正整数 k。
福大大架构师每日一题
2025/01/07
760
2025-01-03:优质数对的总数Ⅱ。用go语言,给定两个整数数组 nums1 和 nums2,分别具有长度 n 和 m,同时
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr, val)可以返回数组arr中大于val的元素数量。
福大大架构师每日一题
2024/08/29
1370
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
2025-04-02:K 次乘运算后的最终数组Ⅱ。用go语言,给定一个整数数组 nums,以及两个整数 k 和 multipli
2025-04-02:K 次乘运算后的最终数组Ⅱ。用go语言,给定一个整数数组 nums,以及两个整数 k 和 multiplier。你需要对 nums 数组进行 k 次操作。每次操作的流程如下:
福大大架构师每日一题
2025/04/02
530
2025-04-02:K 次乘运算后的最终数组Ⅱ。用go语言,给定一个整数数组 nums,以及两个整数 k 和 multipli
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需要按照以下规则进行
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。
福大大架构师每日一题
2024/08/29
1510
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需要按照以下规则进行
2025-04-01:K 次乘运算后的最终数组Ⅰ。用go语言,给定一个整数数组 nums、一个整数 k 和一个乘数 multip
2025-04-01:K 次乘运算后的最终数组Ⅰ。用go语言,给定一个整数数组 nums、一个整数 k 和一个乘数 multiplier。你需要对数组 nums 执行 k 次操作。每次操作的步骤如下:
福大大架构师每日一题
2025/03/31
380
2025-04-01:K 次乘运算后的最终数组Ⅰ。用go语言,给定一个整数数组 nums、一个整数 k 和一个乘数 multip
2025-02-09:找出有效子序列的最大长度Ⅱ。用go语言,给定一个整数数组 nums 和一个正整数 k,我们定义一个子序列
2025-02-09:找出有效子序列的最大长度Ⅱ。用go语言,给定一个整数数组 nums 和一个正整数 k,我们定义一个子序列 sub 的长度为 x,如果满足以下条件,则称为有效子序列:
福大大架构师每日一题
2025/02/10
840
2025-02-09:找出有效子序列的最大长度Ⅱ。用go语言,给定一个整数数组 nums 和一个正整数 k,我们定义一个子序列
2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列
2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k,
福大大架构师每日一题
2024/11/14
1050
2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列
2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 n
2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数,
福大大架构师每日一题
2024/01/05
1770
2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 n
2025-01-11:求出最长好子序列Ⅰ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们需要找出满足特定条件的
2025-01-11:求出最长好子序列Ⅰ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们需要找出满足特定条件的子序列。
福大大架构师每日一题
2025/01/11
660
2025-01-11:求出最长好子序列Ⅰ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们需要找出满足特定条件的
2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i
2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i 和 j(i < j)中,若能通过至多一次的操作使得 nums[i] 与 nums[j] 相等,我们称这对数是近似相等的。这个操作包括选择其中一个数,并交换它的两个数字位。请计算并返回这样的近似相等数对的数量。
福大大架构师每日一题
2025/04/01
720
2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i
2025-01-23:统计逆序对的数目。用go语言,给定一个整数 n 和一个二维数组 requirements,其中每个元素 r
2025-01-23:统计逆序对的数目。用go语言,给定一个整数 n 和一个二维数组 requirem)ents,其中每个元素 requirements[i] = [endi, cnti] 表示在要求中末尾的下标以及逆序对的数量。
福大大架构师每日一题
2025/01/23
990
2025-01-23:统计逆序对的数目。用go语言,给定一个整数 n 和一个二维数组 requirements,其中每个元素 r
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
分别为 i 和 j,0 <= i < arr1.length 和 0 <= j < arr2.length,
福大大架构师每日一题
2023/12/13
1550
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
2021-04-05:给两个长度分别为M和N的整型数组...
2021-04-05:给两个长度分别为M和N的整型数组nums1和nums2,其中每个值都不大于9,再给定一个正数K。 你可以在nums1和nums2中挑选数字,要求一共挑选K个,并且要从左到右挑。返回所有可能的结果中,代表最大数字的结果。
福大大架构师每日一题
2021/04/05
4630
2021-04-05:给两个长度分别为M和N的整型数组...
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,如果我们可以对其中一个数执行至多两次操作,使得它们变得相等。这些操作包括选择 x 或 y 中的一个,交换这个数字的两个数位。
福大大架构师每日一题
2025/04/04
750
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
2025-02-08:找出有效子序列的最大长度Ⅰ。用go语言,给定一个整数数组 nums,我们需要找出其最长的“有效子序列”的长
2025-02-08:找出有效子序列的最大长度Ⅰ。用go语言,给定一个整数数组 nums,我们需要找出其最长的“有效子序列”的长度。有效子序列的定义为:一个长度为 x 的子序列需要满足以下条件:对于子序列中的任意连续两个元素,前两个元素之和的奇偶性(即 (sub[i] + sub[i+1]) % 2)在整个子序列中保持一致。也就是说,所有相邻元素之和的奇偶性都应该相同。
福大大架构师每日一题
2025/02/10
390
2025-02-08:找出有效子序列的最大长度Ⅰ。用go语言,给定一个整数数组 nums,我们需要找出其最长的“有效子序列”的长
推荐阅读
2025-04-18:求出数组中最大序列值。用go语言,给定一个整数数组 nums 和一个正整数 k。 定义一个长度为 2*k
410
文心一言 VS 讯飞星火 VS chatgpt (205)-- 算法导论15.4 1题
1910
链表问题
4830
2025-03-25:长度为 K 的子数组的能量值Ⅱ。用go语言,给定一个长度为 n 的整数数组 nums 和一个正整数 k,你
490
2025-01-01:优质数对的总数Ⅰ。用go语言,给定两个整数数组 nums1 和 nums2,分别长度为 n 和 m,以及一
890
2025-01-03:优质数对的总数Ⅱ。用go语言,给定两个整数数组 nums1 和 nums2,分别具有长度 n 和 m,同时
760
2024-08-28:用go语言,给定一个从1开始、长度为n的整数数组nums,定义一个函数greaterCount(arr,
1370
2025-04-02:K 次乘运算后的最终数组Ⅱ。用go语言,给定一个整数数组 nums,以及两个整数 k 和 multipli
530
2024-08-24:用go语言,给定一个下标从1开始,包含不同整数的数组 nums,数组长度为 n。 你需要按照以下规则进行
1510
2025-04-01:K 次乘运算后的最终数组Ⅰ。用go语言,给定一个整数数组 nums、一个整数 k 和一个乘数 multip
380
2025-02-09:找出有效子序列的最大长度Ⅱ。用go语言,给定一个整数数组 nums 和一个正整数 k,我们定义一个子序列
840
2024-11-13:求出所有子序列的能量和。用go语言,给定一个整数数组nums和一个正整数k, 定义一个子序列的能量为子序列
1050
2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 n
1770
2025-01-11:求出最长好子序列Ⅰ。用go语言,给定一个整数数组 nums 和一个非负整数 k,我们需要找出满足特定条件的
660
2025-04-01:统计近似相等数对Ⅰ。用go语言,给定一个正整数数组 nums,我们定义“近似相等”的一对数为:在下标 i
720
2025-01-23:统计逆序对的数目。用go语言,给定一个整数 n 和一个二维数组 requirements,其中每个元素 r
990
2023-12-09:用go语言,给你两个整数数组 arr1 和 arr2, 返回使 arr1 严格递增所需要的最小「操作」数(
1550
2021-04-05:给两个长度分别为M和N的整型数组...
4630
2025-04-03:统计近似相等数对Ⅱ。用go语言,你有一个正整数数组 nums。我们称两个整数 x 和 y 为“近似相等”,
750
2025-02-08:找出有效子序列的最大长度Ⅰ。用go语言,给定一个整数数组 nums,我们需要找出其最长的“有效子序列”的长
390
相关推荐
2025-04-18:求出数组中最大序列值。用go语言,给定一个整数数组 nums 和一个正整数 k。 定义一个长度为 2*k
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验