[刷题] LeetCode 283 Move Zeros

要求:

将所有的0,移动到vector的后面
比如; [1,3,0,12,5] -> [1,3,12,5,0]

第一版程序,时间、空间复杂度都是O(n)

 1 #include<iostream>
 2 #include<vector>
 3 
 4 using namespace std;
 5 
 6 class Solution{
 7     public:
 8         void moveZeros(vector<int>& nums){
 9             vector<int> nonZeroElements;
10             for( int i = 0 ; i < nums.size() ; i ++ )
11                 if( nums[i] )
12                     nonZeroElements.push_back(nums[i]);
13             for( int i = 0 ; i < nonZeroElements.size() ; i ++ )
14                 nums[i] = nonZeroElements[i];
15             for( int i = nonZeroElements.size() ; i < nums.size() ; i ++ )
16                 nums[i] = 0;
17         }
18 };
19 
20 int main(){
21     int arr[] = {0, 1, 0, 3, 12};
22     vector<int> vec(arr, arr + sizeof(arr)/sizeof(int) );
23     Solution().moveZeros( vec );
24     for( int i = 0 ; i < vec.size() ; i ++ )
25         cout<<vec[i]<<" ";
26     cout<<endl; 
27 }

优化后,空间复杂度O(1)

 1 class Solution{
 2     public:
 3         // 索引 
 4         void moveZeros(vector<int>& nums){
 5             int k = 0;
 6             // 遍历到第i个元素后,保证[0...i)中所有非0元素
 7             // 均按顺序排列在[0...k)中
 8             for( int i = 0 ; i < nums.size() ; i ++ )
 9                 if( nums[i] )
10                     nums[k++] = nums[i];
11             // 将[k...n]赋值为0        
12             for( int i = k ; i < nums.size() ; i ++ )
13                 nums[i] = 0;
14         }
15 }

利用交换,提高效率

1 void moveZeros1(vector<int>& nums){
2     int k = 0;
3         for( int i = 0 ; i < nums.size() ; i ++ )
4             if( nums[i] )
5                 swap( nums[k++] , nums[i] ); 
6 } 

增加判断,提高非零元素较多时的效率

 1 void moveZeros1(vector<int>& nums){
 2     int k = 0;
 3         for( int i = 0 ; i < nums.size() ; i ++ )
 4             if( nums[i] )
 5                 // 指向同一个元素时不交换 
 6                 if( i != k )
 7                     swap( nums[k++] , nums[i] );
 8                     else // i == k 
 9                         k++;
10 }

>> 1 3 2 12 0 0 

猜你喜欢

转载自www.cnblogs.com/cxc1357/p/12327378.html