Wiggle Sort & II

Wiggle Sort

题目连接:https://leetcode.com/problems...数组

这道题容许等号,相对简单,有两种方法:1. sort而后交换奇数位和它下一位的元素,2. 不知足条件的时候直接交换app

能够用递推来讲明一下这么作的正确性:ui

  1. 假设到第i位以前都知足题目要求的关系code

  2. 如今比较第i位和第i+1位element

    • if i == odd:leetcode

      • nums[i] >= nums[i+1],到i+1位都知足条件get

      • nums[i] < nums[i+1],swap(i, i+1),新的nums[i] >= nums[i+1] >= nums[i-1],因此到i+1都知足条件it

    • if i == even:io

      • 同理class

  3. 一直递推到len(nums),因此整个数组都知足条件

public class Solution {
    public void wiggleSort(int[] nums) {
        /* condition: nums[odd] >= nums[even]
         * 1. sort => [1, 2, 3, 4, 5, 6] => swap(i, i+1)
         * 2. swap if a. nums[i] < nums[i+1] i = odd
         *            b. nums[i] > nums[i+1] i = even
         */
        for(int i = 0; i < nums.length - 1; i++) {
            if(i % 2 == 1 && nums[i] < nums[i+1]) swap(nums, i, i+1);
            if(i % 2 == 0 && nums[i] > nums[i+1]) swap(nums, i, i+1);
        }
    }
    
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}

324. Wiggle Sort II

题目连接:https://leetcode.com/problems...

这题不能有等号,并且要求O(N)的时间和O(1)的空间,那么感受只能quick select了。若是没复杂度的要求,先sort也能够,再交叉放入数字也能够。交叉的时候注意是按照[2, 0, 3, 1],降序的。

public class Solution {
    public void wiggleSort(int[] nums) {
        /* quick select: find the middle element
         * 3 way partitions: [h, l, ...]
         * [2, 0, 3, 1], [2, 0, 3, 1, 4]
         */
         n = nums.length;
         int mid = quickSelect(nums, 0, nums.length - 1, nums.length / 2);
         partition(nums, 0, nums.length - 1, mid);
    }
    
    int n;
    private void partition(int[] nums, int l, int r, int mid) {
        int i = l;
        while(i <= r) {
            if(nums[mapping(i)] > mid) swap(nums, mapping(i++), mapping(l++));
            else if(nums[mapping(i)] < mid) swap(nums, mapping(i), mapping(r--));
            else i++;
            
        }
    }
    
    private int mapping(int i) {
        return (2 * i + 1) % (n | 1);
    }
    
    private int quickSelect(int[] nums, int l, int r, int k) {
        if(l >= r)  return nums[l];
        
        int pivot = nums[r];
        int index = l;
        for(int i = l; i < r; i++) {
            if(nums[i] < pivot) swap(nums, i, index++);
        }
        // swap the pivot to the correct position
        swap(nums, index, r);
        if(index == k) return nums[index];
        else if(index < k) return quickSelect(nums, index + 1, r, k);
        else return quickSelect(nums, l, index - 1, k);
    }
    
    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
相关文章
相关标签/搜索