283:移動零(C++)
阿新 • • 發佈:2020-08-19
題目地址:https://leetcode-cn.com/problems/move-zeroes/
題目描述:
給定一個數組nums
,編寫一個函式將所有0
移動到陣列的末尾,同時保持非零元素的相對順序。
題目示例:
示例
輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]
說明:
- 必須在原陣列上操作,不能拷貝額外的陣列。
- 儘量減少操作次數。
解題思路:
思路1:遍歷陣列,統計元素0的個數cnt,然後在陣列後追加cnt個0。時間複雜度O(n),空間複雜度O(n);
思路2:雙指標,定義兩個指標i和j遍歷陣列,i和j同時向後移動,當遇到元素0時,j停止移動,i繼續移動直到遇到一個非0元素,然後交換元素nums[j]和nums[i]。時間複雜度O(n),空間複雜度O(1)。
程式原始碼:
思路1
class Solution { public: void moveZeroes(vector<int>& nums) { int cnt = 0; vector<int> res;
//step1:統計元素0個數 for(int i = 0; i < nums.size(); ++i) { if(nums[i] == 0) cnt++; else res.push_back(nums[i]); }//step2:追加元素0 while(cnt--) { res.push_back(0); }
//step3:合併step1和step2陣列中的元素 for(int i = 0; i < nums.size(); ++i) { nums[i] = res[i]; } } };
思路2
class Solution { public: void moveZeroes(vector<int>& nums) {int j = 0; for(int i = 0; i < nums.size(); ++i) { if(nums[i] != 0) { /* if(i != j) { int tmp = nums[j]; nums[j] = nums[i]; nums[i] = tmp; } j++;*/ //程式碼簡寫 swap(nums[j++], nums[i]); } } //另一種style /* int i = 0, j = 0; while(i < nums.size()) { if(nums[i] != 0) { swap(nums[j++], nums[i]); } i++; }*/ } };