zoukankan      html  css  js  c++  java
  • 下一个排列(leetcode31)

    实现获取 下一个排列 的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

    如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

    必须 原地 修改,只允许使用额外常数空间。

    示例 1:

    输入:nums = [1,2,3]
    输出:[1,3,2]

    解析:

    两遍扫描

    从后往前扫描,当满足a [ i ] > a [ i+1 ]  时,字典序最大的,无法再增大。

    所以,当找到第一个满足 a [ i ] < a [ i+1 ] 时,此时的 i 的位置就是可以让字典序变大的位置。

    而要让字典序的增大尽可能小,

    则需要从后往前扫描,找到尽量靠右的比 i 大的 j 的位置。而这时候, i 位置的右边也是有序的。即i位置右边都满足 a[i] > a[i+1].

    交换 i 和 j 位置的值,并且把 i 位置右边的区域反转。

    例如,

    4 5 2 6 3 1 

    按上面思路用笔画出来。

     结果是:

    4 5 3 1 2 6

    代码如下:

    public class leetcode31 {
    
        public static void main(String[] args) {
            // TODO Auto-generated method stub
    
            int[] nums = new int[]{1,2,3};
            nextPermutation(nums);
            for(int i:nums){
                System.out.print(i+" ");
            }
        }
    
        
        public static void nextPermutation(int[] nums) {
    
            int i = nums.length-2;
            while(i>=0&&nums[i]>=nums[i+1]){
                i--;
            }
            if(i>=0){
                int j = nums.length-1;
                while(j>=0 && nums[i]>=nums[j]){
                    j--;
                }
                swap(nums,i,j);
            }
            reverse(nums,i+1);
        }
        
        public static void  swap(int[] nums,int i,int j){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
        
        public static void reverse(int[] nums,int start){
            int left = start,right = nums.length-1;
            while(left<right){
                swap(nums,left,right);
                left++;
                right--;
            }
        }
        
    }
  • 相关阅读:
    java发送邮件
    MySQL查询表结构的SQL语句
    Jquery的toggle()方法
    jQuery为图片添加链接(创建新的元素来包裹选中的元素)
    mysql修改存储过程的权限
    php中接收参数,不论是来自GET还是POST方法
    解决php中文乱码
    MySQL的视图view,视图创建后,会随着表的改变而自动改变数据
    选项卡面向对象练习
    对数组的操作splice() 和slice() 用法和区别
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14568064.html
Copyright © 2011-2022 走看看