道阻且长,行则将至。埋头苦干,不鸣则已,一鸣惊人!加油,骚年!
原题目链接:1480.一维数组的动态和
题目参考上述链接,简单描述如下:
给你一个数组 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]
使用 C++ 方式实现,题目给的基础框架如下:
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
}
};
首先我仔细的阅读了几遍题目,然后又看了一下下边给的几个示例,发现第 n 位的数据,都等于第 (n - 1) + n 位的数据。我列个表格,这样更容易理解
nums下标 | 0 | 1 | 2 | 3 |
---|---|---|---|---|
原数据 | 1 | 2 | 3 | 4 |
计算过程 | 1 | 1 + 2 | 1 + 2 + 3 | 1 + 2 + 3 + 4 |
计算结果 | 1 | 3 | 6 | 10 |
由上表可知,n 的计算结果等于(n - 1)加上 n 的值,比如 3 = 1 + 2;6 = 3 + 3;10 = 6 + 4;
先上代码,再分析一下
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
int temp;
vector<int> vArray;
vArray.push_back(nums.at(0));
temp = nums.at(0);
for(size_t i = 1; i < nums.size(); i++){
temp += nums.at(i);
vArray.push_back(temp);
}
return vArray;
}
};
首先我定义了一个 int 类型的变量 temp ,用来做中转;然后有定义了一个 int 类型的容器 vArray ,用来作为返回值;
接下来就是先压入数组首元素到 vArray 中,然后使用 for 循环,求 n-1 与 n 位之和,然后再放到 temp 中,然后把 temp 压入到 vArray 中;
等 for 循环结束后,就直接返回 vArray 容器;
经过测试,此方法很笨拙,但是也实现了功能,占用时间及内存如下:
占用内存有点大,但是效率竟然还可以…
此次尝试是在看了大家的题解之后,理解他们的思路,然后再次运行实践,此次代码如下
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
for(size_t i = 1; i < nums.size(); i++){
nums[i] += nums[i - 1];
}
return nums;
}
};
本次修改,全部利用现有变量,不在另外新建局部变量,这样可以节省空间,然后 for 循环中变量的类型,我还是用的 size_t ;
本次代码看起来简洁,又很好理解,比如这句核心代码,下边两行是等价的,但是很好的解释了我们之前的分析思路,第 n 位的等于第 n 位加上第 n-1 位;
nums[i] += nums[i - 1];
nums[i] = nums[i] + nums[i - 1];
结果很明显,本次占用的内存空间小了,但是又有另外一个问题,时间长了,如下图,直接到 8ms 了
想了又想,跟参考的解法只有一点区别,就是变量的类型不同,我定义的是 size_t 类型,而原代码用的 int 类型,于是有了第三次尝试,本次也和参考的代码完全一致。
本次尝试代码和第二次只有变量类型不同,具体代码如下:
class Solution {
public:
vector<int> runningSum(vector<int>& nums) {
for(int i = 1; i < nums.size(); i++){
nums[i] += nums[i - 1];
}
return nums;
}
};
就不过多解释了,直接上运行结果,如下
本次的结果算是一个居中值,内存没有那么大,运行时间也很快。
猜测原因应该是数组,返回值的类型全部都是 int 类型,我用一个 size_t 类型来取其中的数据,就会存在耗时操作。
为什么一个变量的差别, 就这么大呢?去查了一下,有一些结果,但是不是那么详细,如下:
第二个讲的稍微要清楚一些,就是说 int 是固定 4 个字节,但是 size_t 是根据机器操作系统等来确定的,感觉耗时的原因就在这里,更深的原因还有待继续研究。
如果文章内容有误,麻烦评论/私信多多指教,谢谢!如果觉得文章内容还不错,记得一键三连哦(点赞、收藏、留言),您的支持就是对我最大的鼓励,谢谢您嘞!