lintcode -- 下一个排列
2017-07-21 11:26
232 查看
给定一个若干整数的排列,给出按正数大小进行字典序从小到大排序后的下一个排列。如果没有下一个排列,则输出字典序最小的序列。您在真实的面试中是否遇到过这个题? Yes样例左边是原始排列,右边是对应的下一个排列。
1,2,3→
1,3,2
3,2,1→
1,2,3
1,1,5→
1,5,1
/*思路1:原理是:1.在当前序列中,从尾端往前寻找两个相邻元素,前一个记为num[index-1],后一个记为num[index],并且满足num[index-1]< num[index]。2.然后再从尾端寻找另一个元素num[swap],如果满足num[index-1]< num[swap],然后num[index-1]与num[swap]对调,并将num[index]之后(包括num[index])的所有元素颠倒排序,即求出下一个序列了不好想啊,举个例子1,4,6,5,3,2从尾部开始找符合关系的第一个相邻数字,目测,只有 4,6,此时index 为2,因为我们记录的是index,和index -1,在从尾部开始找第一个元素大于4的,找到是5,那么swap=3;交换4 和5,然后将index=2,其实就是6开始(包括6)倒叙,就变成了 1,5,2,3,4,6是不是这个样子?*/public class Solution { public void nextPermutation(int[] num) { int index = num.length - 1; while (index > 0) { // 寻找第一个相邻元素前一个比后面的元素小的元素索引 if (num[index] > num[index - 1]) { break; } index--; } int swap = num.length - 1; while (swap > 0&&index>0) { // 寻找第一个比index-1对应值大的数字 //index >0为了保证倒序排列的,3,2,1,这样的话,index就是0 if (num[swap] > num[index - 1]) { int temp = num[index - 1]; num[index - 1] = num[swap]; num[swap] = temp; //退出循环 break; } //不是继续找 swap--; } for (int i = 0; i < (num.length - index) / 2; i++) { int temp = num[index + i]; num[index + i] = num[num.length - 1 - i]; num[num.length - 1 - i ] = temp; } } }
相关文章推荐
- lintcode-下一个排列
- LintCode 52-下一个排列
- lintcode[190]:下一个排列
- 下一个排列-LintCode
- 下一个排列-lintcode
- 下一个排列 lintcode
- lintcode---下一个排列
- lintcode刷题——下一个排列
- LintCode-下一个排列
- Lintcode 下一个排列
- LintCode 52 下一个排列
- 暴力求解法_枚举排列(生成1~n 的排列,生成可重集的排列,下一个排列)
- lintcode之排列问题
- 7.2.4 下一个排列
- lintcode 求全排列(15)
- LintCode之排列序号
- [LeetCode] 31. Next Permutation 下一个排列
- UVA 146 ID Codes(下一个排列)
- lintcode-带重复元素的排列 -16
- lintcode-第k个排列-388