LeetCode No31. 下一个排列
发布日期:2021-05-07 23:15:38 浏览次数:22 分类:原创文章

本文共 1386 字,大约阅读时间需要 4 分钟。

题目描述

在这里插入图片描述

解答

找规律就行了:
在这里插入图片描述

class Solution {       public void nextPermutation(int[] nums) {           int n = nums.length;  //数组的长度        int i = n - 1;        //找到递减的第一个位置        while (i > 0 && nums[i - 1] >= nums[i]) {               --i;        }        //分类讨论:判断i是不是0        if (i == 0) {               //全部翻转即可            for (int j = 0; j < n / 2; j++) {                   nums[j] = nums[j] ^ nums[n - 1 - j];                nums[n - 1 - j] = nums[j] ^ nums[n - 1 - j];                nums[j] = nums[j] ^ nums[n - 1 - j];            }        } else {               //2 5 4 3            //这时nums[i]指向5            //先把5(包括自己)后面的都翻转:2 3 4 5            //再把5左边的值(2)先拿掉:X 3 4 5            //再把2后面比它大的数放这: 3 X 4 5            //把2塞回去: 3 2 4 5            //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++            //翻转i后面的            for (int j = i; j < i + (n - i) / 2; j++) {                   nums[j] = nums[j] ^ nums[n - 1 - (j - i)];                nums[n - 1 - (j - i)] = nums[j] ^ nums[n - 1 - (j - i)];                nums[j] = nums[j] ^ nums[n - 1 - (j - i)];            }            //找到i后面第一个比nums[i-1]大的数            int j = i;            while(j < n && nums[j] <= nums[i-1]){                   ++j;            }            //交换两个数            nums[j] = nums[j] ^ nums[i-1];            nums[i-1] = nums[j] ^ nums[i-1];            nums[j] = nums[j] ^ nums[i-1];        }    }}
上一篇:LeetCode No316. 去除重复字母
下一篇:LeetCode No503.下一个更大元素 II

发表评论

最新留言

不错!
[***.144.177.141]2025年04月02日 09时24分12秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章