题目描述
题目分析
在写简单题放松,看到这道题第一个想法是用STL库函数,虽然知道大概要用双指针之类的,但是库函数爽哇。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
stable_sort(nums.begin(), nums.end(), [](const auto &a, const auto &b) -> bool {
if (a == 0) {
return false;
}
if (b == 0) {
return true;
}
return false;
});
}
};
虽然慢,但是我觉得这样写出来还是挺开心的。基本没动脑子。我也不知道stable_sort
函数是怎么实现的(可能需要以后看STL源码了),但是我知道只需要定义小于运算,等于运算是通过a
小于b
为假并且b
小于a
实现的,通过自定义小于运算符,如果代码紧凑一点,我觉得三行是可以解决的。
但是显然上面的解法是O(nlogn)
的
双指针应该是可以觉得这种问题的,于是我写了个另一个无脑代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int i = 0;
for (int j = 0; j < n; ++j) {
if (nums[j]) {
nums[i++] = nums[j];
}
}
for (; i < n; ++i) nums[i] = 0;
}
};
上面代码应该是O(n)
的,但是我看题解发现人家用的是交换,这样的思想我觉得比较巧妙了,通过交换将0
不断往后积累。如果是0多1少,这样的做法更好。但是我的代码如果是1多0少我的复杂度更低。