LeetCode 题解工作台

求出所有子序列的能量和

给你一个长度为 n 的整数数组 nums 和一个 正 整数 k 。 一个 子序列 的 能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。 请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。 由于答案可能会很大,将答案对 10 9 + 7 取余 后返回。 示例 1: 输入…

category

3

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

困难 · 状态·转移·动态规划

bolt

答案摘要

由于题目涉及子序列元素的最小差值,我们不妨对数组 进行排序,这样可以方便我们计算子序列元素的最小差值。 接下来,我们设计一个函数 $dfs(i, j, k, mi)$,表示当前处理到第 个元素,上一个选取的是第 个元素,还需要选取 个元素,当前的最小差值为 时,能量和的值。那么答案就是 $dfs(0, n, k, +\infty)$。(若上一个选取的是第 个元素,表示之前没有选取过元素…

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 状态·转移·动态规划 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

给你一个长度为 n 的整数数组 nums 和一个  整数 k 。

一个 子序列能量 定义为子序列中 任意 两个元素的差值绝对值的 最小值 。

请你返回 nums 中长度 等于 k 的 所有 子序列的 能量和 。

由于答案可能会很大,将答案对 109 + 7 取余 后返回。

 

示例 1:

输入:nums = [1,2,3,4], k = 3

输出:4

解释:

nums 中总共有 4 个长度为 3 的子序列:[1,2,3] ,[1,3,4] ,[1,2,4] 和 [2,3,4] 。能量和为 |2 - 3| + |3 - 4| + |2 - 1| + |3 - 4| = 4 。

示例 2:

输入:nums = [2,2], k = 2

输出:0

解释:

nums 中唯一一个长度为 2 的子序列是 [2,2] 。能量和为 |2 - 2| = 0 。

示例 3:

输入:nums = [4,3,-1], k = 2

输出:10

解释:

nums 总共有 3 个长度为 2 的子序列:[4,3] ,[4,-1] 和 [3,-1] 。能量和为 |4 - 3| + |4 - (-1)| + |3 - (-1)| = 10 。

 

提示:

  • 2 <= n == nums.length <= 50
  • -108 <= nums[i] <= 108
  • 2 <= k <= n
lightbulb

解题思路

方法一:记忆化搜索

由于题目涉及子序列元素的最小差值,我们不妨对数组 nums\textit{nums} 进行排序,这样可以方便我们计算子序列元素的最小差值。

接下来,我们设计一个函数 dfs(i,j,k,mi)dfs(i, j, k, mi),表示当前处理到第 ii 个元素,上一个选取的是第 jj 个元素,还需要选取 kk 个元素,当前的最小差值为 mimi 时,能量和的值。那么答案就是 dfs(0,n,k,+)dfs(0, n, k, +\infty)。(若上一个选取的是第 nn 个元素,表示之前没有选取过元素)

函数 dfs(i,j,k,mi)dfs(i, j, k, mi) 的执行过程如下:

  • 如果 ini \geq n,表示已经处理完了所有的元素,如果 k=0k = 0,返回 mimi,否则返回 00
  • 如果剩余的元素个数 nin - i 不足 kk 个,返回 00
  • 否则,我们可以选择不选取第 ii 个元素,可以获得的能量和为 dfs(i+1,j,k,mi)dfs(i + 1, j, k, mi)
  • 也可以选择选取第 ii 个元素。如果 j=nj = n,表示之前没有选取过元素,那么可以获得的能量和为 dfs(i+1,i,k1,mi)dfs(i + 1, i, k - 1, mi);否则,可以获得的能量和为 dfs(i+1,i,k1,min(mi,nums[i]nums[j]))dfs(i + 1, i, k - 1, \min(mi, \textit{nums}[i] - \textit{nums}[j]))
  • 我们累加上述结果,并对 109+710^9 + 7 取模后返回。

为了避免重复计算,我们可以使用记忆化搜索的方法,将已经计算过的结果保存起来。

时间复杂度 O(n4×k)O(n^4 \times k),空间复杂度 O(n4×k)O(n^4 \times k)。其中 nn 为数组的长度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
    def sumOfPowers(self, nums: List[int], k: int) -> int:
        @cache
        def dfs(i: int, j: int, k: int, mi: int) -> int:
            if i >= n:
                return mi if k == 0 else 0
            if n - i < k:
                return 0
            ans = dfs(i + 1, j, k, mi)
            if j == n:
                ans += dfs(i + 1, i, k - 1, mi)
            else:
                ans += dfs(i + 1, i, k - 1, min(mi, nums[i] - nums[j]))
            ans %= mod
            return ans

        mod = 10**9 + 7
        n = len(nums)
        nums.sort()
        return dfs(0, n, k, inf)
speed

复杂度分析

指标
时间complexity depends on iterating through n elements for each subsequence length up to k, with potential nested loops for difference calculations. Space complexity depends on maintaining a DP table of size n by k.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Sorting the array hints at simplifying subsequence power calculation.

  • question_mark

    Using a DP table suggests a state transition approach for subsequences of length k.

  • question_mark

    Watch for overlapping subsequences to avoid redundant computations.

warning

常见陷阱

外企场景
  • error

    Not sorting nums, which complicates minimum absolute difference calculation.

  • error

    Incorrect DP state transition, leading to missed subsequences or wrong sums.

  • error

    Failing to aggregate only subsequences of exact length k.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Compute maximum instead of minimum absolute difference for subsequences of length k.

  • arrow_right_alt

    Return sum of powers for all subsequences up to length k instead of exactly k.

  • arrow_right_alt

    Handle subsequences with additional constraints, such as even sum or bounded elements.

help

常见问题

外企场景

求出所有子序列的能量和题解:状态·转移·动态规划 | LeetCode #3098 困难