一道O(n)+S的leetcode题大神stephan的简要解析
Posted Catch is KING
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了一道O(n)+S的leetcode题大神stephan的简要解析相关的知识,希望对你有一定的参考价值。
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的leetcode题大神stephan的简要解析的主要内容,如果未能解决你的问题,请参考以下文章