selected_coding_interview/docs/1480. 一维数组的动态和.md
此题使用求和公式暴力求解的效率较低,因为包含大量重复计算。考虑借助「前一个动态和 $f(i-1)$ 」来计算得到「当前动态和 $f(i)$ 」,此题被约化为一个简单动态规划问题。
上为动态图,下为静态图,内容一致。
<,,,,,,,>
细心的我们发现,如果原地修改 nums ,可以避免新建 dp 带来的内存开销。但通常情况下,不应改变输入变量,因此不建议原地修改 nums 数组。
class Solution:
def runningSum(self, nums: List[int]) -> List[int]:
dp = [0] * len(nums)
dp[0] = nums[0]
for i in range(1, len(nums)):
dp[i] = dp[i - 1] + nums[i]
return dp
class Solution {
public int[] runningSum(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
for (int i = 1; i < nums.length; i++) {
dp[i] = dp[i - 1] + nums[i];
}
return dp;
}
}
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
vector<int> dp(nums.size());
dp[0] = nums[0];
for (int i = 1; i < nums.size(); i++) {
dp[i] = dp[i - 1] + nums[i];
}
return dp;
}
};
nums 使用线性时间。dp 是必须使用的空间,此处不计入。