题目链接

牛客网

题目描述

需要保证奇数和奇数,偶数和偶数之间的相对位置不变,这和书本不太一样。例如对于 [1,2,3,4,5],调整后得到 [1,3,5,2,4],而不能是 {5,1,3,4,2} 这种相对位置改变的结果。

21. 调整数组顺序使奇数位于偶数前面 - 图1

解题思路

方法一:

创建一个新数组,时间复杂度 O(N),空间复杂度 O(N)。

  1. class Solution {
  2. public:
  3. void reOrderArray(vector<int> &array) {
  4. int N = array.size();
  5. if(N==0||N==1)
  6. return;
  7. vector<int> nums(array.begin(),array.end());
  8. int s = 0,j=0; // s记录奇数的个数
  9. for(int i=0;i<N;i++){
  10. if(!isEven(array[i]))
  11. s++;
  12. }
  13. for(int i=0;i<N;i++){
  14. if(isEven(nums[i])){
  15. array[s++] = nums[i];
  16. }else{
  17. array[j++] = nums[i];
  18. }
  19. }
  20. }
  21. // 判断奇偶数
  22. bool isEven(int n){
  23. return n%2==0;
  24. }
  25. };

方法二:双指针(如果不考虑相对位置)

LeetCode

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

21. 调整数组顺序使奇数位于偶数前面 - 图2

class Solution {
public:
    vector<int> exchange(vector<int>& nums) {
        int N = nums.size();
        if(N==0||N==1)
            return nums;
        int left=0,right = N-1;
        while(left<right){
            if(!isEven(nums[left])){
                left++;
                continue;
            }
            if(isEven(nums[right])){
                right--;
                continue;
            }
            swap(nums[left],nums[right]);
        }
        return nums;

    }
    bool isEven(int n){
        return n%2==0;
    }
};
  • 时间复杂度 O(N/2)
  • 空间复杂度 O(1)