这两个题可以理解为奇数位大于相邻两个偶数位,这两个题的输入数组是相同的,即数组中数值无序,且可能有相等的数值。但Wiggle Sort II要求是奇偶位的只能大于,不能等于。

无论是280.Wiggle Sort还是324. Wiggle Sort II,都可以通过排序,然后以中间值为分界分成a、b两部分,每次先从a中选择一个数,然后再从b中选择一个数组成新的数组就是锯齿状的数组了,如下图。

但是这种方式,时间复杂度是O(NlogN),空间是O(N),因为你需要重新申请一个数组。

Wiggle Sort:

      注意:解法一是每次i增加2,题目不是保证3个3个的情况,而是整个数组都要满足要求。

      解法一错误版本:

      如果nums的长度是4,这种情况下nums[i+1]会越界。但是如果你用的是i和i-1的组合,一定可以不会越界,因为i不越界i-1就一定不会越界,for循环控制i,i越界了整个循环就结束了。

class Solution {
public:
void wiggleSort(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i = ;i < nums.size();i += ){
swap(nums[i],nums[i+]);
}
return;
}
};

     解法一正确版本:

     如果没有if这个语句,当nums.size() <= 2时,for循环里的nums[i]会出现数组越界

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

       解法二

时间复杂度为O(n),空间复杂度为O(1)。

这个代码无法跑Wiggle Sort II,还是在有相同数字的时候出错,比如输入是[4,5,5,6],输出变成[4,5,5,6]

https://www.cnblogs.com/grandyang/p/5177285.html

class Solution {
public:
/*
* @param nums: A list of integers
* @return: nothing
*/
void wiggleSort(vector<int> &nums) {
// write your code here
for(int i = ;i < nums.size();i++){
if((i% == && nums[i] < nums[i-]) || (i% == && nums[i] > nums[i-]))
swap(nums[i],nums[i-]);
}
}
};

324. Wiggle Sort II

解法一

这个解法和Wiggle Sort的解法一类似,先排序,然后再让奇偶位保持锯齿状。但Wiggle Sort解法一的代码不适合Wiggle Sort II,因为Wiggle Sort II要求不能相等,所以针对输入数组中有相同数字的情况就不能正确解决。

比如:[1,5,1,1,6,4]就会错误生成[1,1,5,6,1,4],不过针对没有相同数字的数组解法一也是可以的。

与1不同,这个不能为等号。排序后,两个指针,一个从中间往前,一个从末尾往前。j、k的初始化这注意,必须保证0~j比j+1~k大于等于1个,这样才能填满。这个的空间复杂度就为O(n)了。

class Solution {
public:
void wiggleSort(vector<int>& nums) {
vector<int> tmp = nums;
sort(tmp.begin(),tmp.end());
int j = (nums.size() - )/,k = nums.size() - ;
for(int i = ;i < nums.size();i++){
nums[i] = i % ? tmp[k--] : tmp[j--];
}
return;
}
};

http://www.cnblogs.com/grandyang/p/5139057.html

leetcode 280.Wiggle Sort 、324. Wiggle Sort II的更多相关文章

  1. leetcode 1.Two Sum 、167. Two Sum II - Input array is sorted 、15. 3Sum 、16. 3Sum Closest 、 18. 4Sum 、653. Two Sum IV - Input is a BST

    1.two sum 用hash来存储数值和对应的位置索引,通过target-当前值来获得需要的值,然后再hash中寻找 错误代码1: Input:[3,2,4]6Output:[0,0]Expecte ...

  2. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  3. leetcode 39. Combination Sum 、40. Combination Sum II 、216. Combination Sum III

    39. Combination Sum 依旧与subsets问题相似,每次选择这个数是否参加到求和中 因为是可以重复的,所以每次递归还是在i上,如果不能重复,就可以变成i+1 class Soluti ...

  4. leetcode 79. Word Search 、212. Word Search II

    https://www.cnblogs.com/grandyang/p/4332313.html 在一个矩阵中能不能找到string的一条路径 这个题使用的是dfs.但这个题与number of is ...

  5. leetcode 54. Spiral Matrix 、59. Spiral Matrix II

    54题是把二维数组安卓螺旋的顺序进行打印,59题是把1到n平方的数字按照螺旋的顺序进行放置 54. Spiral Matrix start表示的是每次一圈的开始,每次开始其实就是从(0,0).(1,1 ...

  6. leetcode 263. Ugly Number 、264. Ugly Number II 、313. Super Ugly Number 、204. Count Primes

    263. Ugly Number 注意:1.小于等于0都不属于丑数 2.while循环的判断不是num >= 0, 而是能被2 .3.5整除,即能被整除才去除这些数 class Solution ...

  7. leetcode 344. Reverse String 、541. Reverse String II 、796. Rotate String

    344. Reverse String 最基础的旋转字符串 class Solution { public: void reverseString(vector<char>& s) ...

  8. leetcode 131. Palindrome Partitioning 、132. Palindrome Partitioning II

    131. Palindrome Partitioning substr使用的是坐标值,不使用.begin()..end()这种迭代器 使用dfs,类似于subsets的题,每次判断要不要加入这个数 s ...

  9. leetcode 62. Unique Paths 、63. Unique Paths II

    62. Unique Paths class Solution { public: int uniquePaths(int m, int n) { || n <= ) ; vector<v ...

随机推荐

  1. 转载-iOS SDK开发

    最近帮兄弟公司的做支付业务sdk,积累了 sdk 封装的经验!下面我会从零开始把我的 sdk 封装和调试经历分享给大家,希望能给看到这篇文章的人有所帮助! 本文我会从以下几个方面来讲述: Framew ...

  2. Java基础——GUI编程(四)

    继前面的,这篇主要记录菜单和文件对话框的两个小练习,来熟悉一下方法的应用,一些简单的逻辑和Swing的相关简介,以及关于GUI基础的记录. 一.创建一个菜单 import java.awt.FlowL ...

  3. Android四大组件framework层

    activity https://www.kancloud.cn/alex_wsc/android-deep2/413484 当前Activity Activity向AMS发送StartActivit ...

  4. POJ3436(KB11-A 最大流)

    ACM Computer Factory Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8133   Accepted: 2 ...

  5. python协程的简单了解

    协程: 协程,又称微线程,纤程.英文名Coroutine. 可以在不同的函数间切换,而且切换的次数和时间都是由用户自己确定的. 协程的几种实现方式: (1)使用生成器yield实现. 如果不了解生成器 ...

  6. JQuery 常用知识

    1.JSON 解析 JSON字符串: var str1 = '{ "name": "deyuyi", "sex": "man&qu ...

  7. Vue.js之路由系统

    Vue.js生态之vue-router vue-router是什么? vue-router是Vue的路由系统,定位资源的,我们可以不进行整页刷新去切换页面内容. vue-router的安装与基本配置 ...

  8. JS性能优化 之 FOR循环

    FOR 循环我们用的真的是太多了,但你是否关注过它的优化写法呢?记录下: 1. 最最常规写法,没有任何不妥 for (var i = 0; i < 10; i++) { // do someth ...

  9. eclipse代码中每行的开始和结尾出现多余的特殊符号

    window -> preferences -> general -> editors -> text editors ->          show whitespa ...

  10. React Native 如何做轮播图 react-native-swiper

    //:仿饿了么github:https://github.com/stoneWeb/elm-react-native 欢迎各位同学加入: React-Native群:397885169 大前端群:54 ...