- 操作系统:ubuntu22.04
- IDE:Visual Studio Code
- 编程语言:C++11
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。
你可以返回任意满足条件的数组,但必须保证所有奇数在前、偶数在后。
示例:
输入: nums = [1,2,3,4,5]
输出: [1,3,5,2,4] // 或者 [3,5,1,2,4] 等也都是合法输出
解题思路
我们可以使用双指针法来解决这个问题:
- 定义两个指针 left 和 right:
- left 从前往后找偶数;
- right 从后往前找奇数;
- 当找到一个偶数和一个奇数时,交换它们;
直到 left >= right 为止。
这个方法可以做到原地排序,时间复杂度为 O(n),空间复杂度为 O(1)。
实现代码
#include <iostream>
#include <vector>class Solution
{public:std::vector<int> exchange(std::vector<int>& nums){int left = 0;int right = nums.size()-1;while(left < right){while(left<right && nums[left]%2 == 1){left++;}while(left<right && nums[right]%2 == 0){right--;}std::swap(nums[left],nums[right]);}return nums;}
};int main()
{std::vector<int> nums = {2,2,2,1};Solution s;s.exchange(nums); for(auto i : nums){std::cout << i << " ";}
}