lintcode--上一个排列
来源:互联网 发布:淘宝激光脱毛仪有用吗 编辑:程序博客网 时间:2024/05/24 06:56
题目描述:
给定一个整数数组来表示排列,找出其上一个排列。
注意事项:
排列中可能包含重复的整数。
样例:
给出排列[1,3,2,3],其上一个排列是[1,2,3,3]
给出排列[1,2,3,4],其上一个排列是[4,3,2,1]
思路讲解:
跟下一个排列的算法刚刚相反,就是从最后找一个递增序列,然后从其后面找到一个比他小的数,且这个数最接近他。交换这两个数,然后将其后面的数倒序排列。
举个栗子:1-4-2-3找到其递增(从后向前)的序列4-2,然后找到一个比4小的最大的数,即3,交换位置变成1-3-2-4,然后3后面的倒序排列变成1-3-4-2。
代码详解:
class Solution {public: /* * @param nums: A list of integers * @return: A list of integers that's previous permuation */ static bool cmp(int a,int b) { if(a<=b) return false; else { return true; } } vector<int> previousPermuation(vector<int> &nums) { // write your code here if(nums.size()==0){ return vector<int> (); } int flag=-1; for(int i=nums.size()-1;i>0;i--) { if(nums[i]<nums[i-1]){ flag=i-1; int pos; int max=INT_MIN; for(int j=i;j<nums.size();j++) { if(nums[j]-nums[flag]<0){ if(nums[j]-nums[flag]>max){ max=nums[j]-nums[flag]; pos=j; } } } //cout<<flag<<" "<<pos<<endl; int temp=nums[flag]; nums[flag]=nums[pos]; nums[pos]=temp; sort(nums.begin()+flag+1,nums.end(),cmp); //cout<<nums.size()<<endl; return nums; } } sort(nums.begin(),nums.end(),cmp); return nums; }};
C++中有直接求前一个排列的函数
prev_permutation(nums.begin(),nums.end());
阅读全文
0 0
- lintcode-上一个排列
- 上一个排列-lintcode
- Lintcode 上一个排列
- lintcode(51)上一个排列
- LintCode 51 上一个排列
- Lintcode 上一个排列
- lintcode--上一个排列
- 上一个排列
- 上一个排列
- LinkCode 下一个排列、上一个排列
- 题目:上一个排列
- 上一个排列算法java
- LintCode-下一个排列
- lintcode-下一个排列
- LintCode 197. 排列序号
- lintcode ----排列序号
- LintCode:全排列
- LintCode:排列序号
- JAVA集合
- 关于等价鞅、反等价鞅、剀利公式、赌徒输光定理(非常有启发意义)
- Boost组件实用工具
- SQLServer中Partition By 函数的使用
- Asset Catalog Compiler Warning Group
- lintcode--上一个排列
- Java基础学习之接口
- Android Studio 使用config.gradle 管理依赖库
- PHP的一个猜拳小游戏
- sql server 2005 通过存储过程发送邮件
- leetcode33题解_Search in Rotated Sorted Array
- 缩略图(缩略成圆形、按一定比例缩放)
- JVM参数设置、分析
- Promise详解与使用