Problem :寻找给定int数组的下一个全排列(要求:be in-place)
 
倒序查找到该数组中第一个满足后面的数字大于前面的数字的下标i (当前下标 i 指向 后面的那个比较大的数)
 
 
参考代码: 
package leetcode_50;

/***
*
* @author pengfei_zheng
* 下一个全排列
*/
public class Solution31 {
public static void nextPermutation(int[] nums) {
int len = nums.length;
if(len<=1)
return;
int i = len - 1;
for(;i>=1;i--){//从后先前遍历
if(nums[i]>nums[i-1]){
//找到第一个后面的数字大于相邻的前面的那个数的下标 (此时下标指向较大的那个数字)
break;
}
}
if(i!=0){
swap(nums,i-1);//从后向前遍历,交换第一个大于index=i-1的那个数
}
reserver(nums,i);//将从下标i开始的数组进行从小到大的排序
}
private static void swap(int[] nums, int i) {
for(int j=nums.length-1;j>i;j--){//从后向前遍历
if(nums[j]>nums[i]){
int t = nums[j];
nums[j]=nums[i];
nums[i]=t;
break;//交换第一个比前面的index=i-1的那个数
}
}
}
//从下标i开始到nums.length-1结束,实现从小到大排列
private static void reserver(int[] nums, int i) {
int first = i;
int last = nums.length-1;
while(first<last){
int t = nums[first];
nums[first]=nums[last];
nums[last]=t;
first++;
last--;
}
}
public static void main(String[]args){
//int []nums={6,3,4,9,8,7,1};
int []nums={1,2,4,3};
nextPermutation(nums);
for(int n:nums){
System.out.print(n+" ");
}
}
}

LeetCode 31 Next Permutation(下一个全排列)的更多相关文章

  1. [LeetCode] 31. Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  2. leetCode 31.Next Permutation (下一个字典序排序) 解题思路和方法

    Next Permutation  Implement next permutation, which rearranges numbers into the lexicographically ne ...

  3. [leetcode]31. Next Permutation下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  4. 31. Next Permutation (下一个全排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  5. [array] leetcode - 31. Next Permutation - Medium

    leetcode - 31. Next Permutation - Medium descrition Implement next permutation, which rearranges num ...

  6. LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation]

    LeetCode 31 Next Permutation / 60 Permutation Sequence [Permutation] <c++> LeetCode 31 Next Pe ...

  7. NextPermutation,寻找下一个全排列

    问题描述:给定一个数组是一个全排列,寻找下一个全排列.例如123->132, 321->123, 115->151. 算法分析:从后往前寻找顺序,找到后从往前寻找第一个大于当前元素, ...

  8. leetcode 31. Next Permutation(字典序的下一个)

    描述: Implement next permutation, which rearranges numbers into the lexicographically next greater per ...

  9. LeetCode 31. Next Permutation (下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

随机推荐

  1. C# IP地址与数字之间的互转

    using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Te ...

  2. mocha框架下,异步测试代码错误造成的问题----用例超时错误

    今天用抹茶(mocha)做个测试,发现有一个测试项目总是超时: describe("DbFactory functions",function(){ it("query ...

  3. DWZ主从表界面唯一性验证(后台验证)(三)

    之前的博客介绍了前台自写js来验证主动表的唯一性,除了前台的验证,我也学习了后台的一些判断. 再次介绍一下背景需求: 利用DWZ的主从表结构批量添加课程信息,在提交表单后,触发Action事件 1.是 ...

  4. UGUI优化

    https://zhuanlan.zhihu.com/p/21913747 https://www.jianshu.com/p/3edce67cb473 http://www.ceeger.com/f ...

  5. MLE、MAP、贝叶斯三种估计框架

    三个不同的估计框架. MLE最大似然估计:根据训练数据,选取最优模型,预测.观测值D,training data:先验为P(θ). MAP最大后验估计:后验概率. Bayesian贝叶斯估计:综合模型 ...

  6. 用python将MSCOCO和Caltech行人检测数据集转化成VOC格式

    代码:转换用的代码放在这里 之前用Tensorflow提供的object detection API可以很方便的进行fine-tuning实现所需的特定物体检测模型(看这里).那么现在的主要问题就是数 ...

  7. opencv在同一窗口打印多张图片

    首先,由于cv2处理的图片是通过ndarray的格式操作的,也就是说通过array的拼接就可以实现图片的拼接,那么之后就可以通过简单的imshow将合并的图片打印从而达到在一个窗口中显示多张图片的目的 ...

  8. mysql中json_remove函数的使用?

    需求描述: 今天看json记录,可以通过json_remove函数对一个key或多个key从个json记录中去掉. 操作过程: 1.查看一个已经存在的json表 mysql> select * ...

  9. 给你的 Golang 程序添加 GUI (使用 Electron )

    https://studygolang.com/articles/12065?fr=sidebar https://www.jianshu.com/p/a3be0d206d4c  另一种思路 推荐方式 ...

  10. 5 -- Hibernate的基本用法 --4 5 JNDI数据源的连接属性

    如果无须Hibernate自己管理数据源,而是直接访问容器管理数据源,Hibernate可使用JNDI(Java Naming Directory Interface,Java命名目录接口)数据源的相 ...