博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lintcode:next permutation下一个排列
阅读量:6146 次
发布时间:2019-06-21

本文共 2190 字,大约阅读时间需要 7 分钟。

题目

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

样例

给出排列[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

 

 

转载地址:http://wumya.baihongyu.com/

你可能感兴趣的文章
mysql内存优化
查看>>
都市求生日记第一篇
查看>>
Java集合---HashMap源码剖析
查看>>
SQL优化技巧
查看>>
thead 固定,tbody 超出滚动(附带改变滚动条样式)
查看>>
Dijkstra算法
查看>>
css 动画 和 响应式布局和兼容性
查看>>
csrf 跨站请求伪造相关以及django的中间件
查看>>
MySQL数据类型--与MySQL零距离接触2-11MySQL自动编号
查看>>
生日小助手源码运行的步骤
查看>>
Configuration python CGI in XAMPP in win-7
查看>>
bzoj 5006(洛谷 4547) [THUWC2017]Bipartite 随机二分图——期望DP
查看>>
CF 888E Maximum Subsequence——折半搜索
查看>>
欧几里德算法(辗转相除法)
查看>>
面试题1-----SVM和LR的异同
查看>>
MFC控件的SubclassDlgItem
查看>>
如何避免历史回退到登录页面
查看>>
《图解HTTP》1~53Page Web网络基础 HTTP协议 HTTP报文内的HTTP信息
查看>>
unix环境高级编程-高级IO(2)
查看>>
树莓派是如何免疫 Meltdown 和 Spectre 漏洞的
查看>>