[劍指 offer]--雙指針--面試題21. 調整數組順序使奇數位於偶數前面

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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章