LeetCode 题解工作台

一个数组所有前缀的分数

定义一个数组 arr 的 转换数组 conver 为: conver[i] = arr[i] + max(arr[0..i]) ,其中 max(arr[0..i]) 是满足 0 的所有 arr[j] 中的最大值。 定义一个数组 arr 的 分数 为 arr 转换数组中所有元素的和。 给你一个下标从 …

category

2

题型

code_blocks

5

代码语言

hub

3

相关题

当前训练重点

中等 · 前缀和

bolt

答案摘要

我们用变量 记录数组 中前 个元素的最大值,用数组 记录数组 中前 个元素的分数。 接下来,遍历数组 ,对于每个元素 ,我们更新 ,即 $mx = \max(mx, nums[i])$,然后更新 ,如果 $i = 0$,则 $ans[i] = nums[i] + mx$,否则 $ans[i] = nums[i] + mx + ans[i - 1]$。

Interview AiBox logo

Interview AiBox 实时 AI 助手,陪你讲清 前缀和 题型思路

试试 AiBox 面试助手arrow_forward
description

题目描述

定义一个数组 arr 的 转换数组 conver 为:

  • conver[i] = arr[i] + max(arr[0..i]),其中 max(arr[0..i]) 是满足 0 <= j <= i 的所有 arr[j] 中的最大值。

定义一个数组 arr 的 分数 为 arr 转换数组中所有元素的和。

给你一个下标从 0 开始长度为 n 的整数数组 nums ,请你返回一个长度为 n 的数组 ans ,其中 ans[i]是前缀 nums[0..i] 的分数。

 

示例 1:

输入:nums = [2,3,7,5,10]
输出:[4,10,24,36,56]
解释:
对于前缀 [2] ,转换数组为 [4] ,所以分数为 4 。
对于前缀 [2, 3] ,转换数组为 [4, 6] ,所以分数为 10 。
对于前缀 [2, 3, 7] ,转换数组为 [4, 6, 14] ,所以分数为 24 。
对于前缀 [2, 3, 7, 5] ,转换数组为 [4, 6, 14, 12] ,所以分数为 36 。
对于前缀 [2, 3, 7, 5, 10] ,转换数组为 [4, 6, 14, 12, 20] ,所以分数为 56 。

示例 2:

输入:nums = [1,1,2,4,8,16]
输出:[2,4,8,16,32,64]
解释:
对于前缀 [1] ,转换数组为 [2] ,所以分数为 2 。
对于前缀 [1, 1],转换数组为 [2, 2] ,所以分数为 4 。
对于前缀 [1, 1, 2],转换数组为 [2, 2, 4] ,所以分数为 8 。
对于前缀 [1, 1, 2, 4],转换数组为 [2, 2, 4, 8] ,所以分数为 16 。
对于前缀 [1, 1, 2, 4, 8],转换数组为 [2, 2, 4, 8, 16] ,所以分数为 32 。
对于前缀 [1, 1, 2, 4, 8, 16],转换数组为 [2, 2, 4, 8, 16, 32] ,所以分数为 64 。

 

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 109
lightbulb

解题思路

方法一:前缀和

我们用变量 mxmx 记录数组 numsnums 中前 ii 个元素的最大值,用数组 ans[i]ans[i] 记录数组 numsnums 中前 ii 个元素的分数。

接下来,遍历数组 numsnums,对于每个元素 nums[i]nums[i],我们更新 mxmx,即 mx=max(mx,nums[i])mx = \max(mx, nums[i]),然后更新 ans[i]ans[i],如果 i=0i = 0,则 ans[i]=nums[i]+mxans[i] = nums[i] + mx,否则 ans[i]=nums[i]+mx+ans[i1]ans[i] = nums[i] + mx + ans[i - 1]

时间复杂度 O(n)O(n),其中 nn 为数组 numsnums 的长度。忽略答案数组的空间消耗,空间复杂度 O(1)O(1)

1
2
3
4
5
6
7
8
9
10
class Solution:
    def findPrefixScore(self, nums: List[int]) -> List[int]:
        n = len(nums)
        ans = [0] * n
        mx = 0
        for i, x in enumerate(nums):
            mx = max(mx, x)
            ans[i] = x + mx + (0 if i == 0 else ans[i - 1])
        return ans
speed

复杂度分析

指标
时间complexity is O(n) because each element is processed once. Space complexity is O(n) for storing the prefix scores array. The solution uses constant extra space beyond the output.
空间Depends on the final approach
psychology

面试官常问的追问

外企场景
  • question_mark

    Expecting you to track a running maximum rather than recomputing for each prefix.

  • question_mark

    Looking for O(n) linear time solution instead of nested prefix loops.

  • question_mark

    Observing if you handle large numbers and long arrays correctly.

warning

常见陷阱

外企场景
  • error

    Recomputing the maximum for every prefix instead of maintaining a running maximum.

  • error

    Incorrectly summing conversion values, missing doubling or prefix rules.

  • error

    Failing to handle edge cases where nums has one element or all identical values.

swap_horiz

进阶变体

外企场景
  • arrow_right_alt

    Compute the minimum instead of maximum for each prefix and sum conversion values.

  • arrow_right_alt

    Return only the final total score of the entire array instead of all prefixes.

  • arrow_right_alt

    Apply a similar conversion logic for a 2D matrix row-wise using prefix maximums.

help

常见问题

外企场景

一个数组所有前缀的分数题解:前缀和 | LeetCode #2640 中等