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

头尾指针法

大体思想如下

  • 建立头指针 l e f t left left和尾指针 r i g h t right right,分别指向当前最左侧奇数元素的索引和最右侧的偶数元素的索引。
  • 初始化 l e f t left left r i g h t right right,分别为首索引和尾索引
  • l e f t left left不断右移,直到指向偶数元素
  • r i g h t right right不断左移,直到指向奇数元素
  • 交换 n u m s [ l e f t ] nums[left] nums[left] n u m s [ r i g h t ] nums[right] nums[right]
// 可以考虑用头尾指针法
// 头指针指向奇数,尾指针指向偶数
// 头指针对数组进行遍历,遇到奇数就遍历下一个
// 遇到偶数就与尾指针交换,尾指针左移,重复此过程,直到头指针
// 指向奇数
// 测试用例,长度为1的数组,全为奇数或者偶数的数组
class Solution {
    public int[] exchange(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
            while(left < right && (nums[left] & 0x1) == 0){
                // swap(nums[left], nums[right]);
                int temp = nums[left];
                nums[left] = nums[right];
                nums[right] = temp;
                right--;
            }
            left++;
        }
        return nums;
    }
}
// 测试用例,长度为1的数组,全为奇数或者偶数的数组
class Solution {
    public int[] exchange(int[] nums) {
        int left = 0;
        int right = nums.length - 1;
        while(left < right){
        	// left右移,直到遇到偶数元素
            if((nums[left] & 0x1) == 1){
                left++;
                continue;
            }
            // right,直到遇到奇数元素
            if((nums[right] & 0x1) == 0){
                right--;
                continue;
            }
            // 交换
            int temp = nums[left];
            nums[left] = nums[right];
            nums[right] = temp;
            // 首尾指针都移动
            left++;
            right--;
        }
        return nums;
    }
}

算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n),遍历和交换最多要 n n n
  • 空间复杂度: O ( 1 ) O(1) O(1),所引入的变量占的空间为常数。

快慢指针法

  • 建立两个指针 f a s t fast fast s l o w slow slow,分别指向下一个奇数元素和下一个奇数元素应当存放的位置
  • f a s t fast fast s l o w slow slow均初始化为 0 0 0
  • f a s t fast fast右移,直到遇到奇数元素。将其与 s l o w slow slow指向的元素交换

// 测试用例,长度为1的数组,全为奇数或者偶数的数组
class Solution {
    public int[] exchange(int[] nums) {
        // slow指向
        int fast = 0;
        int slow = 0;
        while(fast < nums.length){
            if((nums[fast] & 0x1) == 1){
                int temp = nums[slow];
                nums[slow] = nums[fast];
                nums[fast] = temp;
                slow++;
            }
            fast++;
        }
        return nums;
    }
}

算法复杂度

  • 时间复杂度: O ( n ) O(n) O(n),遍历和交换最多要 n n n
  • 空间复杂度: O ( 1 ) O(1) O(1),所引入的变量占的空间为常数。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值