leetcode 283 题解
很经典的双指针题目。
题目
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
提示:
1 <= nums.length <= $10^4$
$-2^{31}$ <= nums[i] <= $2^{31} - 1$
思路
暴力解法
用vector的erase操作直接删除0,然后在结尾用push操作补0。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| class Solution { public: void moveZeroes(vector<int>& nums) { if(nums.size() == 1) return; int count = 0, index = 0; auto it = nums.begin(); while(it != nums.end()) { int temp = *it; if(temp==0) { count++; nums.erase(it); continue; } else ++it; } for (int i = 0; i < count; i++) nums.push_back(0); return; } };
|
双指针
用一个变量 i 指示当前位置,一个变量 j 指示即将要被替换的位置,即双指针。当 nums[i] 为非0数时,将 nums[i] 替换到 nums[j] ,然后 j++ 。最后,从 j 开始到数组结束,全部替换成 0 。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| class Solution { public: void moveZeroes(vector<int>& nums) { int i = 0, j = 0; for (i = 0; i < nums.size(); i++) { if (nums[i] != 0) { nums[j] = nums[i]; j++; } } for (i = j; i < nums.size(); i++) { nums[i] = 0; } return; } };
|