码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2021-02-08 11:47:07      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:com   ase   turn   info   位置   fast   没有   offer   ++   

技术图片

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

第一时间想到的是额外数组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;
    }
}

 

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

标签:com   ase   turn   info   位置   fast   没有   offer   ++   

原文地址:https://www.cnblogs.com/zccfrancis/p/14381658.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!