剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
题目:
思路:
【1】题目要求也简单,奇数在左半边,偶数在右半边,那么基于此,采用双指针才是最快,也是最省事的,毕竟只要遍历一次(这里指的是总量,但是代码用的循环会多一些)。拿到就将两个交换,然后各自移动一步,进行下一次循环。
【2】当然还有两次遍历的方法,但是本身就是基于双指针+一次遍历演化来的,因为将双指针才分开,故需要两次遍历。
代码展示:
//时间1 ms击败100% //内存49.3 MB击败50.40% //时间复杂度O(N) //空间复杂度O(1) class Solution { public int[] exchange(int[] nums) { int left = 0, right = nums.length-1,temp; while (left<right){ //先找出最左边的偶数 while (nums[left] % 2 == 1 && left < right){ left++; } //再找出最右边的奇数 while (nums[right] % 2 == 0 && left < right){ right--; } //两者位置互换 temp = nums[left]; nums[left++] = nums[right]; nums[right--] = temp; } return nums; } }
当然还有另一种写法,但是貌似没有很有优化的地方,不过就是原数组没有变动:
//时间1 ms击败100% //内存49.2 MB击败60.13% //时间复杂度:O(n),其中 n 为数组 nums 的长度。只需遍历 nums 一次。 //空间复杂度:O(1)。结果不计入空间复杂度。,如果计入就是O(n) class Solution { public int[] exchange(int[] nums) { int n = nums.length; int[] res = new int[n]; int left = 0, right = n - 1; for (int num : nums) { if (num % 2 == 1) { res[left++] = num; } else { res[right--] = num; } } return res; } }