这两个题可以理解为奇数位大于相邻两个偶数位,这两个题的输入数组是相同的,即数组中数值无序,且可能有相等的数值。但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. sqlserver--install/uninstall

    2017 express版本 安装: https://jingyan.baidu.com/article/76a7e409077997fc3a6e1559.html https://www.cnblo ...

  2. Mybatis架构简介

    一.Mybatis与ORM 对象关系映射(即Object Relational Mapping,简称ORM),主要用于关系型数据库和实体之间的映射,主要为了解决对象与关系数据库存在的互不匹配的现象,O ...

  3. HDU4417(SummerTrainingDay08-N 主席树)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  4. 5月7日——采用第三方页面内容,但是顶部title使用自己的

          --------->       由A页面进入我的页面 代码如下: (1)A页面下需要添加的代码 (2)我的页面下需要添加的代码 此处用到的语法为mui框架中的语法,可参照mui官方 ...

  5. BZOJ2957: 楼房重建(分块)

    题意 题目链接 Sol 自己YY出了一个\(n \sqrt{n} \log n\)的辣鸡做法没想到还能过.. 可以直接对序列分块,我们记第\(i\)个位置的值为\(a[i] = \frac{H_i}{ ...

  6. 回调地狱以及用promise怎么解决回调地狱

    哈哈哈,我又又又回来了,不好意思,最近枸杞喝的比较到位,精力比较旺盛. 现在我们来聊一聊啥是回调地狱,注意是回调地狱啊   不是RB人民最爱拍的那啥地狱啊,来吧,上车吧少年,这是去幼儿园的车 都让开, ...

  7. X86和X64环境下的基本类型所占用的字节大小

    同样的程序代码,使用Visual Studio 进行编译,当目标平台分别为x86或x64环境时,其编译结果是不同的.在x86环境下,指针都是4个字节的:而在x64环境下,指针都是8字节的.测试代码如下 ...

  8. MBTIles实现

    MBTIles实现 3.1 Compliant(符合) python: raster2mb (write) python: mbutil (read/write) python: landez (wr ...

  9. Oracle EBS CST 成本请求报错

    (文档 ID 430533.1) When running CMCPAW, Periodic Actual Cost Worker,  an error is received in the logf ...

  10. NodeJS链接MySql数据库

    //1.用npm命令安装mysql模块 npm install mysql //2.js文件中引入mysql模块 const mysqlModule = require('mysql'); //3.创 ...