題目
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
示例:
輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。
提示:
1 <= nums.length <= 50000
1 <= nums[i] <= 10000
解題思路
維護兩個指針,指針 i 指向數組起始位置,指針 j 指向數組末尾。如果指針 i 指向的數字是奇數,就向後移動,指針 j 指向的數字是偶數,就向前移動。如果指針 i 指向的數字是偶數,指針 j 指向的數字是奇數,就交換兩個數字,直到最終指針 i 到指針 j 的後面。
算法流程:
- 1)初始化: i , j 雙指針,分別指向數組 nums 左右兩端;
- 2)循環交換: 當 i = j 時跳出;
- 2.1)指針 i 遇到奇數,則執行 i=i+1 跳過,直到找到偶數;
- 2.2)指針 j 遇到偶數,則執行 j=j−1 跳過,直到找到奇數;
- 2.3)指針 i 遇到偶數,指針 j 遇到奇數,則交換 nums[i] 和 nums[j] 值;
- 3)返回值: 返回已修改的 nums 數組。
複雜度分析:
時間複雜度:O(N)。N 爲數組 nums 長度,雙指針 i, j 共同遍歷整個數組。
空間複雜度:O(1)。雙指針 i, j 使用常數大小的額外空間。
代碼
class Solution {
public int[] exchange(int[] nums) {
int i = 0;
int j = nums.length-1;
while(i < j){
if(nums[i]%2 != 0) i++;
else if(nums[j]%2 == 0) j--;
else if(nums[i]%2 == 0 && nums[j]%2 != 0){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}
}
return nums;
}
}