leetcode笔记:Wiggle Sort
来源:互联网 发布:网页美工视频教程 编辑:程序博客网 时间:2024/05/23 23:48
一. 题目描述
Given an unsorted array nums, reorder it in-place such that nums[0] <= nums[1] >= nums[2] <= nums[3]
…
For example, given nums = [3, 5, 2, 1, 6, 4]
, one possible answer is [1, 6, 2, 5, 3, 4]
.
二. 题目分析
题目给出一个未排序的数组,调整元素的大小使其满足nums[0] <= nums[1] >= nums[2] <= nums[3]
,要求in-place。
第一种思路是先排序后调整。根据题目的描述,数组的组合方式有多种。因此可以先将数组进行排序,这时候从第3个元素开始,将第奇数个元素与前面一个偶数位置元素进行交换,如将第3个元素和第2个元素交换、将第5个元素和第4个元素交换,以此类推。该方法的时间复杂度为:O(NlogN)
,空间复杂度:O(1)
。
第二中思路是greedy,使用这种方法只需遍历一次数组,时间复杂度为:O(N)
。同样满足题目的in-place要求。我们知道,在题目的描述中可以总结出以下规律:
当下标i
是奇数时,nums[i] >= nums[i - 1]
当下标i
是偶数时,nums[i] <= nums[i - 1]
根据以上规律,只需遍历一遍数组,把不符合的条件的元素交换一下即可。
三. 示例代码
// 先排序后调整class Solution {public: void wiggleSort(vector<int>& nums) { if(nums.size() < 2) return; sort(nums.begin(),nums.end()); // 将数组中一对一对交换 for(int i = 2; i < nums.size(); i += 2){ int tmp = nums[i-1]; nums[i-1] = nums[i]; nums[i] = tmp; } }};
// 贪心法class Solution {public: void wiggleSort(vector<int>& nums) { if(nums.size() < 2) 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。
3 0
- leetcode笔记:Wiggle Sort
- Leetcode Wiggle Sort and Wiggle Sort II
- Leetcode: Wiggle Sort
- [Leetcode]Wiggle Sort
- leetcode 280: Wiggle Sort
- *LeetCode-Wiggle Sort
- [LeetCode] Wiggle Sort
- Leetcode 280: Wiggle Sort
- [leetcode 280] Wiggle Sort
- leetcode Wiggle Sort II
- LeetCode Wiggle Sort II
- leetcode Wiggle Sort II
- Leetcode Wiggle Sort II
- Leetcode Wiggle Sort
- leetcode 280: Wiggle Sort
- LeetCode 280. Wiggle Sort
- leetcode Wiggle Sort
- Leetcode Wiggle Sort II
- atom 快捷键
- vs 快捷键
- maven-生命周期与插件结合
- iOS 蓝牙开发(二)iOS 连接外设的代码实现
- @using (Html.BeginForm())参数示例
- leetcode笔记:Wiggle Sort
- hdu acm 1384 Intervals
- 杭电 hdu 5625 Clarke and chemistry【水题】
- 改良程序的11技巧
- 时间管理之“四象限法则”
- JavaScript和JQuery之战再续
- cf#ecr7-A. Infinite Sequence-暴力/二分-数学
- lombok的@Getter和@Setter
- 多态