905. Sort Array By Parity
Given an array A
of non-negative integers, return an array consisting of all the even elements of A
, followed by all the odd elements of A
.
You may return any answer array that satisfies this condition.
Example 1:
Input: [3,1,2,4]
Output: [2,4,3,1]
The outputs [4,2,3,1], [2,4,1,3], and [4,2,1,3] would also be accepted.
Note:
1 <= A.length <= 5000
0 <= A[i] <= 5000
Time Limit Exceeded:
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
for(int i = 0; i < A.size(); )
{
if(A[i]%2 == 1)
{
A.push_back(A[i]);
A.erase(A.begin()+i);
}
else
i++;
}
return A;
}
};
Slow version:
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
vector<int> even;
vector<int> odd;
for(int i = 0; i < A.size();i++)
{
if(A[i]%2 == 1)
odd.push_back(A[i]);
else
even.push_back(A[i]);
}
A.erase(A.begin(), A.end());
A.insert(A.end(), even.begin(), even.end());
A.insert(A.end(), odd.begin(), odd.end());
return A;
}
};
using Partition():
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
partition(A.begin(), A.end(), [](int i){return i%2==0;});
return A;
}
};
Performance:
Faster version using sort():
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
sort(A.begin(), A.end(), [](int lhs, int rhs) {
if (lhs % 2 == 1 && rhs % 2 == 0) {
return false; // left is odd, right is even, out of order
} else if (rhs % 2 == 1 && lhs % 2 == 0) {
return true; // left is even, right is odd, OK
} else {
return false;
}
});
return A;
}
};
Useful knowledge:
977. Squares of a Sorted Array
Given an array of integers A
sorted in non-decreasing order, return an array of the squares of each number, also in sorted non-decreasing order.
Example 1:
Input: [-4,-1,0,3,10]
Output: [0,1,9,16,100]
Note:
1 <= A.length <= 10000
-10000 <= A[i] <= 10000
A
is sorted in non-decreasing order.
Slow Version:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
for(int i = 0; i < A.size(); i++)
A[i] = A[i]*A[i];
sort(A.begin(), A.end());
return A;
}
};
Performance:
Two pointers:
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
int p1 = 0; int p2 = A.size()-1;
vector<int> v(A.size());
for(int i = A.size()-1; i >= 0; i--)
{
if(A[p1]<0 && abs(A[p1]) > A[p2]) //First error: A[p1] compares with A[p2] not with A[i]
{
v[i] = A[p1]*A[p1];
p1++;
}
else
{
v[i] = A[p2]*A[p2];
p2--;
}
}
return v;
}
};
Performance:
830. Positions of Large Groups
In a string S
of lowercase letters, these letters form consecutive groups of the same character.
For example, a string like S = "abbxxxxzyy"
has the groups "a"
, "bb"
, "xxxx"
, "z"
and "yy"
.
Call a group large if it has 3 or more characters. We would like the starting and ending positions of every large group.
The final answer should be in lexicographic order.
Example 1:
Input: "abbxxxxzzy"
Output: [[3,6]]
Explanation: "xxxx" is the single
large group with starting 3 and ending positions 6.
Note: 1 <= S.length <= 1000
Slow version:
class Solution {
public:
vector<vector<int>> largeGroupPositions(string S) {
vector<vector<int>> ans;
int start = 0; int end = 0;
S = S + '#'; //in order to avoid S[i+1] being out of array index
for(int i = 0; i < S.length()-1; i++)
{
if(end - start >= 2 && S[i] != S[i+1])
{
ans.push_back({start, end});
}
if(S[i]!=S[i+1])
{
start = end = i+1;
}
else
end++;
}
return ans;
}
};
Performance:
Useful knowledge: