Wiggle Sort I/II

508. Wiggle Sort

Tag:

Quick Sort, Sort, Array

Description:

Given an unsorted array nums, reorder it in-place such that

nums[0] <= nums[1] >= nums[2] <= nums[3]…

Main Idea:

The main idea is to discuss when index is odd or even. When index is odd, it should be nums[i-1] < nums[i] > nums[i+1]; When index is even, it should be nums[i-1] > nums[i] < nums[i+1]. If the condition is not satisfied, swap nums[i] with nums[i-1].

Time/Space Cost:

Time Cost:   O ( n ) \ O(n)
Space Cost:   O ( 1 ) \ O(1)

Code:

class Solution {
public:
    /*
     * @param nums: A list of integers
     * @return: nothing
     */
    void wiggleSort(vector<int> &nums) {
        // write your code here
        for(int i = 1; i < nums.size(); i++)
        {
            // when index is odd, it should be nums[i-1] < nums[i] > nums[i+1]
            // when index is even, it should be nums[i-1] > nums[i] < nums[i+1]
            if( (i%2 == 1 && nums[i] < nums[i-1]) ||
                (i%2 == 0 && nums[i] > nums[i-1]))
                swap(nums, i, i-1);
        }
        
    }
    
    void swap(vector<int> &nums, int i, int j){
        int tmp = nums[i];
        nums[i] = nums[j];
        nums[j] =tmp;
        return;
    }
};

Follow-up Problem: 507. Wiggle Sort II

Description:

Given an unsorted array nums, reorder it such that

nums[0] < nums[1] > nums[2] < nums[3]…

Main Idea:

The main ides is partition the array by median. Then left part is smaller than median, while the right part is larger than median.

Tips/Notes:

Time/Space Cost:

Time Cost:   O ( n ) \ O(n)
Space Cost:   O ( 1 ) \ O(1)

Code:

class Solution {
public:
    /*
     * @param nums: A list of integers
     * @return: nothing
     */
    int QuickSort(vector<int> &nums, int start, int end) {
        if(start >= end) {
            return nums[start];
        }
        int mid = nums[start + (end - start)/2];
        int left = start, right = end;
        while(left <= right) {
            while(left <= right && nums[left] < mid) {
                left++;
            }
            while(left <= right && nums[right] > mid) {
                right--;
            }
            if(left <= right) {
                swap(nums[left], nums[right]);
                left++; right--;
            }
        }
        if(right >=  nums.size()/2) {
            return QuickSort(nums, start, right);
        }
        else if(left <= nums.size()/2) {
            return QuickSort(nums, left, end);
        }
        return nums[nums.size()/2];
    }
    void wiggleSort(vector<int> &nums) {
        // write your code here
        int mid = QuickSort(nums, 0, nums.size() - 1);
        int i = 0;
        int o = 1;
        int e = (nums.size()-1) % 2 == 0 ? nums.size()-1 : nums.size()-2;
        while (i < nums.size()) {
            if (nums[i] > mid && (i % 2 == 0 || i > o)) {
                swap(nums[i], nums[o]);
                o += 2;
                continue;
            }
            if (nums[i] < mid && (i % 2 == 1 || i < e)) {
                swap(nums[i], nums[e]);
                e -= 2;
                continue;
            }
            i++;
        }
    }
};

发布了28 篇原创文章 · 获赞 1 · 访问量 436

猜你喜欢

转载自blog.csdn.net/Zahb44856/article/details/103998085
今日推荐