• 求解下一个排列


    这是LeetCode上的一道题:

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

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

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

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
    1,2,3 → 1,3,2
    3,2,1 → 1,2,3
    1,1,5 → 1,5,1

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/next-permutation
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    解题思路:从右向左扫描,我们假设从右向左是一个递增的序列,当碰到a[i-1]<a[i]后,停止扫描,并在a[a.length-1]和a[i]之间,从右向左,找到第一个比a[i-1]大的数,两者交换位置,然后对a[i]到a[a.length-1]的序列进行翻转的操作。

    代码如下(Java):

    class Solution {
        public void nextPermutation(int[] nums) {
           
            int i=nums.length-1;
            while(i-1>=0 && nums[i-1]>=nums[i]){
                i--;
            }
            if(i==0){
                reverse(nums,0);
                return;
            }
            
            int index = i;
            int j=nums.length-1;
            while(j>=index && nums[j]<=nums[index-1]){
                j--;
            }
            swap(nums,index-1,j);
            reverse(nums,index);
            
            
        }
        public void reverse(int[] nums,int index){
            int i=index;
            int j=nums.length-1;
            while(i<j){
                swap(nums,i,j);
                i++;
                j--;
            }
        }
        public void swap(int[] nums,int i,int j){
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }
  • 相关阅读:
    Lake Counting
    部分和问题
    迷宫最短路
    sublime 的使用技巧
    数组
    Factorial Trailing Zeroes
    Top K Frequent Elements
    Number of Connected Component in An Undirected Graph
    Zigzag Iterator
    Single Number III
  • 原文地址:https://www.cnblogs.com/Chsy/p/11757033.html
Copyright © 2020-2023  润新知