当前位置: 首页剑指offer刷题第七期问题详情 【排序算法运用】剑指 Offer 21. 调整数组顺序使奇数位于偶数前面 本问题对应课程链接:剑指offer刷题第七期 要求: 1、请打卡你的解题代码,如果能简单说一下思路则简单说一下思路。 2、给出你代码所用的时间复杂度和空间复杂度
共以下 11 个回答
双指针
时间复杂度O(n)
空间复杂度O(1)
解题思路
– 在数组的两端,左右指针,左边找到第一个偶数后停止,右边找到第一个奇数后停止,进行交换
【题解1】自己的解法,利用的是外面的while循环,去找到左边找到第一个偶数后停止,右边找到第一个奇数后停止
【题解2】利用内部while,去实现找到第一个的效果,比外部统一循环要快一点
思路: 使用 快慢指针
class Solution {
public int[] trainingPlan(int[] actions) {
int l = 0, r = actions.length-1;
while(l < r){
while(l < r && actions[l] % 2 1){
l++;
}
while(l < r && actions[r] % 2 0){
r–;
}
if(l < r){
int temp = actions[l];
actions[l] = actions[r];
actions[r] = temp;
}
}
return actions;
}
}
时间:O(n)
空间:O(1)
思路:双指针
时间复杂度:O(n)
空间复杂度:O(1)
左指针找奇数,右指针找偶数,交换即可。
时间复杂度O(N),空间复杂度O(1)。
//方法1 ,创造奇偶数列表最后合并 odds = new ArrayList<>(); even = new ArrayList<>();
public int[] trainingPlan(int[] actions) {
int n = actions.length;
List
List
//方法2双指针思路
public int[] trainingPlan(int[] actions) {
int n = actions.length;
int i = 0 , j = n – 1 , tmp;
while(i < j) {
//指针i向右遍历数组,j向左遍历
while(i < j && (actions[i] & 0x01) 1) i++;
while(i < j && (actions[j] & 0x01) 0) j–;
tmp = actions[i];
actions[i] = actions[j];
actions[j] = tmp;
}
return actions;
}
方法一
On O1
方法二
On
O1