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。

解法:遍历一遍数组, 如果是奇数位置并且其值比下一个大,则交换其值, 如果是偶数位置并且其值比下一个小, 则交换其值. 时间复杂度是O(N)。注意index和实际的位置差1,所以奇偶相反。

Java:

public class Solution {
public void wiggleSort(int[] nums) {
if (nums == null || nums.length < 2) return;
for (int i = 1; i < nums.length; i++) {
if ((i % 2 == 0 && nums[i] > nums[i - 1]) || (i % 2 == 1 && nums[i] < nums[i - 1])) {
int tmp = nums[i];
nums[i] = nums[i - 1];
nums[i - 1] = tmp;
}
}
}
}  

Java:

public class Solution {
public void wiggleSort(int[] nums) {
if (nums == null || nums.length == 0) {
return;
}
for (int i = 1; i < nums.length; i++) {
if (i % 2 == 1) {
if (nums[i] < nums[i - 1]) {
swap(nums, i);
}
} else {
if (nums[i] > nums[i - 1]) {
swap(nums, i);
}
}
}
} private void swap(int[] nums, int i) {
int tmp = nums[i - 1];
nums[i - 1] = nums[i];
nums[i] = tmp;
}
}  

Python:

# Time:  O(n)
# Space: O(1)
class Solution(object):
def wiggleSort(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
for i in xrange(1, len(nums)):
if ((i % 2) and nums[i - 1] > nums[i]) or \
(not (i % 2) and nums[i - 1] < nums[i]):
# Swap unordered elements.
nums[i - 1], nums[i] = nums[i], nums[i - 1]

C++:

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

C++:

// 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]);
}
}
};

C++:

// 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]);
}
}
}
};

  

类似题目:

[LeetCode] Wiggle Sort II 摆动排序 II

All LeetCode Questions List 题目汇总

最新文章

  1. MVC项目
  2. Optimizely:在线网站A/B测试平台
  3. P1090 合并果子
  4. C#实现GDI+基本图的缩放、拖拽、移动
  5. [jobdu]孩子们的游戏(圆圈中最后剩下的数)
  6. Android自己定义控件系列一:Android怎样实现老版优酷client三级环形菜单
  7. 天梯赛决赛 L2-1.红色警报 并查集
  8. 如何提高使用Java反射的效率?
  9. java高级工程师开放面试题集&lt;二&gt;
  10. 在Linux 中如何从进程相关的文件描述中恢复数据
  11. JavaScript进阶系列02,函数作为参数以及在数组中的应用
  12. Boosting 简单介绍
  13. java 可变参数讲解
  14. 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法
  15. Hibernate中的一些关键字理解
  16. “全栈2019”Java第十章:关键字
  17. liunx下在线升级python到2.7版本
  18. CF1025C Plasticine zebra【环状字符串/思维】
  19. 台湾ML笔记--1.1什么时候适合使用ML
  20. android中使用gdbserver调试c程序

热门文章

  1. Codeforces B. Mouse Hunt(强连通分解缩点)
  2. moviepy草码
  3. Please umount the filesystem and rectify the problem(s)
  4. C# 验证控件的使用RequiredFieldValidator&amp;CompareValidator
  5. 《基于 UML 的教务系统设计方法研究》论文笔记(十五)
  6. Java基础(八 前面补充)
  7. Git的基本使用方法(受益匪浅)
  8. .pdb 文件的内部结构
  9. 关于Windows系统里的事后调试
  10. Dump文件的校验查看工具