mirror of
https://github.com/krahets/LeetCode-Book.git
synced 2026-01-12 00:19:02 +08:00
4.0 KiB
Executable File
4.0 KiB
Executable File
解题思路:
考虑定义双指针 i , j 分列数组左右两端,循环执行:
- 指针
i从左向右寻找偶数; - 指针
j从右向左寻找奇数; - 将 偶数
actions[i]和 奇数actions[j]交换。
可始终保证: 指针 i 左边都是奇数,指针 j 右边都是偶数 。
下图中的
nums对应本题的actions。
算法流程:
- 初始化:
i,j双指针,分别指向数组actions左右两端; - 循环交换: 当
i = j时跳出;- 指针
i遇到奇数则执行i = i + 1跳过,直到找到偶数; - 指针
j遇到偶数则执行j = j - 1跳过,直到找到奇数; - 交换
actions[i]和actions[j]值;
- 指针
- 返回值: 返回已修改的
actions数组。
代码:
x \& 1 位运算 等价于 x \mod 2 取余运算,即皆可用于判断数字奇偶性。
class Solution:
def trainingPlan(self, actions: List[int]) -> List[int]:
i, j = 0, len(actions) - 1
while i < j:
while i < j and actions[i] & 1 == 1: i += 1
while i < j and actions[j] & 1 == 0: j -= 1
actions[i], actions[j] = actions[j], actions[i]
return actions
class Solution {
public int[] trainingPlan(int[] actions) {
int i = 0, j = actions.length - 1, tmp;
while(i < j) {
while(i < j && (actions[i] & 1) == 1) i++;
while(i < j && (actions[j] & 1) == 0) j--;
tmp = actions[i];
actions[i] = actions[j];
actions[j] = tmp;
}
return actions;
}
}
class Solution {
public:
vector<int> trainingPlan(vector<int>& actions)
{
int i = 0, j = actions.size() - 1;
while (i < j)
{
while(i < j && (actions[i] & 1) == 1) i++;
while(i < j && (actions[j] & 1) == 0) j--;
swap(actions[i], actions[j]);
}
return actions;
}
};
复杂度分析:
- 时间复杂度
O(N):N为数组actions长度,双指针i,j共同遍历整个数组。 - 空间复杂度
O(1): 双指针i,j使用常数大小的额外空间。













