美文网首页
31-下一个排列

31-下一个排列

作者: 饮酒醉回忆 | 来源:发表于2019-07-25 10:58 被阅读0次

    下一个排列

    题目

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

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

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

    以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
    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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    思路

    要下一个更大的数,因此会从后向前来比,如果有一个数是数组中的一个小高峰,则说明可以围绕这个小高峰进行修改.将高峰前一个,与高峰后的合适位置进行互换.然后在再所有后面的元素重排序.

    代码

    class Solution {
        public void nextPermutation(int[] nums) {
            int i = nums.length-2;
            while(i >=0 && nums[i+1] <= nums[i]){
                i--;
            }
            if(i >= 0){
                int j = nums.length-1;
                while(j >= 0&& nums[j] <= nums[i]){
                    j--;
                }
                changeNum(i,j,nums);
                reverse(nums, i + 1);
            }else{
                reverse(nums, i + 1);
            }
        }
        
        private void reverse(int[] nums, int start) {
            int i = start, j = nums.length - 1;
            while (i < j) {
                changeNum(i,j,nums);
                i++;
                j--;
            }
        }
        
        public void changeNum(int j,int i,int[] nums){
            int temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
            return;
        }
    }
    

    相关文章

      网友评论

          本文标题:31-下一个排列

          本文链接:https://www.haomeiwen.com/subject/wmvcrctx.html