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

08/07 08:58
阅读数 23

点击上方“图解面试算法”,选择“星标”公众号

重磅干货,第一时间送达

大家好,我是程序员吴师兄。

今天分享的题目来源于 LeetCode 上的剑指 Offer 系列 面试题 21.调整数组顺序使奇数位于偶数前面,这道题目既可以使用 首尾双指针,也可以使用 快慢双指针,本文采用首尾双指针法。

题目链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/

一、题目描述

输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。

示例:

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

提示:

<= nums.length <= 50000
1 <= nums[i] <= 10000

二、题目解析

  • 定义头指针 left ,尾指针 right

  • left 一直往右移,直到它指向的值为偶数

  • right 一直往左移, 直到它指向的值为奇数

  • 交换 nums[left]nums[right]

  • 重复上述操作,直到 left == right 为止

三、动画描述

四、图片描述

五、参考代码

class Solution {
    public int[] exchange(int[] nums) {
        // 定义头指针 left ,尾指针 right ,临时变量 tmp 
        int left = 0, right = nums.length - 1, tmp;

        //重复操作,直到 left == right 为止
        while(left < right) {
            // nums[left] & 1 与 nums[right] & 1 都是用来判断数字奇偶性。
            // left 一直往右移,直到它指向的值为偶数
            while(left < right && (nums[left] & 1) == 1) left++;
               // right 一直往左移, 直到它指向的值为奇数
            while(left < right && (nums[right] & 1) == 0) right--;

            // 交换 nums[left] 和 nums[right]*
            tmp = nums[left];
            nums[left] = nums[right];
            nums[right] = tmp;
        }
        return nums;
    }
}

六、复杂度分析

时间复杂度

时间复杂度为 O(N)  ,其中 N 为数组 nums 的长度。

空间复杂度

空间复杂度为 O(1)

七、相关标签

  • 链表

  • 双指针

八、参考阅读

  • https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/ti-jie-shou-wei-shuang-zhi-zhen-kuai-man-shuang-zh/

  • https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/ 评论区

---


     
     
由 五分钟学算法 原班人马打造的公众号:图解面试算法,现已正式上线!
接下来我们将会在该公众号上,为大家 分享优质的算法解题思路 ,坚持每天一篇原创文章的输出,视频动画制作不易,感兴趣的小伙伴可以关注点赞一下哈!

本文分享自微信公众号 - 五分钟学算法(CXYxiaowu)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部