力扣(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 容器;

  經過測試,此方法很笨拙,但是也實現了功能,佔用時間及內存如下:
在這裏插入圖片描述
  佔用內存有點大,但是效率竟然還可以…

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 了
在這裏插入圖片描述

  想了又想,跟參考的解法只有一點區別,就是變量的類型不同,我定義的是 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;
    }
};

  就不過多解釋了,直接上運行結果,如下
在這裏插入圖片描述
  本次的結果算是一個居中值,內存沒有那麼大,運行時間也很快。

  猜測原因應該是數組,返回值的類型全部都是 int 類型,我用一個 size_t 類型來取其中的數據,就會存在耗時操作。

3.4 分析

  爲什麼一個變量的差別, 就這麼大呢?去查了一下,有一些結果,但是不是那麼詳細,如下:

  第二個講的稍微要清楚一些,就是說 int 是固定 4 個字節,但是 size_t 是根據機器操作系統等來確定的,感覺耗時的原因就在這裏,更深的原因還有待繼續研究。

4 總結

  1. 很早就有前輩給我推薦力扣(LeetCode)刷題了,但是那個時候來嘗試了一下,發現怎麼着都不會,太尷尬了,我太菜了;
  2. 現在又來了,是有一定的基礎知識,來進一步的提高一下自己,不會的也會去查查資料什麼的;
  3. 感覺這個很好玩,我自己也買了數獨,有事沒事做一做,鍛鍊鍛鍊腦子,還有自己的思維,讓自己保持活力;
  4. 好了,到這裏就結束了,我們下次見~,週末愉快,祝大家一切順利!

如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,記得一鍵三連哦(點贊、收藏、留言),您的支持就是對我最大的鼓勵,謝謝您嘞!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章