Leetcode 922. Sort Array By Parity II , Java解法

Given an array A of non-negative integers, half of the integers in A are odd, and half of the integers are even.

Sort the array so that whenever A[i] is odd, i is odd; and whenever A[i] is even, i is even.

You may return any answer array that satisfies this condition.

Example 1:

Input: [4,2,5,7]
Output: [4,5,2,7]
Explanation: [4,7,2,5], [2,5,4,7], [2,7,4,5] would also have been accepted.

Note:

  1. 2 <= A.length <= 20000
  2. A.length % 2 == 0
  3. 0 <= A[i] <= 1000

Approach #1 Brute Force 我的解法。

class Solution {
    public int[] sortArrayByParityII(int[] A) {
        int len = A.length;
        int[] odd = new int[len/2];
        int[] even = new int[len/2];
        int k = 0;
        int j = 0;
        int[] ans = new int[len];
        for(int i=0;i<len;i++){
            if(A[i]%2 == 0){
                even[j++] = A[i];
            }
            else{
                odd[k++] = A[i];
            }
        }
        
        for(int i= 0; i<len/2; i++){
            ans[2*i] = even[i];
            ans[2*i+1] = odd[i];
        }
        return ans;
    }
}

分析

时间复杂度: O(N)

空间复杂度: O(N)

Approach 2: Read / Write Heads

class Solution {
    public int[] sortArrayByParityII(int[] A) {
        int j = 1;
        for (int i = 0; i < A.length; i += 2)  //先搞定偶数部分
            if (A[i] % 2 == 1) {
                while (A[j] % 2 == 1)          //直到找到一个偶数记下其位置
                    j += 2;

                // Swap A[i] and A[j]          // 交换在奇数位置的偶数和在偶数位置的奇数
                int tmp = A[i];
                A[i] = A[j];
                A[j] = tmp;
            }

        return A;
    }
}

Modify the original array A in place.

Algorithm

For each even i, let's make A[i] even. To do it, we will draft an element from the odd slice. We pass j through the odd slice until we find an even element, then swap. Our invariant is maintained, so the algorithm is correct.

Complexity Analysis

  • Time Complexity: O(N), where NN is the length of A.

  • Space Complexity: O(1). 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值