Given an unsorted array nums
, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]...
.
Example:
Input: nums = [3,5,2,1,6,4]
Output: One possible answer is [3,5,1,6,2,4]
這道題讓我們求擺動排序,跟 Wiggle Sort II 相比起來,這道題的條件寬松很多,只因為多了一個等號。由於等號的存在,當數組中有重復數字存在的情況時,也很容易滿足題目的要求。這道題先來看一種時間復雜度為 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]....,可以總結出如下規律:
當i為奇數時,nums[i] >= nums[i - 1]
當i為偶數時,nums[i] <= nums[i - 1]
那么只要對每個數字,根據其奇偶性,跟其對應的條件比較,如果不符合就和前面的數交換位置即可,參見代碼如下:
解法二:
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]); } } } };
Github 同步地址:
https://github.com/grandyang/leetcode/issues/280
類似題目:
參考資料:
https://leetcode.com/problems/wiggle-sort/
https://leetcode.com/problems/wiggle-sort/discuss/71692/Java-O(N)-solution
https://leetcode.com/problems/wiggle-sort/discuss/71688/4-lines-O(n)-C%2B%2B
https://leetcode.com/problems/wiggle-sort/discuss/71693/My-explanations-of-the-best-voted-Algo