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