力扣(LeetCode)刷题 - 名称:1480.一维数组的动态和;类型:简单;实现方式:C++

道阻且长,行则将至。埋头苦干,不鸣则已,一鸣惊人!加油,骚年!

1 题目介绍

  原题目链接: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) {
		
    }
};

2 题目分析

  首先我仔细的阅读了几遍题目,然后又看了一下下边给的几个示例,发现第 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;

3 开始解题

3.1 第一次尝试

  先上代码,再分析一下

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 容器;

  经过测试,此方法很笨拙,但是也实现了功能,占用时间及内存如下:
力扣(LeetCode)刷题 - 名称:1480.一维数组的动态和;类型:简单;实现方式:C++_第1张图片
  占用内存有点大,但是效率竟然还可以…

3.2 第二次尝试

  此次尝试是在看了大家的题解之后,理解他们的思路,然后再次运行实践,此次代码如下

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 了
力扣(LeetCode)刷题 - 名称:1480.一维数组的动态和;类型:简单;实现方式:C++_第2张图片

  想了又想,跟参考的解法只有一点区别,就是变量的类型不同,我定义的是 size_t 类型,而原代码用的 int 类型,于是有了第三次尝试,本次也和参考的代码完全一致。

3.3 第三次尝试

  本次尝试代码和第二次只有变量类型不同,具体代码如下:

class Solution {
public:
    vector<int> runningSum(vector<int>& nums) {
        for(int i = 1; i < nums.size(); i++){
            nums[i] += nums[i - 1];
        }
        return nums;
    }
};

  就不过多解释了,直接上运行结果,如下
力扣(LeetCode)刷题 - 名称:1480.一维数组的动态和;类型:简单;实现方式:C++_第3张图片
  本次的结果算是一个居中值,内存没有那么大,运行时间也很快。

  猜测原因应该是数组,返回值的类型全部都是 int 类型,我用一个 size_t 类型来取其中的数据,就会存在耗时操作。

3.4 分析

  为什么一个变量的差别, 就这么大呢?去查了一下,有一些结果,但是不是那么详细,如下:

  • c++z中size_t和int
  • size_t和int区别

  第二个讲的稍微要清楚一些,就是说 int 是固定 4 个字节,但是 size_t 是根据机器操作系统等来确定的,感觉耗时的原因就在这里,更深的原因还有待继续研究。

4 总结

  1. 很早就有前辈给我推荐力扣(LeetCode)刷题了,但是那个时候来尝试了一下,发现怎么着都不会,太尴尬了,我太菜了;
  2. 现在又来了,是有一定的基础知识,来进一步的提高一下自己,不会的也会去查查资料什么的;
  3. 感觉这个很好玩,我自己也买了数独,有事没事做一做,锻炼锻炼脑子,还有自己的思维,让自己保持活力;
  4. 好了,到这里就结束了,我们下次见~,周末愉快,祝大家一切顺利!

如果文章内容有误,麻烦评论/私信多多指教,谢谢!如果觉得文章内容还不错,记得一键三连哦(点赞、收藏、留言),您的支持就是对我最大的鼓励,谢谢您嘞!

你可能感兴趣的:(#,LeetCode)