0
点赞
收藏
分享

微信扫一扫

剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】


目录

  • ​​1、题目​​
  • ​​2、思路​​
  • ​​3、c++代码​​
  • ​​4、java代码​​

1、题目

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

示例:

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

提示:

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

2、思路

(双指针) 剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_leetcode

给定一个​​nums​​数组,要求我们将所有的奇数调整到数组的前半部分,将所有的偶数调整到数组的后半部分。

样例:


剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_数组_02

如样例所示,​​nums = [1,2,3,4]​​​,调整过后的​​nums​​​为​​[1,3,2,4]​​,下面来讲解双指针的做法。

我们定义两个指针,分别从​​nums​​数组的首尾开始,往中间扫描。扫描时保证第一个指针前面的数都是奇数,第二个指针后面的数都是偶数。

具体过程如下:

  • 1、定义两个指针​​l​​​和​​r​​​,初始化​​l = 0​​​,​​r = nums.size() - 1​​。
  • 2、​​l​​指针不断往后走,直到遇到第一个偶数为止。
  • 3、​​r​​指针不断往前走,直到遇到第一个奇数为止。
  • 4、交换​​num[l]​​​和​​num[r]​​​,循环执行​​2​​​,​​3​​​,​​4​​​过程,直到​​l == r​​​时退出​​while​​循环。

图示:


剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_leetcode_03

时间复杂度分析: 两个指针总共走过的长度是剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_java_04剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_java_04是​​​nums​​​数组的长度,因此时间复杂度是剑指 Offer 21. 调整数组顺序使奇数位于偶数前面【c++/java详细题解】_leetcode

3、c++代码

class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int l = 0, r = nums.size() - 1;
while(l < r)
{
while(l < r && nums[l] % 2 == 1) l++;
while(l < r && nums[r] % 2 == 0) r--;
swap(nums[l],nums[r]);
}
return nums;
}
};

4、java代码

class Solution {
public int[] exchange(int[] nums) {
int l = 0, r = nums.length - 1;
while(l < r)
{
while(l < r && nums[l] % 2 == 1) l++;
while(l < r && nums[r] % 2 == 0) r--;
int tmp = nums[l];
nums[l] = nums[r];
nums[r] = tmp;
}
return nums;
}
}

原题链接: ​​剑指 Offer 21. 调整数组顺序使奇数位于偶数前面​​


举报

相关推荐

0 条评论