LeetCode#31. Next Permutation

对于Java党,对这个题目都理解了半天啊啊啊啊啊

  • 题目:给定一个数组,求下一个字典序列

  • 难度:Medium

  • 思路:

    字典序列:
                1,2,3  -> 1,3,2
                3,2,1  -> 1,2,3
                1,2,4,3 -> 1,3,2,4
    所谓的求下一个字典排序,就是按照查字典的方式
    1.如果当前序列不是一个降序,则从后往前一定能找到一个元素位置为i,使得i位置对应的值小于i+1位置的值。
    
    2.找到这样的i之后,需要从后往前查找(直到i),找到第一个大于i位置元素的值,将两个位置的值进行交换
    
    3.交换之后,i位置之后的元素一定都是降序序列,需要对该降序序列进行一个反转(使得它成为一个升序序列)
    
  • 代码:
    1. 非递归方式
public class Solution {
    public void nextPermutation(int[] nums) {
        if(nums == null || nums.length <= 1){
            return ;
        }
        int i = nums.length -1 ;
        //先从后往前找到一个最短的不是降序的子数组(找到一个i使得i后面的元素有比i位置元素大的值)
        for(; i >= 1; i--){
            if(nums[i-1] < nums[i]){
                break;
            }
        }
        if(i != 0){
            swap(nums,i-1);
        }

        reverse(nums,i);
    }

    /**
     * 从后往前(直到i位置),找到第一个比nums[i]大的元素,两者进行交换
     */
    private void swap(int[] nums, int i){
        System.out.print(i);
        for(int j = nums.length-1; j > i; j--){
            if(nums[j] > nums[i]){
                int temp = nums[i];
                nums[i] = nums[j];
                nums[j] = temp;
                break;
            }
        }
    }

    /**
     * 将i位置以及后面的元素以升序排列(这一段序列是降序的)
     */
     private  void reverse(int[] nums, int i){
         System.out.print(i);
         int first = i;
         int last = nums.length-1;
         while(first < last){
             int temp = nums[first];
             nums[first] = nums[last];
             nums[last] = temp;
             first++;
             last--;
         }
     }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值