LeetCode.922-按奇偶排序数组 II(Sort Array By Parity II)
这是悦乐书的第354次更新,第379篇原创
01 看题和准备
今天介绍的是LeetCode
算法题中Easy
级别的第216
题(顺位题号是922
)。给定非负整数的数组A,A中的一半整数是奇数,而剩下的一半是偶数。
对数组进行排序,以便每当A[i]为奇数时,i就是奇数; A[i]是偶数,i就是偶数。
你可以返回满足此条件的任何答案数组。例如:
输入:[4,2,5,7]
产出:[4,5,2,7]
说明:[4,7,2,5],[2,5,4,7],[2,7,4,5]也将被接受。
注意:
-
2 <= A.length <= 20000
-
A.length%2 == 0
-
0 <= A [i] <= 1000
02 第一种解法
使用两个List
将奇数、偶数分别存起来,创建一个新的数组result
,如果索引为奇数,就从存奇数的List
中取值作为新数组的元素,反之就从存偶数的List
中取值作为新数组的元素。
此解法的时间复杂度是O(N)
,空间复杂度是O(N)
。
public int[] sortArrayByParityII(int[] A) {
List<Integer> odd = new ArrayList<Integer>();
List<Integer> even = new ArrayList<Integer>();
for (int num : A) {
if (num%2 == 0) {
even.add(num);
} else {
odd.add(num);
}
}
int j = 0, k = 0;
int[] result = new int[A.length];
for (int i=0; i<result.length; i++) {
if (i%2 == 0) {
result[i] = even.get(j++);
} else {
result[i] = odd.get(k++);
}
}
return result;
}
03 第二种解法
我们也可以直接从A
中取值,同样是新建一个result
数组,对result
数组新建两个索引,一个从0开始,只做偶数索引,另一个从1开始,只做奇数索引,分两次遍历A数组,将对应的元素和索引值存入result
中。
此解法的时间复杂度是O(N)
,空间复杂度是O(N)
。
public int[] sortArrayByParityII2(int[] A) {
int[] result = new int[A.length];
int j = 0;
for (int i=0; i<A.length; i++) {
if (A[i]%2 == 0) {
result[j] = A[i];
j += 2;
}
}
int k = 1;
for (int i=0; i<A.length; i++) {
if (A[i]%2 != 0) {
result[k] = A[i];
k += 2;
}
}
return result;
}
04 第三种解法
针对上面的第二种解法,我们也可以只使用一次循环。
此解法的时间复杂度是O(N)
,空间复杂度是O(N)
。
public int[] sortArrayByParityII3(int[] A) {
int[] result = new int[A.length];
int j = 0, k = 1;
for (int i=0; i<A.length; i++) {
if (A[i]%2 == 0) {
result[j] = A[i];
j += 2;
} else {
result[k] = A[i];
k += 2;
}
}
return result;
}
05 第四种解法
双指针。
定义两个指针i和j,i代表偶数索引,从0开始;j代表奇数索引,从n-1开始(n为数组A的length),如果偶数索引位置对应的元素为奇数,且奇数索引位置对应的元素为偶数,就进行元素交换。如果偶数索引位置对应的元素为偶数,偶数索引i就加2,同理,奇数索引位置对应的元素为奇数,奇数索引j就减2,循环结束条件为i不小于n或者j小于1。
此解法的时间复杂度是O(N)
,空间复杂度是O(1)
。
public int[] sortArrayByParityII4(int[] A) {
int i = 0, j = A.length-1, n = A.length;
while (i < n && j >= 1) {
if (A[i]%2 == 1 && A[j]%2 == 0) {
int tem = A[j];
A[j] = A[i];
A[i] = tem;
}
if (A[i]%2 == 0) {
i += 2;
}
if (A[j]%2 == 1) {
j -= 2;
}
}
return A;
}
06 小结
算法专题目前已连续日更超过六个月,算法题文章222+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!