焦茶/夏コミ本に収録です 小宇宙
366 字
2 分钟
奇偶排序数组
毕业那会面试遇到的算法题,有双指针的思想就不难实现 O(n) 的时间复杂度,后来发现是 LeetCode 上的原题 905. 按奇偶排序数组
题目
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。
返回满足此条件的 任一数组 作为答案。
示例
输入:nums = [3,1,2,4]输出:[2,4,3,1]解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。思路
用两个指针分别指向数组头尾,判断两个指针元素是否符合一奇一偶
- 是,交换元素并且指针往中间移动
- 不是,判断指针是否需要往中间移动
public int[] sortArrayByParity(int[] nums) { // 用两个指针分别指向数组头和尾 int start = 0; int end = nums.length - 1; // 指针相遇停止循环 while (start < end) { // 判断指针指向的数组元素是否符合一奇一偶,符合就交换元素并且指针同时往中间移动 if (nums[start] % 2 != 0 && nums[end] % 2 == 0) { int temp = nums[start]; nums[start] = nums[end]; nums[end] = temp; start++; end--; continue; } // 如果 start 指针是偶数,不需要交换,往中间移动找下一个元素 if (nums[start] % 2 == 0) start++; // 如果 end 指针是奇数,不需要交换,往中间移动找下一个元素 if (nums[end] % 2 != 0 ) end--; } return nums;}