LeetCode283 移动零
facebook Bloomberg面试题
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数
思路一:
将数组中的非0元素取出,然后将取出的元素填补到原先的数组中,最后将数组末尾元素赋值为0;
c++代码
class Solution {
public:
void moveZeroes(vector<int>& nums) {
vector<int> nonZeroElements;
for (int i = 0; i < nums.size(); i++){
if (nums[i])
nonZeroElements.push_back(nums[i]);
}
for (int i = 0; i < nonZeroElements.size(); i++){
nums[i] = nonZeroElements[i];
}
for (int i = nonZeroElements.size(); i < nums.size(); i++)
nums[i] = 0;
}
};
时间复杂度:O(n)
空间复杂度:O(n)
思路二:不使用辅助数组
设置索引k, 在[0…k)中保存所有当前遍历过的非0元素。
遍历nums数组,当遇到非0元素时,把非0元素放到当前k索引对应的位置, k指针向前加1
void moveZeroes(vector<int> & nums){
int k = 0;//nums中,[0...k)的元素均为非0元素
for (int i = 0; i < nums.size(); i++){
if (nums[i]){
nums[k] = nums[i];
k++;
}
}
for (int i = k; i < nums.size(); i++)
nums[i] = 0;
}
思路三: 思路二的方法最后需要将后面的元素赋值为0,如果直接交换,则不需要赋值为0了
void moveZeroes(vector<int> & nums){
int k = 0;
for (int i = 0; i < nums.size(); i++){
if (nums[i]){
swap(nums[k], nums[i]);
k++;
}
}
}
总结:对于一个问题,可以先采取暴力算法求解,然后不断进行优化,使用LeetCode做题时,不能仅仅追求把题目作对,要考虑优化。