1 題目描述
輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。
示例:
輸入:nums = [1,2,3,4]
輸出:[1,3,2,4]
注:[3,1,2,4] 也是正確的答案之一。
提示:
1 <= nums.length <= 500
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
2 解題思路
- 方法:雙指針
考慮定義雙指針 i , j 分列數組左右兩端,循環執行:
(1)指針 i 從左向右尋找偶數;
(2)指針 j 從右向左尋找奇數;
(3)將 偶數 nums[i] 和 奇數 nums[j] 交換。
可始終保證: 指針i 左邊都是奇數,指針 j 右邊都是偶數 。
- 算法流程:
(1)初始化: i , j 雙指針,分別指向數組 nums 左右兩端;
(2)循環交換: 當 i=j 時跳出;
指針 i 遇到奇數則執行 i=i+1 跳過,直到找到偶數;
指針 j 遇到偶數則執行 j=j−1 跳過,直到找到奇數;
(3)交換 nums[i] 和 nums[j] 值;
(4)返回值: 返回已修改的 nums 數組。
- 複雜度分析:
時間複雜度 O(N) : N 爲數組 nums 長度,雙指針 i, j 共同遍歷整個數組。
空間複雜度 O(1) : 雙指針 i, j 使用常數大小的額外空間。
作者:jyd
鏈接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/mian-shi-ti-21-diao-zheng-shu-zu-shun-xu-shi-qi-4/
來源:力扣(LeetCode)
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
3 解決代碼
- 方法:雙指針《Java代碼》
class Solution {
public int[] exchange(int[] nums) {
int left = 0;
int right = nums.length - 1;
int temp = 0;
while(left < right){
//向右找偶數
while(left < right && nums[left] % 2 == 1){
left++;
}
//向左找奇數
while(left < right && nums[right] % 2 == 0){
right--;
}
//交換
temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
}
return nums;
}
}
- 方法:雙指針《python3代碼》
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
left = 0
right = len(nums) - 1
tmp = 0
while left < right:
while left < right and nums[left] % 2 == 1:
left += 1
while left < right and nums[right] % 2 == 0:
right -= 1
nums[left],nums[right] = nums[right], nums[left]
return nums