[刷题] LeetCode 283 Move Zeros
Posted cxc1357
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[刷题] 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
以上是关于[刷题] LeetCode 283 Move Zeros的主要内容,如果未能解决你的问题,请参考以下文章