class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
vector<int> B;
for(int i = 0; i < A.size(); i++){
if(A[i] % 2 == 0){
B.push_back(A[i]);
A[i]=-1;
}
}
for(int i = 0; i < A.size(); i++){
if(A[i]==-1)
continue;
else
B.push_back(A[i]);
}
return B;
}
};
My Solution
再开一个vector,两次for循环
Better Solution
i表示从前向后第一个不是偶数的下标,j表示从后向前第一个不是奇数的下标;
每次循环交换在vector中以i,j为下标表示的元素。
Attention
(1)c++中 vector内存机制:
-》 capacity(),返回对象缓冲区(vector维护的内存空间)实际申请的空间大小
-》 size(),返回当前对象缓冲区存储数据的个数
-》在调用push_back时,若当前容量已经不能够放入容器(即capacity=size),那么vector会重新申请一块内存,把之前的内存里的元素拷贝到新的内存当中,然后把push_back的元素拷贝到新的内存中,最后要析构原有的vector并释放原有的内存。所以说这个过程的效率是极低的,为了避免频繁的分配内存,C++每次申请内存都会增长,例如之前是4,那么重新申请后就是8,以此类推。(不一定成倍增长,和编译器有关。)
static const auto kSpeedUp = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return nullptr;
}();
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& arr) {
int i=0,j=arr.size()-1;
while(i<j)
{
while(i<j && arr[i]%2==0)
i++;
while(i<j && arr[j]%2!=0)
j--;
if(i<j)
swap(arr[i++],arr[j--]);
}
return arr;
}
};