905. Sort Array By Parity(easy)
题目理解:
一个数组中全是非负数,现在要我们把偶数放在前面,奇数放在偶数之后
首先想到的做法:声明一个新的vector,扫描A两遍,第一遍插入偶数,第二遍插入奇数,返回新的vector
可能优化方向:
- 扫描一遍
- 不分配新空间
于是想到了新的做法:用两个指针标记位置,两个指针分别从前往后和从后往前扫描
比较两个指针所指的数据有4种情况:
情况 | 对应操作 |
---|---|
前奇后偶 | 交换位置,i向后移,j向前移 |
前偶后奇 | 不用交换,i往后移,j往前移 |
前后全是偶数 | 不用交换,i往后移 |
前后全是奇数 | 不用交换,j往前移 |
其实这种做法的本质就是利用两个指针在O(N)时间里达到了和之前扫描两次同样的效果,并且维护了原数组,就不用再分配新的空间了,这也是一种比较常用的做法。
在实际代码里我对i,j移动的时机做了一些改动,结果是一样的,但是看起来可能更简单,也可以分成四种情况逐一用if...else if来写。
accept代码
class Solution {
public:
vector<int> sortArrayByParity(vector<int>& A) {
int i = 0, j = A.size() - 1;
int n = A.size();
while (i < j)
{
if (A[i] % 2 != 0 && A[j] % 2 != 1)
swap(A[i++], A[j--]);
if (A[i] % 2 == 0)
i++;
if (A[j] % 2 == 1)
j--;
}
return A;
}
};
重点:
- 两个指针
832. Flipping an Image
题目
理解:
题目已经说得非常清楚了,就是把有一个只包含0和1的二维数组,先把每一个子数组颠倒顺序,再把0都变成1,1都变成0
解法
就是照着题目说的做就行了。。
可能的优化:
- 位运算来转化0,1
accept代码
class Solution {
public:
vector<vector<int>> flipAndInvertImage(vector<vector<int>>& A) {
int size_A = A.size();
for (int i = 0; i < size_A; i++)
{
int size_of_each_vector = A[i].size();
int p_begin = 0, p_end = size_of_each_vector - 1;
while (p_begin < p_end)
{
A[i][p_begin] ^= 1;
A[i][p_end] ^= 1;
swap(A[i][p_begin++], A[i][p_end--]);
}
if (p_begin == p_end)
A[i][p_begin] ^= 1;
}
return A;
}
};
这里我手动实现了翻转,当然也可以用reverse函数
reverse(vec.begin(),vec.end());
顺便注意一下,当子数组元素个数为奇数的话,最中间的数需要特判一下
通过以后看了一下官方解法,感觉写得非常简洁,学习一下(java版):
class Solution {
public int[][] flipAndInvertImage(int[][] A) {
int C = A[0].length;
for (int[] row: A)
for (int i = 0; i < (C + 1) / 2; ++i) {
int tmp = row[i] ^ 1;
row[i] = row[C - 1 - i] ^ 1;
row[C - 1 - i] = tmp;
}
return A;
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。