这是悦乐书的第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) { Listodd = new ArrayList (); List even = new ArrayList (); 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
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
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
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+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!