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

题目描述

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

示例:

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

提示:

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

算法

(双指针,位运算)) $O(n)$

使用两个指针 $l、r$,$l$ 从前往后扫描找到偶数时停止,$r$ 从后往前扫描找到奇数时停止,此时如果 $l < r$ 则交换两个数,循环以上过程直到 $l >= r$ 为止。

小技巧:使用位运算和 $1$ 取 & 的结果判断是奇数还是偶数,在计算机中 $%$ 运算是非常慢的。

时间复杂度

$O(n)$

空间复杂度

$O(1)$

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while (l < r) {
while (l < r && (nums[l] & 1) == 1) l ++ ;
while (l < r && (nums[r] & 1) == 0) r -- ;
if (l < r) swap(nums[l], nums[r]);
}
return nums;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/09/剑指 Offer/剑指 Offer 21. 调整数组顺序使奇数位于偶数前面/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.