码迷,mamicode.com
首页 > 其他好文 > 详细

一道O(n)+S(1)的leetcode题大神stephan的简要解析

时间:2017-10-09 14:18:45      阅读:159      评论:0      收藏:0      [点我收藏+]

标签:space   oid   swa   --   避免   with   media   find   define   

class Solution {
public:
  void wiggleSort(vector<int>& nums) {
                    int n = nums.size();
  // Find a median.
                    auto midptr = nums.begin() + n / 2;
                    nth_element(nums.begin(), midptr, nums.end());
  //求第n/2小的数放在n/2位置上
  //最快达到O(n)
                              int mid = *midptr;
// Index-rewiring.
                              #define A(i) nums[(1+2*(i)) % (n|1)]
//避免0和越界
// 3-way-partition-to-wiggly in O(n) time with O(1) space.
                                    int i = 0, j = 0, k = n - 1;
//保证逻辑上的A(i)是这样的
//过了mid后保证,有大的换到前面去
                              while (j <= k) {
                                      if (A(j) > mid)
                                      swap(A(i++), A(j++));
                                      else if (A(j) < mid)
                                      swap(A(j), A(k--));
                                      else
                                        j++;
                                          }
                                          }
                                            };

一道O(n)+S(1)的leetcode题大神stephan的简要解析

标签:space   oid   swa   --   避免   with   media   find   define   

原文地址:http://www.cnblogs.com/fenglongyu/p/7640607.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!