题目
思路1
使用头尾双指针
left
和right
,分别指向最左边和最右边left向右移动,直到遇到了偶数停下
right向左移动,直到遇到了奇数停下
交换left和right的值
如果left大于等于right,说明调整完成
代码
class Solution {
public int[] exchange(int[] nums) {
int length = nums.length;
int left = 0;
int right = length-1;
while (left < right) {
// 找偶书
while (left < right && nums[left] % 2 == 1) {
left++;
}
// 找奇数
while (right > left && nums[right] % 2 == 0) {
right--;
}
// 只有在left小于right情况下才交换
if (left < right) {
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
// 交换完成后顺便指针移动一下
left++;
right--;
}
}
return nums;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(1)\)
思路2
使用快慢指针
初始时候,两个指针都是指向最左端
快指针每次前进一格,如果遇到了奇数,就喝慢指针进行交换,然后两个指针都前进一步
如果两个指针在同一个位置则不进行交换
代码
class Solution {
public int[] exchange(int[] nums) {
int length = nums.length;
int slow = 0;
int fast = 0;
while (slow < length && fast < length) {
if (nums[fast] % 2 == 1) {
if (fast != slow) {
int temp = nums[fast];
nums[fast] = nums[slow];
nums[slow] = temp;
}
slow++;
}
fast++;
}
return nums;
}
}
复杂度分析
- 时间复杂度:\(O(N)\)
- 空间复杂度:\(O(1)\)
原文创作:linzeliang
原文链接:https://www.cnblogs.com/linzeliang1222/p/15422363.html