leetcode31. Next Permutation

leetcode31. Next Permutation

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        int right = nums.size() - 1;

        if(right<=0) return ;
        int max = INT_MIN;
        int maxPos = right;
        int newPos = 0;
        int temp = 0;
        while(right>=0){
            if(max>nums[right]){
                newPos = floor(binarySearchPos(nums,nums[right],maxPos,nums.size() - 1));
                //cout<<newPos<<endl;
                while(nums[newPos] == nums[right]) newPos++;
                temp = nums[right];
                nums[right] = nums[newPos];
                nums[newPos] = temp;
                quickSort(nums,right+1,nums.size() - 1);
                break;
            }else{
                //cout<<max<<";"<<nums[right]<<endl;
                max=nums[right];
                maxPos = right;
                right--;
            }
        }
        if(right<0){
            quickSort(nums,0,nums.size() - 1);
        }

       // for(int i=0;i<nums.size();i++){
       //     cout<<nums[i]<<",";
       // }
    }


        double binarySearchPos(vector<int>& nums1, double num, int start, int end) {
        int left = start, right = end, medium = 0;
        while (left<right) {
            medium = left + (right - left) / 2;
            if (nums1[medium] - num <0.4) {
                right = medium;
            }
            else if (num - nums1[medium] <0.4) {

                left = medium + 1;
            }
            else {
                return medium;
            }


        }
        double left1;
        if (nums1[left] - num>0.4 && num - nums1[left] >0.4)
            left1 = left;
        else if (nums1[left] - num<0.4) {
            left1 = left - 0.5;
        }
        else {
            left1 = left + 0.5;
        }
        return  left1;
    }

    void quickSort(vector<int>& nums,int left,int right){

        int temp = 0;
        while(left<right){
            temp  = nums[left];
            nums[left] = nums[right]; 
            nums[right] = temp; 
            left++;
            right--;
        }
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值