zoukankan      html  css  js  c++  java
  • leetcode324 摆动排序II

       1. 首先考虑排序后交替插入

      首尾交替插入,这种方法对于有重复数字的数组不可行;

    class Solution {
    public:
        void wiggleSort(vector<int>& nums) {
            //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
            //错误,没有考虑重复答案存在情况;
            sort(nums.begin(),nums.end());
            int i=0;
            int j=nums.size()-1;
            vector<int> res;
            while(i<=j){
                if(i<=j)
                    res.push_back(nums[i++]);
                if(i<=j)
                    res.push_back(nums[j--]);
            }
            for(int i=0;i<nums.size();i++){
                nums[i]=res[i];
            }
        }
    };

     对此进行改进:

    class Solution {
    public:
        void wiggleSort(vector<int>& nums) {
            //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
    
            //改进,将前后两个数组反序如1 2 3 4 5 6 分为 【3 2 1】,【6 5 4】然后按顺序插入;
            sort(nums.begin(),nums.end());
    
            vector<int> res;
            int mid=(nums.size()+1)/2;
            int i=mid-1;int j=nums.size()-1;
            while(i>=0){
                if(i>=0) res.push_back(nums[i--]);
                if(j>=mid) res.push_back(nums[j--]);
            }
            for(int i=0;i<nums.size();i++){
                nums[i]=res[i];
            }
        }
    };

     采用快排:

    class Solution {
    public:
        int partition(vector<int>& nums,int l,int r){
            int pivot=nums[l];
            while(l<r){
                while(l<r && nums[r]>=pivot)
                    r--;
                nums[l]=nums[r];
                while(l<r && nums[l]<=pivot)
                    l++;
                nums[r]=nums[l];
            }
            nums[l]=pivot;
            return l;
        }
        void quicksort(vector<int>& nums,int start,int end){
            if(start>=end) return;
            int pivot=partition(nums,start,end);
            quicksort(nums,start,pivot-1);
            quicksort(nums,pivot+1,end);
        }
        void wiggleSort(vector<int>& nums) {
            //因为一定存在最优解,所以一定可行的方法就是先排序,然后将最小的数逐渐插入到最大里面;
            quicksort(nums,0,nums.size()-1);
            vector<int> res;
            int mid=(nums.size()+1)/2;
            int i=mid-1;int j=nums.size()-1;
            while(i>=0){
                if(i>=0) res.push_back(nums[i--]);
                if(j>=mid) res.push_back(nums[j--]);
            }
            for(int i=0;i<nums.size();i++){
                nums[i]=res[i];
            }
        }
    };

    以上方法的时间复杂度为O(nlogn) 空间复杂度为O(n)

      2. 还有时间复杂度为O(n)的原地方法:

    空间复杂度为O(1),

  • 相关阅读:
    [MySql]explain用法及实践
    [Angularjs]asp.net mvc+angularjs+web api单页应用
    asp.net预定义的HttpModule
    不使用配置文件动态注册HttpModule
    DELPHI NEXTGEN编译开关
    mormot中间件成功匹配客户端FDMemTable和ClientDataSet
    firedac数据集和字符串之间相互转换
    Delphi XE中String、ANSIString、TBytes之间的转换
    论DELPHI三层的数据序列格式的变化
    MORMOT的数据序列
  • 原文地址:https://www.cnblogs.com/joelwang/p/11969650.html
Copyright © 2011-2022 走看看