zoukankan      html  css  js  c++  java
  • lintcode:next permutation下一个排列

    题目

    下一个排列

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

    样例

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

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

    注意

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

    解题

    和上一题求上一个排列应该很类似 

    1.对这个数,先从右到左找到递增序列的前一个位置,peakInd

    2.若peakInd = -1 这个数直接逆序就是答案了

    3.peakInd>= 0 peakInd这个位置的所,和 peakInd 到nums.size() -1 内的数比较,返回 nums[peakInd] < nums[swapInd]最大的下标 swapInd

    nums[swapInd] 是和nums[peakInd] 最接近并且比 nums[peakInd]大的数,这两个数进行交换

    4.同样,peakInd + 1 到nums.length() - 1 内的数进行逆序

    Python

    class Solution:
        # @param num :  a list of integer
        # @return : a list of integer
        def nextPermutation(self, nums):
            # write your code here
            peakInd = len(nums) - 1
            while peakInd>0 and nums[peakInd] <= nums[peakInd-1]:
                peakInd -=1
            peakInd -=1
            if peakInd>=0:
                swapInd = peakInd + 1
                while swapInd< len(nums) and nums[swapInd]> nums[peakInd]:
                    swapInd +=1
                swapInd -=1
                nums[swapInd],nums[peakInd] = nums[peakInd],nums[swapInd]
            left = peakInd + 1
            right = len(nums) - 1
            while left < right:
                nums[left],nums[right] = nums[right],nums[left]
                left +=1
                right -=1
            return nums
    Python Code

    Java

    public class Solution {
        /**
         * @param nums: an array of integers
         * @return: return nothing (void), do not return anything, modify nums in-place instead
         */
        public int[] nextPermutation(int[] nums) {
            // write your code here
            int peakInd = nums.length-1;
            while(peakInd>0 && nums[peakInd-1] >= nums[peakInd]){
                peakInd --;
            }
            peakInd --;
            if(peakInd>=0){
                int swapInd = peakInd + 1;
                while(swapInd< nums.length && nums[swapInd] > nums[peakInd]){
                    swapInd ++;
                }
                swapInd --;
                swapnums(nums,peakInd,swapInd);
            }
            int left = peakInd + 1;
            int right = nums.length - 1;
            while(left< right){
                swapnums(nums,left,right);
                left +=1;
                right -=1;
            }
            
            return nums;
        }
        private void swapnums(int[] nums,int left,int right){
                int tmp = nums[left];
                nums[left] = nums[right];
                nums[right] = tmp;
            }
    }
    Java Code
  • 相关阅读:
    ASE19团队项目 beta阶段 model组 scrum report list
    ASE19团队项目 beta阶段 model组 scrum7 记录
    ASE19团队项目 beta阶段 model组 scrum6 记录
    ASE19团队项目 beta阶段 model组 scrum5 记录
    ASE19团队项目 beta阶段 model组 scrum4 记录
    ASE19团队项目 beta阶段 model组 scrum3 记录
    ASE19团队项目 beta阶段 model组 scrum2 记录
    ASE19团队项目 beta阶段 model组 scrum1 记录
    【ASE模型组】Hint::neural 模型与case study
    【ASE高级软件工程】第二次结对作业
  • 原文地址:https://www.cnblogs.com/theskulls/p/5125764.html
Copyright © 2011-2022 走看看