[LeetCode] Wiggle Sort 擺動排序

 

Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]....html

For example, given nums = [3, 5, 2, 1, 6, 4], one possible answer is [1, 6, 2, 5, 3, 4].segmentfault

 

這道題讓咱們求擺動排序,跟Wiggle Sort II相比起來,這道題的條件寬鬆不少,只由於多了一個等號。因爲等號的存在,當數組中有重複數字存在的狀況時,也很容易知足題目的要求。這道題咱們先來看一種時間複雜度爲O(nlgn)的方法,思路是先給數組排個序,而後咱們只要每次把第三個數和第二個數調換個位置,第五個數和第四個數調換個位置,以此類推直至數組末尾,這樣咱們就能完成擺動排序了,參見代碼以下:數組

 

解法一:post

// Time Complexity O(nlgn)
class Solution {
public:
    void wiggleSort(vector<int> &nums) {
        sort(nums.begin(), nums.end());
        if (nums.size() <= 2) return;
        for (int i = 2; i < nums.size(); i += 2) {
            swap(nums[i], nums[i - 1]);
        }
    }
};

 

這道題還有一種O(n)的解法,根據題目要求的nums[0] <= nums[1] >= nums[2] <= nums[3]....,咱們能夠總結出以下規律:url

當i爲奇數時,nums[i] >= nums[i - 1]spa

當i爲偶數時,nums[i] <= nums[i - 1]code

那麼咱們只要對每一個數字,根據其奇偶性,跟其對應的條件比較,若是不符合就和前面的數交換位置便可,參見代碼以下:htm

 

解法二:blog

// Time Complexity O(n)
class Solution {
public:
    void wiggleSort(vector<int> &nums) {
        if (nums.size() <= 1) return;
        for (int i = 1; i < nums.size(); ++i) {
            if ((i % 2 == 1 && nums[i] < nums[i - 1]) || (i % 2 == 0 && nums[i] > nums[i - 1])) {
                swap(nums[i], nums[i - 1]);
            }
        }
    }
};

 

相似題目:排序

Wiggle Sort II

 

參考資料:

https://segmentfault.com/a/1190000003783283

http://www.cnblogs.com/jcliBlogger/p/4797531.html

 

LeetCode All in One 題目講解彙總(持續更新中...)

相關文章
相關標籤/搜索