您的位置:首页 > 其它

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;          }                }  }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: