• 下一个排列(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--;
            }
        }
        
    }
  • 相关阅读:
    https 适配
    SDWebImage 的简单使用方法
    第三方API使用的好习惯
    关于IPicture::Render函数
    标准模板库(STL)MAP容器使用详解
    STL容器
    c++ 遍历map的时候删除元素
    C++的try_catch异常
    Makefile 自动生成头文件的依赖关系 .
    调试过程中,内存泄露检测信息
  • 原文地址:https://www.cnblogs.com/Vincent-yuan/p/14568064.html
Copyright © 2020-2023  润新知