977. Squares of a Sorted Array
- Submissions
// C++ runtime:112 ms memory:14.3 MB
class Solution {
public:
vector<int> sortedSquares(vector<int>& A) {
vector<int> res(A.size());
for (int i = A.size()-1, ll = 0, rr = i; i >=0; i--) res[i] = A[rr]<-A[ll]? A[ll]*A[ll++]:A[rr]*A[rr--];
return res;
}
};
// Java runtime:6 ms memory:42.9 MB
class Solution {
public int[] sortedSquares(int[] A) {
int[] r = new int[A.length];
for(int d=A.length-1,u=0,i=d; i>=0; i--) r[i] = -A[u]>A[d] ? A[u]*A[u++] : A[d]*A[d--];
return r;
}
}
为什么同一份代码java比c++快;
905. Sort Array By Parity
- Submissions:
遍历一遍就好了
832. Flipping an Image
- Submissions:
// C++ runtime:16 ms memory:10 MB
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
vector<vector<int> > res(A.size());
for (int i = 0; i < A.size(); i++) {
vector<int> tmp(A[i].size());
for (int j = 0; j < A[i].size(); j++) {
tmp[j] = A[i][A[i].size()-1-j]^1;
}
res[i] = tmp;
}
return res;
}
};
950. Reveal Cards In Increasing Order
- Description
桌子上有一副牌,每个牌上有一个数字。每次抽出顶部一张牌,再把下一张放牌堆底;重复知道所有牌都抽出。问牌原先是什么顺序才能使抽出的牌的数字是递增的? - Submissions:
怎么模拟这个抽一张再把下一张丢牌堆底这个操作?直接找规律有些难,我想了一会没搞出来。discuss里好像有一个找规律的题解。
可以用队列模拟这个操作,先初始化队列为 0~n-1;每次队头就是要被抽出的牌,再把下一张放队尾;抽出的牌是递增的,然后再将排好的递增数字依次放入就行了。
// C++ runtime:12 ms memory:9.3 MB
class Solution {
public:
vector<int> deckRevealedIncreasing(vector<int>& deck) {
sort(deck.begin(), deck.end());
queue<int> q;
for (int i = 0; i < deck.size(); i++) q.push(i);
vector<int> res(deck.size());
for (int i = 0; i < deck.size(); i++) {
res[q.front()] = deck[i];
q.pop();
if (!q.empty()) {
q.push(q.front());
q.pop();
}
}
return res;
}
};
985. Sum of Even Numbers After Queries
- Submissions:
// C++ runtime:176 ms memory:28.5 MB
class Solution {
public:
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int> >& queries) {
int sum = 0;
for (int i = 0; i < A.size(); i++) {
if (A[i]%2 == 0) sum += A[i];
}
vector<int> res(queries.size());
for (int i = 0; i < queries.size(); i++) {
if (A[queries[i][1]]%2) {
if (queries[i][0]%2) sum += queries[i][0]+A[queries[i][1]];
}else{
sum += queries[i][0]%2? -A[queries[i][1]]:queries[i][0];
}
A[queries[i][1]] += queries[i][0];
res[i] = sum;
}
return res;
}
};
别人简短的:
vector<int> sumEvenAfterQueries(vector<int>& A, vector<vector<int>>& qs, vector<int> res = {}) {
int sum = accumulate(begin(A), end(A), 0, [](int s, int a) { return s + (a % 2 == 0 ? a : 0); });
for (auto &q : qs) {
if (A[q[1]] % 2 == 0) sum -= A[q[1]];
A[q[1]] += q[0];
if (A[q[1]] % 2 == 0) sum += A[q[1]];
res.push_back(sum);
}
return res;
}
561. Array Partition I
- Submissions:
花时间
// C++ runtime:72 ms memory:11.8 MB
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
sort(nums.begin(), nums.end());
int res = 0;
for (int i = 0 ; i < nums.size(); i+=2) {
res += nums[i];
}
return res;
}
};
花空间(基于计数排序,实际空间比差不多,因为上面的快排)
// C++ runtime:52 ms memory:11.7 MB
class Solution {
public:
int arrayPairSum(vector<int>& nums) {
int dis[20001], res = 0;
memset(dis, 0, sizeof(dis));
for (int i = 0; i < nums.size(); i++)
dis[nums[i]+10000]++;
bool flag = true;
for (int i = 0; i < 20001; i++) {
while (dis[i]) {
if (flag) res += i-10000;
flag = !flag;
dis[i]--;
}
}
return res;
}
};
922. Sort Array By Parity II
- Submissions:
// C++ runtime:96 ms memory:12.2 MB
class Solution {
public:
vector<int> sortArrayByParityII(vector<int>& A) {
int i = 0, j = 1;
while (i < A.size()) {
while(i < A.size() && A[i]%2 == 0) i+=2; // 条件不能写反了,之前写反了找了好久的错。
while( j < A.size() && A[j]%2) j+=2;
if (i < A.size()) {
swap(A[i], A[j]);
i+=2;j+=2;
}
}
return A;
}
};
509. Fibonacci Number
- Submissions:
// C++ runtime:4 ms memory:8.4 MB (为什么还有很多人比我内存少)
class Solution {
public:
int fib(int N) {
if (N==0) return 0;
if (N==1) return 1;
int F0 = 0, F1 = 1;
while (N > 1) {
F1 = F0+F1;
F0 = F1-F0;
N--;
}
return F1;
}
};
867. Transpose Matrix
- Submissions:
// the principle of zip;没理解 python3
class Solution:
def transpose(self, A: 'List[List[int]]') -> 'List[List[int]]':
return list(map(lambda *arg: arg, *A))
969. Pancake Sorting
- Description
有一串范围1-n长度为n的数列,每次可将 1-k个数翻转;要使数列递增,求翻转的方法(输出k取值数组)? - Submissions:
for i in (n~2)每次找到i的位置j,翻转1-j,再翻转1-i就能将i翻转到正确的位置。
// c++
class Solution {
public:
vector<int> pancakeSort(vector<int>& A) {
vector<int> res;
for (int i = A.size(); i > 1; i--) {
auto j = find(A.begin(), A.end(), i);
res.push_back(j+1-A.begin());
reverse(A.begin(), j+1);
res.push_back(i);
reverse(A.begin(), A.begin()+i);
}
return res;
}
};
这个题目也可以求最小翻转次数,参考 https://blog.csdn.net/autocyz/article/details/42368147
766. Toeplitz Matrix
- Submissions:
之前傻乎乎的遍历对角线;只要每个元素与右下角元素相等就行了。
// c++
class Solution {
public:
bool isToeplitzMatrix(vector<vector<int> >& matrix) {
int n = matrix.size(), m = matrix[0].size();
for (int i = 0; i < matrix.size()-1; i++) {
for (int j = 0; j < matrix[0].size()-1; j++) {
if (matrix[i][j] != matrix[i+1][j+1]) return false;
}
}
return true;
}
};
442. Find All Duplicates in an Array
- Description
有一串范围1-n长度为n的数列,每次数字要么出现两次要么一次,输出出现两次的数字,在O(n)的复杂度里面? - Submissions:
可以利用范围在1-n,开一个标记的数组f,初始为0,出现一次数字i就可以把f[i]置为负1;如果碰到一个数字i且a[i]为负1,那么i就出现了两次。还可以将空间优化一下,直接用原数组标记;如果出现数字i就把nums[i-1]置为-nums[i]。
//c++
class Solution {
public:
vector<int> findDuplicates(vector<int>& nums) {
vector<int> res;
for(int i = 0; i < nums.size(); i++) {
if (nums[abs(nums[i])-1] > 0) {
nums[abs(nums[i])-1] *= -1;
}else{
res.push_back(abs(nums[i]));
}
}
return res;
}
};
566. Reshape the Matrix
- Submissions:
// c++
class Solution {
public:
vector<vector<int>> matrixReshape(vector<vector<int>>& nums, int r, int c) {
if (nums.size()*nums[0].size() != r*c) return nums;
vector<vector<int>> res(r, vector<int>(c));
for (int i = 0; i < nums.size(); i++) {
for (int j = 0; j < nums[0].size(); j++) {
int m = i*nums[0].size()+j;
res[m/c][m%c] = nums[i][j];
}
}
return res;
}
};
442. Find All Duplicates in an Array
- Description
有两个数组,a数组的和与b数组的差为h;两个数组交换一个数使两个数组相等,求这两个数。 - Submissions:
先求a与b的差h,排序;先假设这两数为a[i]和b[j] (i=j=0),如果a[i]-a[j]>h,那么j++;否则i++,知道a[i]-a[j]==h。
// c++
class Solution {
public:
vector<int> fairCandySwap(vector<int>& A, vector<int>& B) {
int dist = 0;
vector<int> res(2);
for (int i = 0; i < A.size(); i++) {
dist += A[i];
}
for (int i = 0; i < B.size(); i++) {
dist -= B[i];
}
dist /= 2;
sort(A.begin(), A.end());
sort(B.begin(), B.end());
int i = 0, j = 0;
while (i < A.size() && j < B.size()) {
if (A[i] - B[j] == dist) break;
if (A[i] - B[j] > dist) {
j++;
}else{
i++;
}
}
res[0] = A[i];
res[1] = B[j];
return res;
}
};
解法二:
Calculate dif = (sum(A) - sum(B)) / 2
We want find a pair (a, b) with a = b + dif
O(N)
//c++
vector<int> fairCandySwap(vector<int> A, vector<int> B) {
int dif = (accumulate(A.begin(), A.end(), 0) - accumulate(B.begin(), B.end(), 0)) / 2;
unordered_set<int> S(A.begin(), A.end());
for (int b: B)
if (S.count(b + dif))
return {b + dif, b};
}
238. Product of Array Except Self
- Description
res[i] = nums[0]*…*nums[i-1]nums[i+1]…num[n]. - Submissions:
题解点这
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int ll = 1, rr = 1, n = nums.size();
vector<int> res(n, 1);
for (int i = 0; i < n; i++) {
res[i] *= ll;
ll *= nums[i];
res[n-i-1] *= rr;
rr *= nums[n-i-1];
}
return res;
}
};
283. Move Zeroes
- Description
把一个数组里面所有的0提到最后,且其他数的顺序不变。 - Submissions:
冒泡的思想。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int r = nums.size(), i = 0, j = r;
while (i < r) {
if (!nums[i]) j = min(i, j);
if (nums[i] && i > j) {
swap(nums[i], nums[j++]);
}
i++;
}
}
};