LeetCode_按奇偶排序数组【简单】
正题:
题目:
给你一个整数数组 nums,将 nums 中的的所有偶数元素移动到数组的前面,后跟所有奇数元素。 返回满足此条件的任一数组作为答案。
示例一:
输入:nums = [3,1,2,4]
输出:[2,4,3,1]
解释:[4,2,3,1]、[2,4,1,3] 和 [4,2,1,3] 也会被视作正确答案。
示例二:
输入:nums = [0]
输出:[0]
来源:LeetCode-905.按奇偶排序数组
解题思路:
方法一:两次遍历
思路与算法:
很简单的思路,我们创建一个新的数组result用来保存排序完毕后的数组。根据题意,我们只需要遍历两次数组nums,在第一次遍历时 把所有的偶数依次加入到result中,在第二次遍历时把所有的奇数依次加入到result中。最后返回结果集result即可。
代码如下(示例):
class Solution {
public int[] sortArrayByParity(int[] nums) {
int n = nums.length;
int index = 0;
int[] result = new int[n];
for(int num : nums){
if(num % 2 == 0){
result[index++] = num;
}
}
for (int num : nums){
if(num % 2 == 1){
result[index++] = num;
}
}
return result;
}
}
执行用时:
- 执行用时: 1 ms;
- 内存消耗: 42.6 MB。
方法二:双指针 + 一次遍历
思路与算法: 我们记数组nums的长度为n。在方法一中需要遍历两次nums,第一次遍历时遇到奇数会跳过,第二次遍历时遇到偶数会跳过, 这部分是可以优化的。 我们还是需要创建一个新的长度为n的数组result用来保存排完序后的元素。遍历一遍nums:
- 当遇到偶数时,就从result左侧开始替换元素;
- 当遇到奇数时,就从result右侧开始替换元素。
遍历完成后,result就保存了排序完毕的数组。
代码如下(示例):
class Solution {
public int[] sortArrayByParity(int[] nums) {
int n = nums.length;
int[] result = new int[n];
int left = 0, right = n - 1;
for (int num : nums){
if(num % 2 == 0){
result[left++] = num;
}else {
result[right--] = num;
}
}
return result;
}
}
执行用时:
- 执行用时: 0 ms;
- 内存消耗: 42.6 MB。
方法三:原地交换
思路与算法:
记数组nums的长度为n。我们先从nums的左侧开始遍历,如果遇到的是偶数,就表示这个元素已经排好序了,并且继续从左往右遍历,直到遇到 一个奇数。然后从nums右侧开始遍历,如果遇到的是奇数,就表示这个元素已经排好序了,继续从右往左遍历,直到遇到一个偶数。交换这个奇 数和偶数的位置,并且重复两边的遍历,直到在中间相遇,nums排序完毕。
代码如下(示例):
class Solution {
public int[] sortArrayByParity(int[] nums) {
int left = 0, right = nums.length - 1;
while (left < right){
while (left < right && nums[left] % 2 == 0){
left++;
}
while (left < right && nums[right] % 2 == 1){
right--;
}
if(left < right){
int temp = nums[left];
nums[left] = nums[right];
nums[right] = temp;
left++;
right--;
}
}
return nums;
}
}
执行用时:
- 执行用时: 1 ms;
- 内存消耗: 42.4 MB。
业精于勤,荒于嬉;行成于思,毁于随。——韩愈
|