题目: 给定一个整数,存放在数组中,求出该整数的下一个排列(字典顺序);要求原地置换,且不能分配额外的内存

举例:

1,2,3 → 1,3,2;  
3,2,1 → 1,2,3;  
1,1,5 → 1,5,1;  

解题思路:

1. 由于要找出整数的下一个排列,且按照字典顺序,因此要找出当前排列中需要交换的的那个位,即找到从右到左第一个不满足升序的元素的前一个元素nums[index1], 以及从右到左第一个大于nums[index1]的元素nums[index2];

2. 交换两个元素;因为是按字典顺序排列的,而nums[index2]是第一个大于nums[index1]的元素,此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序

3. 但是由于在交换了nums[index1]和nums[index2]元素后,nums[index2]元素后面本应该是按字典顺序最小的数字组合,而[index1 + 1,结尾]之间的元素是降序的,是字典顺序的最大组合排列,因此需要将[index1 + 1, 结尾]之间的数据全部逆转,才能得到字典的下一个排列组合;

代码如下:

 public class Solution {
public void nextPermutation(int[] nums) {
if(nums == null || nums.length < 1)
return;
int len = nums.length - 1;
int data = nums[len];
int index1 = -1;
int index2 = 0;
for(int i = len - 1; i >= 0; i--) // 找到从右往左第一个不满足升序的元素的前一个元素
{
if(data <= nums[i])
data = nums[i];
else
{
index1 = i;
break;
}
}
if(index1 != -1) // 表示可以找到这样的数,即给定的数字不是降序
{
for(int i = len; i >=0; i--) // 找到从右往左第一个大于第一次找到的那个元素的元素
{
if(nums[i] > nums[index1])
{
index2 = i;
break;
}
}
exchange(nums, index1, index2); //此时[index1 + 1, index2]之间的元素都是大于nums[index2]以及nums[index1]的,而nums[index2]是从右往左第一个大于nums[index1]的元素,因此[index2 + 1, len]的元素都是小于nums[index1],
         因此当nums[index1]与nums[index2]交换后,[index1 + 1, len]之间的元素就是一个降序 }
index1 = index1 + 1;
while(index1 < len) // 将index1位置之后的元素全部逆转【index + 1, len】之间的元素是降序排列,而我们需要的是nums[index1]元素之后的最小排列组合
{
exchange(nums, index1, len);
index1 ++;
len --;
}
}
public void exchange(int[] nums, int index1, int index2)
{
int data = nums[index1];
nums[index1] = nums[index2];
nums[index2] = data;
}
}

Leetcode31--->Next Permutation(数字的下一个排列)的更多相关文章

  1. [Swift]LeetCode31. 下一个排列 | Next Permutation

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

  2. [LeetCode] Next Permutation 下一个排列

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

  3. Next Permutation 下一个排列

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

  4. 【LeetCode每天一题】Next Permutation(下一个排列)

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

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

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

  6. 力扣——Next Permutation(下一个排列) python实现

    题目描述: 中文: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  7. leetcode31题:下一个排列

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  8. LeetCode31.下一个排列 JavaScript

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  9. 031 Next Permutation 下一个排列

    实现获取下一个排列函数,这个算法需要将数字重新排列成字典序中数字更大的排列.如果不存在更大的排列,则重新将数字排列成最小的排列(即升序排列).修改必须是原地的,不开辟额外的内存空间.这是一些例子,输入 ...

随机推荐

  1. JS和jquery获取各种屏幕的宽度和高度的代码

    Javascript: 网页可见区域宽: document.body.clientWidth 网页可见区域高: document.body.clientHeight 网页可见区域宽: document ...

  2. python生成器简单代码了理解。

    __author__ = 'ZHHT' #!/usr/bin/env python # -*- coding:utf-8 -*- #返回当前执行到的函数的返回值.并保持当前执行的状态.这时候先执行别的 ...

  3. Android笔记--LayoutInflator源码和使用分析

    LayoutInflator源码分析 获取LayoutInflator对象 获取LayoutInflator的方式有两种: 使用LayoutInflator.from(Context context) ...

  4. /usr/local/sbin/fping -s www.baidu.com www.google.com

    /usr/local/sbin/fping -s www.baidu.com www.google.com

  5. 监测元素resize

    前言 近来有需求要做分页,听起来可能有点Low. 所以我要把Low的事情做得有点逼格. 分页本身没啥,但是数据量起来了,比如十万. 要是不做点处理, 那你的页面估计爽得很,机器也爽得很. 放心,我不会 ...

  6. jspscriptlet标签

    <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding= ...

  7. Unity中实现全局管理类的几种方式

    (搬运自我在SegmentFault的博客) 如何在Unity中实现全局管理类?由于Unity脚本的运行机制和面向组件编程(COP)的思想,实现起来和普通的方式略有差别. 第一种方式是使用静态类.适合 ...

  8. .net代码获取节点以及读取属性

    获取配置文件的节点,可以使用System.Configuration.ConfigurationManager.GetSection方法获取指定的节点,以sessionstate节点为例,如果需要获取 ...

  9. java基础—java读取properties文件

    一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都会写在properties文件中,这里主要是总结使用getResource ...

  10. Bootstrap标签页(Tab)插件事件

    事件 下表列出了标签页(Tab)插件中要用到的事件.这些事件可在函数中当钩子使用. 事件 描述 实例 show.bs.tab 该事件在标签页显示时触发,但是必须在新标签页被显示之前.分别使用 even ...