[LeetCode](面試題21)調整數組順序使奇數位於偶數前面

題目

輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有奇數位於數組的前半部分,所有偶數位於數組的後半部分。

示例:

輸入:nums = [1,2,3,4]
輸出:[1,3,2,4] 
注:[3,1,2,4] 也是正確的答案之一。

提示:

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