【leetcode】31. Next Permutation

网址

题目

这题意理解了好久。。一直没看懂输出怎么来的,看了讨论区才明白是要找到比当前输入刚好大的排列。

思路

我的思路一直都好直呀?
从数组的右端开始找存在右边比当前数字大的索引,若存在这样的索引,则再次寻找比当前索引值刚好大的索引交换两个值,排序索引后面的值;否则就排序整个数组。
研究了官方给的解法,发现我的解法绕了很多弯,比如寻找第一个索引,完全没必要两个循环套,只需比较相邻两个值的大小即可。找到索引i之后,可以充分利用i之后的值是递减的这一特性,从后往前找刚好比i大的j。最后的排序也是充分利用该特性,只需翻转数组即可。

来自solution的解法

public 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--;
            }
            swap(nums, i, j);
        }
        reverse(nums, i + 1);
    }

    private void reverse(int[] nums, int start) {
        int i = start, j = nums.length - 1;
        while (i < j) {
            swap(nums, i, j);
            i++;
            j--;
        }
    }

    private void swap(int[] nums, int i, int j) {
        int temp = nums[i];
        nums[i] = nums[j];
        nums[j] = temp;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值