LeetCode 31 下一个排列

image.png

首先要在草稿纸上搞清楚什么是字典序的下一个排列,自己能够手写下一个排列。然后就不难想出我的这种思路了。当我也是经历了各种思维误区后才AC的。

解题思路

从后往前扫,如果右边的数比左边的大,那么就可以通过交换这两个数来使得整个排列更大。也就是说找到一个更大的数放到前面。但是这里要注意这个更大的数也不能最大,要是比前一个大的最小的数。现在直接看代码可能会清晰点。

代码

class Solution {
public:
    void nextPermutation(vector<int>& nums) {
        if(nums.size() < 2) return;
        int i = nums.size()-1;
        int minIndex = i;
        int j = i;
        while(i>0 && nums[i]<=nums[i-1]){
            i--;
        }
        if(i==0){//扫到最后一组了,还没有找到“逆序”的数,说明这个数组就是从大到小排列的,也就是最大排列,
                // 这个时候直接将数组反转,就变成了从小到大排列,这样就是最小排列了。
            reverse(nums.begin(),nums.end());
        }else{
            minIndex = i;
                //找了了这个逆序的i,但是要注意i-1不一定和i换,而应该是和i往右的所有数中比i-1大的最小的数
            for(j=i; j<nums.size(); j++){
                if(nums[j]>nums[i-1] && nums[j]<=nums[minIndex]){
                    minIndex = j;
                }
            }
            swap(nums[minIndex],nums[i-1]);
// 这种sort的用法是我自己想出来的,网上的都是以begin()开头的,而我是以end结尾,然后往后倒推的。
            sort(nums.end()-(nums.size()-i),nums.end());
        } 
    }
};

(文字写得不严谨,但是代码是严谨的。有收获的话求个赞…)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值