剑指 Offer 21. 调整数组顺序使奇数位于偶数前面(C++) 双指针

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

示例:

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

提示:

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

首尾双指针

1、定义头指针 left ,尾指针 right .
2、left 一直往右移,直到它指向的值为偶数
3、right 一直往左移, 直到它指向的值为奇数
4、交换 nums[left] 和 nums[right] .
5、重复上述操作,直到 left == right .

解题思路:

考虑定义双指针 i , j 分列数组左右两端,循环执行:

1、指针 i 从左向右寻找偶数;
2、指针 j 从右向左寻找奇数;
3、将 偶数 nums[i] 和 奇数 nums[j] 交换。
4、可始终保证: 指针 i 左边都是奇数,指针j 右边都是偶数 。
在这里插入图片描述

算法流程:

1、初始化: i , j 双指针,分别指向数组 nums 左右两端;
2、循环交换: 当 i = j时跳出;
2-1、指针 i 遇到奇数则执行 i = i + 1 跳过,直到找到偶数;
2-2、指针 j 遇到偶数则执行 j = j - 1 跳过,直到找到奇数;
2-3、交换 nums[i] 和 nums[j]值;
3、返回值: 返回已修改的 nums 数组。

作者:jyd
链接:https://leetcode-cn.com/problems/diao-zheng-shu-zu-shun-xu-shi-qi-shu-wei-yu-ou-shu-qian-mian-lcof/solution/mian-shi-ti-21-diao-zheng-shu-zu-shun-xu-shi-qi-4/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
    
    
public:
    vector<int> exchange(vector<int>& nums) {
    
    
        int left = 0, right = nums.size() - 1;
        while (left < right) {
    
    
            if ((nums[left] & 1) != 0) {
    
    //(nums[left] & 1) != 0判断是否为奇数
                left ++;
                continue;
            }
            if ((nums[right] & 1) != 1) {
    
    //判断是否为偶数
                right --;
                continue;
            }
            swap(nums[left++], nums[right--]);//两者交换
        }
        return nums;
    }
};

复杂度分析:

时间复杂度 O(N) : N 为数组 nums长度,双指针 i, j 共同遍历整个数组。
空间复杂度 O(1) : 双指针 i, j 使用常数大小的额外空间。

作者:huwt
链接: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/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/qq_30457077/article/details/114987853
今日推荐