输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
示例:
输入: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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。