这是悦乐书的第347次更新,第371篇原创
java
今天介绍的是LeetCode
算法题中Easy
级别的第212
题(顺位题号是905)。给定一个非负整数数组A,返回一个由A的全部偶数元素组成的数组,后跟A的全部奇数元素。
你能够返回知足此条件的任何答案数组。例如:算法
输入:[3,1,2,4]
输出:[2,4,3,1]
说明:[4,2,3,1],[2,4,1,3]和[4,2,1,3]也是正确答案。数组
注意:数据结构
1 <= A.length <= 5000指针
0 <= A[i] <= 5000
code
将数组A中的偶数元素存到List
中,奇数元素存到List2
中,建立一个新的数组result
,长度和A
相等,先遍历List
,将偶数元素存入result的前面,再遍历List2
,将奇数元素跟在偶数元素后面。get
此解法的时间复杂度是O(N)
,空间复杂度是O(N)
。it
public int[] sortArrayByParity(int[] A) { List<Integer> list = new ArrayList<Integer>(); List<Integer> list2 = new ArrayList<Integer>(); int n = A.length; for (int i=0; i<n; i++) { if (A[i]%2 == 0 ) { list.add(A[i]); } else { list2.add(A[i]); } } int[] result = new int[n]; int index = 0; for (int j=0; j<list.size(); j++) { result[index++] = list.get(j); } for (int j=0; j<list2.size(); j++) { result[index++] = list2.get(j); } return result; }
针对第一种解法,咱们再简化下,不使用List存数据,咱们分两次遍历处理A中的元素,第一次只要偶数元素,存入新数组result中,第二次只要奇数元素,存入新数组result
中。class
此解法的时间复杂度是O(N)
,空间复杂度是O(N)
。数据结构与算法
public int[] sortArrayByParity2(int[] A) { int n = A.length, index = 0; int[] result = new int[n]; for (int i=0; i<n; i++) { if (A[i]%2 == 0 ) { result[index++] = A[i]; } } for (int j=0; j<n; j++) { if (A[j]%2 != 0 ) { result[index++] = A[j]; } } return result; }
咱们也能够只使用一个循环,不使用额外的数组,借助双指针来解题。
建立两个指针,一个从A的第一位开始,记为i,另一个从A的最后一位开始,记为j。若是i对应的元素为奇数,且j对应的元素是偶数,那么就须要将两个元素互换,互换后,偶数排在了前面,奇数换到了后面。另外咱们还须要让两个指针移动,以便遍历完全部元素,若是i对应的元素为偶数,就跳到下一个元素,同理,若是j对应的元素为奇数,就跳到前一个元素,直到i不小于j。
此解法的时间复杂度是O(N)
,空间复杂度是O(1)
。
public int[] sortArrayByParity3(int[] A) { int i = 0, j = A.length-1; while (i < j) { if (A[i]%2 !=0 && A[j]%2 ==0) { int tem = A[j]; A[j] = A[i]; A[i] = tem; } if (A[i]%2 ==0) { i++; } if (A[j]%2 !=0) { j--; } } return A; }
算法专题目前已连续日更超过六个月,算法题文章215+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。
以上就是所有内容,若是你们有什么好的解法思路、建议或者其余问题,能够下方留言交流,点赞、留言、转发就是对我最大的回报和支持!