Given an array nums
, write a function to move all 0
's to the end of it while maintaining the relative order of the non-zero elements.
Example:
Input:[0,1,0,3,12]
Output:[1,3,12,0,0]
Note:
- You must do this in-place without making a copy of the array.
- Minimize the total number of operations
第一次刷leetcode上面的题,这题挺简单的,我开始直接输出不知道为啥有问题,开数组做就没问题了.
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j=0;
for( int i = 0 ; i < nums.size() ; i ++ ) {
if ( nums[i] )
cout << nums[i] << " ";
else
j++;
}
for( int i = 0 ; i < j - 1 ; i ++ ) {
cout << "0" << " ";
}
cout << "0" << endl;
}
};
之后的正确代码及测试如下:
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
void moveZeroes(vector<int>& nums) {
vector<int> a;
for( int i = 0 ; i < nums.size() ; i ++ ) {
if ( nums[i] )
a.push_back( nums[i] );
}
for( int i = 0 ; i < a.size() ; i ++ ) {
nums[i] = a[i];
}
for( int i = a.size() ; i < nums.size() ; i ++ ) {
nums[i] = 0;
}
}
};
int main()
{
int arr[] = {0, 1, 0, 3, 12};
vector<int> vec(arr, arr + sizeof(arr)/sizeof(int) );
Solution().moveZeroes( vec );
for( int i = 0 ; i < vec.size() - 1 ; i ++ )
cout << vec[i] << " ";
cout << vec [ vec.size() - 1 ] << endl;
return 0;
}
优化1:
不用遍历数组置0,直接交换元素即可.
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k=0;
for( int i = 0 ; i < nums.size() ; i ++ ) {
if ( nums[i] )
if ( i != k ) //考虑到全部是非0元素
swap(nums[k ++] , nums[i] );
else
k ++;
}
}
};
详情如下:
优化2:
不开辅助数组以后,降低了空间复杂度,优化代码如下:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int k=0;
for( int i = 0 ; i < nums.size() ; i ++ ) {
if ( nums[i] )
nums[k ++]=nums[i];
}
for( int i = k ; i < nums.size() ; i ++ ) {
nums[i] = 0;
}
}
};
详情如下:
这时候可以看到算法性能得到很大提升,执行用时缩短了很多,排在了很靠前的位置.所以说,一个相同的问题(不管难易程度)应该尽可能地去优化算法,这样可以很大程度地提高性能,而不能只是做出来而已.
第一次刷LeetCode感觉有点不习惯,后面适应了这种C++风格应该就会好很多了.
不仅要学知识做项目,更要多刷题,锻炼自己的思维!