• LeetCode 31. 下一个排列


    题目链接

    31. 下一个排列

    题目分析

    这个题我好像在算法课上听过,因此5个月前我用算法课上的想法实现了一次,但是时隔5个月,我却忘记了之前的思路,所以专门再写一篇记录文章。
    这个题要求我们找比这个数大的最小元素,比如说1 4 2 3 1,那么比这个数更大的最小元素就是1 4 3 1 2
    那么其实根据这个思路我们就很好理解了,我们需要从尾巴开始找,找到第一对正序对,因为当a[i] < a[j] (i < j) 的情况下, 我们把a[j] 和a[i]对调,得到的元素肯定比原来的要大。
    第二个问题是怎么确保这个元素是比原来的数值大的最小元素呢?
    我们可以利用排序的思想,将j + 1到最后一个元素按照升序的思想进行排序,那么这部分的元素绝对是最小的。

    代码实现

    class Solution {
        public void nextPermutation(int[] nums) {
            int n = nums.length-1;
            for (int i = n-1; i >= 0; i--) {
                for(int j = n;j>i;j--){
                    // 找到a[j] > a[i]的情况,调换两者然后对i + 1到 nums.length 进行排序
                    if (nums[j]>nums[i]){
                        int temp = nums[i];
                        nums[i] = nums[j];
                        nums[j] = temp;
                        Arrays.sort(nums,i+1,n+1);
                        return;
                    }
                }
            }
    //当数组本身就是降序的时候,下一个更大的元素就应该将整个数组进行排序
            Arrays.sort(nums);
        }
    }
    
  • 相关阅读:
    Nucleus 的网络部分
    VS2005中TextBox的ReadOnly属性(转贴)
    VS2005中TextBox的ReadOnly属性导致的问题
    外部中断
    Linux操作系统文件链接问题
    IIS 服务不能自动启动
    转贴:[C++]static用法
    串口测试的一些体会
    字符串的两种声明方式
    Tornado 2.2 中vxsim出问题的解决方法
  • 原文地址:https://www.cnblogs.com/ZJPaang/p/13617375.html
Copyright © 2020-2023  润新知