刷题记录。解题参考了一些比较好的解答。如有侵权,请联系博主删除。
题目描述
给你一个数组 nums 。数组「动态和」的计算公式为:runningSum[i] = sum(nums[0]…nums[i]) 。
请返回 nums 的动态和。
示例 1:
输入:nums = [1,2,3,4]
输出:[1,3,6,10]
解释:动态和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4] 。
示例 2:
输入:nums = [1,1,1,1,1]
输出:[1,2,3,4,5]
解释:动态和计算过程为 [1, 1+1, 1+1+1, 1+1+1+1, 1+1+1+1+1] 。
示例 3:
输入:nums = [3,1,2,10,1]
输出:[3,4,6,16,17]
提示:
1 <= nums.length <= 1000
-10^6 <= nums[i] <= 10^6
方法一、python列表动态规划
参考Python 为什么要动态规划?【全国最菜这个什么什么】
什么是动态规划?可以简单理解为前一子问题的解,为后一子问题的求解提供了有用的信息,类似于数学中的数学归纳法。
Python解法
思路:利用一个临时变量存储上一元素的和。个人觉得还是动态规划的思路。
class Solution(object):
def runningSum(self, nums):
output = []
temp = 0
for i in nums:
output.append(i + temp)
print("output=",output)
temp += i#temp存储上一个数
print("temp=",temp)
return output
耗时16ms
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
方法二、原数组上动态规划
思路:在原数组上累和。注意从序号为1的数开始计算。因为序号-1会溢出。
Python解法
class Solution(object):
def runningSum(self, nums):
if not nums:#数组为空
return []
for i in range(1,len(nums)):
nums[i]=nums[i]+nums[i-1]
return nums
耗时24ms
Java解法
class Solution {
public int[] runningSum(int[] nums) {
int temp[] = new int[nums.length];
temp[0] = nums[0];
for(int i = 1;i < nums.length ;i++){
temp[i] = temp[i-1] + nums[i];
}
return temp;
}
}
耗时0ms
复杂度分析
时间复杂度:O(n)
空间复杂度:O(1)
总结
这道题主要考察是否在原数组上操作。第二种方法在原数组上操作,无需开辟一个新的列表空间,更优。第一种方法更好理解。
博主比较小白,但是热爱分享。一直感觉自己写代码的能力,算法能力都不太行,所以最近开始刷LeetCode,一方面记录方便自己学习,另一方面给需要的同伴参考。虽然失败并不可怕,但是也希望同伴们少踩一些坑。分析算法挺费劲的,留个赞或评论支持一下博主吧!同时我也非常希望写出更通俗易懂的文章,知识尚浅,如有遗漏或错误,欢迎指正~