“`java
时间复杂度为O(n),空间复杂度为1
class Solution {
public int[] exchange(int[] nums) {
// 使用双指针的思想即可。
// 左边指针寻找偶数,右边指针寻找偶数,当遇到相同的时候,则进行交换,然后继续找
if (nums==null||nums.length==0){
return nums;
}
int left=0;
int right=nums.length-1;
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
left, right = 0, len(nums) - 1
while left < right:
while left < right and nums[left] & 1 == 1: left += 1
while left < right and nums[right] & 1 == 0: right -= 1
if left < right:
nums[left] = nums[left] ^ nums[right]
nums[right] = nums[left] ^ nums[right]
nums[left] = nums[left] ^ nums[right]
return nums
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
if len(nums) == 0:
return nums
l, r = 0, len(nums) - 1
while l < r:
while l < r and nums[l] % 2 == 1:
l += 1
while l < r and nums[r] % 2 == 0:
r -= 1
tmp = nums[l]
nums[l] = nums[r]
nums[r] = tmp
return nums
class Solution {
public:
vector<int> exchange(vector<int>& nums) {
int sz = nums.size();
int l = -1, r = sz;
while(l<r)
{
do
l++;
while(l<r&&nums[l]%2==1);
do
r--;
while(l<r&&nums[r]%2==0);
if(l<r)
swap(nums[l], nums[r]);
}
return nums;
}
};
共以下 22 个回答
“`java
//双指针
class Solution {
public int[] trainingPlan(int[] actions) {
if (actions == null || actions.length == 0) {
return actions;
}
//使用双指针,从前面找偶数,从后面找奇数,互换
for (int i = 0, j = actions.length – 1; i < j; ) { while ((actions[i] & 1) == 1 && i < j) { i++; } while ((actions[j] & 1) == 0 && i < j) { j--; } if (i < j) { int tmp = actions[i]; actions[i] = actions[j]; actions[j] = tmp; i++; j--; } } return actions; } }
class Solution {
public int[] exchange(int[] nums) {
int i=0,j=nums.length-1;
while(i<j){
while(i<j&&nums[i]%2!=0){
i++;
}
while(i<j&&nums[j]%20){
j–;
}
if(i<j){
int tmp=nums[i];
nums[i] = nums[j];
nums[j]=tmp;
i++;
j–;
}
}
return nums;
}
}
时间on
“`java
时间复杂度为O(n),空间复杂度为1
class Solution {
public int[] exchange(int[] nums) {
// 使用双指针的思想即可。
// 左边指针寻找偶数,右边指针寻找偶数,当遇到相同的时候,则进行交换,然后继续找
if (nums==null||nums.length==0){
return nums;
}
int left=0;
int right=nums.length-1;
// 保存左边的,然后把右边放入左边,然后再将tmp放入右边
int temp=nums[left];
nums[left]=nums[right];
nums[right]=temp;
}
}
双指针,时间复杂度O(n) 空间复杂度O(1)
“`C++& nums) {
void exchangeOddEven(vector
int left = 0; // 左指针从数组起始位置出发
int right = nums.size() – 1; // 右指针从数组末尾位置出发
}
“`
【思路】类似快排,利用双指针在一次遍历数组的过程中交换左边的偶数与右边的奇数
【复杂度】时间O(n),空间O(1)
快排
时间复杂度为O(numsSize),空间复杂度为O(1)
双指针
时间:O(n)
空间:O(1)
快排,从左寻找第一个偶数的下标,从右寻找第一个奇数的下标,进行交互,重复
双指针。
时间复杂度:O(n)
空间复杂度:O(1)
时间复杂度O(n)
思想:按照快排的思想,交换两侧数字,从大小数字,变成奇偶数字
时间复杂度O(n) 空间复杂度O(1)
时间复杂度:O(n)
空间复杂度:O(1)
c++实现,结果不计入空间复杂度 exchange(vector & nums) { res(len);
vector
int len = nums.size();
vector
int left = 0,right=len-1;
for(int num:nums)
{
if(num%21)
{
res[left++]=num;
}
else res[right–]=num;
}
return res;
}
时间复杂度:O(n)
空间复杂度:O(1)
MY快排思想