目录
题目
输入一个长度为 n 整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面部分,所有的偶数位于数组的后面部分,对奇数和奇数,偶数和偶数之间的相对位置不做要求,但是时间复杂度和空间复杂度必须如下要求。
数据范围:0≤n ≤50000,数组中每个数的值0≤val ≤10000
要求:时间复杂度O(n),空间复杂度O(1)
思路
双指针遍历,从数组两头向中间靠近。左边的为奇数指针 i ,右边的为偶数指针 j 。
i 在没有遇到偶数时,就向右移动,遇到偶数立即停止; j 再没有遇到奇数时,向左边移动,遇到奇数时,进行奇偶指针元素交换,交换之后切换到奇数指针工作。全程i < j。
解决方案
public class Test { public static int[] reOrderArrayTwo(int[] array) { int i = 0; //奇数指针 int j = array.length - 1; //偶数指针 while (i < j) { //当 i>= j 时,左右两侧都已遍历。结束循环 while (i < j && array[i] % 2 == 1) { // i ,遇到奇数跳过,指向偶数 i++; } while (i < j && array[j] % 2 == 0) { // j ,遇到偶数跳过,指向奇数 j--; } //交换奇数偶数,奇数放到偶数前 int tmp = array[i]; array[i] = array[j]; array[j] = tmp; } return array; } }
输入数组
[1,3,5,6,7] 和 [1,4,4,3]
输出结果
时间复杂度:o(n),遍历数组一次
空间复杂度:o(1),一个交换数组值的tmp
总结
1.利用双指针双向遍历,可解决数组越界等问题。
2.在同一数组内交换元素,可以使空间复杂度保持o(1)。
3.题目对于奇数与奇数、偶数与偶数之间相对位置不做要求,故也可以采用:题目练习:调整数组顺序使奇数位于偶数前面(一) 的方法。