剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

这道题要求将数组中奇数放前面偶数放后面,不需要排序。

第一时间想到的是额外数组res存结果,遍历原数组奇数存在res前面,偶数存在res后面。

时间复杂度O(n),空间复杂度O(n),好处是没有修改原数组

class Solution {
    public int[] exchange(int[] nums) {
        if (nums.length<2)
        {
            return nums;
        }
        int i=0,j=nums.length-1;
        int[] res = new int [nums.length];
        for(int num:nums)
        {
            if (num%2==1)
                res[i++]=num;
            else
                res[j--]=num;
        }
        return res;
    }
}

在此之后发现可以不用额外数组,采用双指针在原数组上改动,降低空间复杂度。

采用首尾双指针,头指针右移,尾指针左移;

头指针遇到偶数或尾指针遇到奇数,则二者指向数组元素交换,直至头尾指针相遇。

时间复杂度O(n),空间复杂度O(1)

class Solution {
    public int[] exchange(int[] nums) {
        int i=0, j=nums.length-1, tmp;
        while(i < j) 
        {
            while(i < j && (nums[i] % 2) == 1) i++;
            while(i < j && (nums[j] % 2) == 0) j--;
            tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
        return nums;
    }
}    

做完看题解发现也可以用快慢双指针解题。快慢指针都从数组头开始遍历。

快指针fast的作用是向前搜索奇数位置,慢指针low的作用是指向下一个奇数应当存放的位置。

fast 向前移动,当它搜索到奇数时,将它和 nums[low]交换,此时 low向前移动一个位置 。重复,直到 fast指向数组末尾 。

时间复杂度O(n),空间复杂度O(1)

class Solution {
    public int[] exchange(int[] nums) {
        int i=0, j=0, tmp;
        for(i=0;i<nums.length;i++) 
        {
            if (nums[i]%2==1)
            {
                tmp = nums[i];
                nums[i] = nums[j];
                nums[j] = tmp;
                j++;
            }
        }
        return nums;
    }
}

 

posted @ 2021-02-06 15:37  zjcfrancis  阅读(63)  评论(0编辑  收藏  举报