• leetcode笔记:Wiggle Sort


    一. 题目描写叙述

    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。

    第一种思路是先排序后调整。

    依据题目的描写叙述,数组的组合方式有多种。因此能够先将数组进行排序,这时候从第3个元素開始,将第奇数个元素与前面一个偶数位置元素进行交换,如将第3个元素和第2个元素交换、将第5个元素和第4个元素交换。以此类推。

    该方法的时间复杂度为:O(NlogN),空间复杂度:O(1)

    第二中思路是greedy,使用这样的方法仅仅需遍历一次数组,时间复杂度为:O(N)

    相同满足题目的in-place要求。

    我们知道,在题目的描写叙述中能够总结出下面规律:

    当下标i是奇数时,nums[i] >= nums[i - 1]
    当下标i是偶数时。nums[i] <= nums[i - 1]

    依据以上规律。仅仅需遍历一遍数组。把不符合的条件的元素交换一下就可以。

    三. 演示样例代码

    // 先排序后调整
    class Solution {
    public:
        void wiggleSort(vector<int>& nums) {
            if(nums.size() < 2) return;  
    
            sort(nums.begin(),nums.end());
            // 将数组中一对一对交换
            for(int i = 2; i < nums.size(); i += 2){
                int tmp = nums[i-1];
                nums[i-1] = nums[i];
                nums[i] = tmp;
            }
        }
    };
    // 贪心法
    class Solution {
    public:
        void wiggleSort(vector<int>& nums) {
            if(nums.size() < 2) 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]);
            }
        }
    };

    四. 小结

    兴许有题目:Wiggle Sort II。

  • 相关阅读:
    辨异 —— 冠词(定冠词、不定冠词、零冠词)
    辨异 —— 冠词(定冠词、不定冠词、零冠词)
    dot 语法全介绍
    dot 语法全介绍
    图像的简单认识
    图像的简单认识
    向量点乘(内积)和叉乘(外积、向量积)概念及几何意义解读
    图的重要性质
    Android下载文件提示文件不存在。。。 java.io.FileNotFoundException
    Java程序猿的JavaScript学习笔记(5——prototype和Object内置方法)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8481775.html
Copyright © 2020-2023  润新知