lintcode(51)上一个排列
来源:互联网 发布:门诊收费软件 编辑:程序博客网 时间:2024/05/22 06:58
描述:
给定一个整数数组来表示排列,找出其上一个排列。
样例:
给出排列[1,3,2,3]
,其上一个排列是[1,2,3,3]
给出排列[1,2,3,4]
,其上一个排列是[4,3,2,1]
思路:
先找出操作的起始位置,从数组末尾开始找,nums.get(i) < nums.get(i-1)时,也就是后一个数小于前一个数时,这个时候就可以找到比现在的值小的值了;然后要将i-1位置的数进行处理,和当前值最接近的,新的第(i-1)位的值从i~end中找,小于并且最接近(i-1)的那位,然后(i)位置后的数字从大到小排列即可。
eg:
5,1,2,3,4
1,5,4,3,2(X)原因:没有找小于i位置且最接近的值
4,5,3,2,1
public class Solution { /** * @param nums: A list of integers * @return: A list of integers that's previous permuation * 真是繁琐 */ public ArrayList<Integer> previousPermuation(ArrayList<Integer> nums) {// write your codeif(nums == null || nums.size() <=1){ return nums;}int i = nums.size() - 1;for(;i>=1;i--){ if(nums.get(i) < nums.get(i-1)){ int count = i+1 ; while(count < nums.size()){ if(nums.get(count) < nums.get(i-1) && nums.get(count) > nums.get(i)){ int p = nums.get(i); nums.set(i , nums.get(count)); nums.set(count , p); } count++; } int temp = nums.get(i); nums.set(i , nums.get(i-1)); nums.set(i-1 , temp); for(int j = i;j<nums.size();j++){ for(int k = j+1;k<nums.size();k++){ if(nums.get(k)>nums.get(j)){ int t = nums.get(j); nums.set(j , nums.get(k)); nums.set(k , t); } } } break; }}if(i == 0){ Collections.reverse(nums);}return nums; }}
0 0
- lintcode(51)上一个排列
- LintCode 51 上一个排列
- lintcode-上一个排列
- 上一个排列-lintcode
- Lintcode 上一个排列
- Lintcode 上一个排列
- lintcode--上一个排列
- 上一个排列
- 上一个排列
- LinkCode 下一个排列、上一个排列
- 题目:上一个排列
- 上一个排列算法java
- LintCode-下一个排列
- lintcode-下一个排列
- LintCode 197. 排列序号
- lintcode ----排列序号
- LintCode:全排列
- LintCode:排列序号
- Encoder-Decoder模型和Attention模型
- kmp求前缀和后缀的最大重复部分
- ToolBar的简单使用
- 软考学习笔记本之三——数据库
- 银行家算法解决死锁问题
- lintcode(51)上一个排列
- 视觉SLAM漫谈
- 常用正则
- 使用bat上传FTP文件
- HTTP Status 404 There is no Action mapped for namespace / and action解决办法
- 试配
- 阻塞和挂起的区别
- 继承和多态
- 使用阿里身份证识别接口(使用appkey和secret)