道阻且長,行則將至。埋頭苦幹,不鳴則已,一鳴驚人!加油,騷年!
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 總結
- 很早就有前輩給我推薦力扣(LeetCode)刷題了,但是那個時候來嘗試了一下,發現怎麼着都不會,太尷尬了,我太菜了;
- 現在又來了,是有一定的基礎知識,來進一步的提高一下自己,不會的也會去查查資料什麼的;
- 感覺這個很好玩,我自己也買了數獨,有事沒事做一做,鍛鍊鍛鍊腦子,還有自己的思維,讓自己保持活力;
- 好了,到這裏就結束了,我們下次見~,週末愉快,祝大家一切順利!
如果文章內容有誤,麻煩評論/私信多多指教,謝謝!如果覺得文章內容還不錯,記得一鍵三連哦(點贊、收藏、留言),您的支持就是對我最大的鼓勵,謝謝您嘞!