• lintcode-51-上一个排列


    51-上一个排列

    给定一个整数数组来表示排列,找出其上一个排列。

    注意事项

    排列中可能包含重复的整数

    样例

    给出排列[1,3,2,3],其上一个排列是[1,2,3,3]
    给出排列[1,2,3,4],其上一个排列是[4,3,2,1]

    标签

    排列 LintCode 版权所有

    思路

    所谓上一个排列,是指在排列中,位于此序列前的一个序列。
    如 [1,2,3],其排列为:[1,2,3]、[1,3,2]、[2,1,3]、[2,3,1]、[3,1,2]、[3,2,1]
    则 [2,1,3] 的上一个排序为 [2,3,1]
    则 [3,2,1] 的上一个排序为 [1,2,3]

    code

    class Solution {
    public:
        /**
         * @param nums: An array of integers
         * @return: An array of integers that's previous permuation
         */
        vector<int> previousPermuation(vector<int> &nums) {
            // write your code here
            int size = nums.size(), i = 0, j = 0, k = 0;
            if(size == 0) {
                return vector<int> ();
            }
    
            for(i=size-1; i>=1; i--) {
                if(nums[i-1] > nums[i]) {
                    int flag = i + 1;
                    while(flag < size) {
                        if(nums[i-1] > nums[flag] && nums[i] < nums[flag]) {
                            int temp = nums[i];
                            nums[i] = nums[flag];
                            nums[flag] = temp;
                        }
                        flag++;
                    }
    
                    int temp = nums[i];
                    nums[i] = nums[i-1];
                    nums[i-1] = temp;
                    
                    for(j=i; j<size; j++){  
                        for(k=j+1; k<size; k++) {  
                            if(nums[k] >nums[j]) {  
                                int temp = nums[j];
                                nums[j] = nums[k];
                                nums[k] = temp;
                            }  
                        }  
                    }
                    break;
                }
            }
            if(i == 0){  
                for(i=0; i<size/2; i++) {   
                    int temp = nums[i];
                    nums[i] = nums[size-1-i];
                    nums[size-1-i] = temp;
                }
            }
            return nums;
        }
    };
    
  • 相关阅读:
    SGU 495 Kids and Prizes
    HDU 3853 LOOPS
    HDU 4089 Activation
    HDU 4405 Aeroplane chess
    ZOJ 3329 One Person Game
    POJ 2096 Collecting Bugs
    POJ1573(Robot Motion)
    poj2632(Crashing Robots)
    poj1068(Parencodings)
    poj2506(Tiling)
  • 原文地址:https://www.cnblogs.com/libaoquan/p/7087272.html
Copyright © 2020-2023  润新知