class Solution {
public int[] exchange(int[] nums) {
int l = 0, r = nums.length - 1;
while (l < r) {
while (l < r && (nums[l] & 1) == 1) l++;
while (l < r && (nums[r] & 1) == 0) r--;
if (l < r) {
int t = nums[l];
nums[l] = nums[r];
nums[r] = t;
}
}
return nums;
}
}
# 使用快排的思想,时间复杂度是o(n),空间复杂度是o(1)(不稳定)
def exchange(nums):
if len(nums) == 1:
return nums
i = 0
j = len(nums)-1
while i < j:
while i < j and nums[i] & 1 == 1:
i += 1
while i < j and nums[j] & 1 != 1:
j -= 1
if not i == j:
# 此时i指向左边的偶数,j指向的右边奇数
nums[i] = nums[i] ^ nums[j]
nums[j] = nums[i] ^ nums[j]
nums[i] = nums[i] ^ nums[j]
return nums
class Solution:
def exchange(self, nums: List[int]) -> List[int]:
if not nums:return nums
left , right = 0 , len(nums)-1
while left < right:
while left < right and nums[left]&1 !=0: left +=1
while left < right and nums[right]&1 ==0: right -=1
nums[left],nums[right] = nums[right],nums[left]
return nums
共以下 29 个回答
思路:使用位运算符和双指针结合
移动指针的过程中要判断指针的位置
时间O(n)空间O(1)
双指针
时间:O(n)
空间:O(1)
时间O(n)
空间O(1)
思路:双指针
时间复杂度O(N)
空间复杂度 O(1)
时间O(n)
空间O(1)
双指针,奇偶交换,快排时间复杂度O(n),空间复杂度O(1) 还可用用两个数组专门去存奇偶数,然后再返回 空间复杂度o(n)
快排应用 使用位运算来判断奇偶运算会快点
快排时间复杂度O(n)
空间复杂度O(1)
第一题
双指针
“`c++ exchange(vector & nums) {
class Solution {
public:
vector
int i = 0;
int j = nums.size()-1;
while(i < j) { if(nums[i]%2 != 0) { i++; }else if(nums[j] % 2 == 0) j--; else { swap(nums[i], nums[j]); }
};
“`
快排
//双指针 exchange(vector & nums) {
class Solution {
public:
vector
int l=0,r=nums.size()-1;
while(l<r){
while(l<r&&nums[l]%21) l++;
while(l<r&&nums[r]%20) r–;
if(l<r) swap(nums[l],nums[r]);
}
return nums;
};
自己实现,双指针,时间复杂度O(N)空间复杂度O(1)
快排,优化思路
时间复杂度 O(n)
时间复杂度为O(n),空间复杂度为O(1)
时间:O(n),空间:O(1)