zoukankan      html  css  js  c++  java
  • Next Permutation:leetcode

    Question:

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

    If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order).

    The replacement must be in-place, do not allocate extra memory.

    Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
    1,2,3  1,3,2
    3,2,1  1,2,3
    1,1,5  1,5,1

    给定一个数组,里边的数以任意的数排列,给出这个数组中这个排序的下一个序列,使这个序列构成的整数大于原来数组序列构成的整数,当数组里的数按从大到小排列时,下一个序列为从小到大排列的序列。

    例子如下:输入1,2,3,4那么下一个为1,2,4,3,输入4,3,2,1下一个为1,2,3,4

    算法步骤:① 找到这样的最大下标k,使num[k]<num[k+1];

         ② 找到这样的最大下标j,使num[k]<num[j],如果k==j,那么num数组就是从大到小排列,输出数组的反序就可以,算法终止;

         ③ 交换num[k]和num[j];

         ④ 从第k+1个数往后的数要反序;

    Java代码

     1 public class Solution {
     2     public void nextPermutation(int[] num) {
     3         int k=0;//找到num[i]<num[i+1]的最大i
     4         for(int i=1;i<num.length;i++){
     5             if(num[i-1]<num[i]){
     6                 k=i-1;
     7             }
     8         }
     9  
    10         int j=k;//找到i之后,num[i]>num[k]的最大i
    11         for(int i=k;i<num.length;i++){
    12             if(num[k]<num[i]){
    13                 j=i;
    14             }
    15         }
    16         //交换num[k]和num[j]
    17         if(j==k){
    18             reverse(num, 0, num.length);//如果数组从大到小排列
    19             return ;
    20         }
    21         num[j]=num[k]+num[j];
    22         num[k]=num[j]-num[k];
    23         num[j]=num[j]-num[k];
    24         int length=num.length;
    25         reverse(num, k+1, length);
    26         
    27     }
    28     void reverse(int []array,int a,int b){
    29         
    30         for(int i=a;i<b;i++){
    31             int temp=array[i];
    32             array[i]=array[b-1];
    33             array[b-1]=temp;
    34             b--;
    35         }
    36     }
    37 }

     

     

  • 相关阅读:
    Shiro自定义密码匹配认证
    logback 发送邮件和自定义发送邮件;java类发送邮件
    webVR全景图多种方案实现(pannellum,aframe,Krpano,three,jquery-vrview)
    前端接受后端文件流并下载的几种方法
    回流(reflow)与重绘(repaint)
    JS数组去重的几种常见方法
    React 生命周期
    浅谈React工作原理
    如何在Vue项目中使用vw实现移动端适配
    移动端web整理 移动端问题总结,移动web遇到的那些坑
  • 原文地址:https://www.cnblogs.com/zhaolizhen/p/NextPermutation.html
Copyright © 2011-2022 走看看