剑指 Offer 21. 调整数组顺序使奇数位于偶数前面

题目:

思路:

【1】题目要求也简单,奇数在左半边,偶数在右半边,那么基于此,采用双指针才是最快,也是最省事的,毕竟只要遍历一次(这里指的是总量,但是代码用的循环会多一些)。拿到就将两个交换,然后各自移动一步,进行下一次循环。

【2】当然还有两次遍历的方法,但是本身就是基于双指针+一次遍历演化来的,因为将双指针才分开,故需要两次遍历。

代码展示:

//时间1 ms击败100%
//内存49.3 MB击败50.40%
//时间复杂度O(N)
//空间复杂度O(1)
class Solution {
    public int[] exchange(int[] nums) {
        int left = 0, right = nums.length-1,temp;
        while (left<right){
            //先找出最左边的偶数
            while (nums[left] % 2 == 1 && left < right){
                left++;
            }
            //再找出最右边的奇数
            while (nums[right] % 2 == 0 && left < right){
                right--;
            }
            //两者位置互换
            temp = nums[left];
            nums[left++] = nums[right];
            nums[right--] = temp;
        }
        return nums;
    }
}

 当然还有另一种写法,但是貌似没有很有优化的地方,不过就是原数组没有变动:

//时间1 ms击败100%
//内存49.2 MB击败60.13%
//时间复杂度:O(n),其中 n 为数组 nums 的长度。只需遍历 nums 一次。
//空间复杂度:O(1)。结果不计入空间复杂度。,如果计入就是O(n)
class Solution {
    public int[] exchange(int[] nums) {
        int n = nums.length;
        int[] res = new int[n];
        int left = 0, right = n - 1;
        for (int num : nums) {
            if (num % 2 == 1) {
                res[left++] = num;
            } else {
                res[right--] = num;
            }
        }
        return res;
    }
}

 

posted @ 2023-02-10 16:50  忧愁的chafry  阅读(11)  评论(0编辑  收藏  举报