1. 程式人生 > 實用技巧 >283:移動零(C++)

283:移動零(C++)

題目地址:https://leetcode-cn.com/problems/move-zeroes/

題目描述:

給定一個數組nums,編寫一個函式將所有0移動到陣列的末尾,同時保持非零元素的相對順序。

題目示例:

示例

輸入: [0,1,0,3,12]
輸出: [1,3,12,0,0]

說明:

  1. 必須在原陣列上操作,不能拷貝額外的陣列。
  2. 儘量減少操作次數。

解題思路:

思路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++; }*/ } };