LeetCode: Next Permutation

本文介绍了一种寻找整数序列下一个更大排列的方法。通过三步实现:首先从尾部找到递增序列前的一个元素A[k],其次找到最接近A[k]且大于它的元素A[i]并进行交换,最后反转A[k]后的子序列。该方法适用于数组中无重复元素的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

1) 从数组尾部开始,找一个递增序列,直到出现A[k] < A[k+1](注意不能是等于);

2) 从A[k]开始向后搜索A[i],使得A[i]与A[k]的差是最小的(因为后面所有的数都比A[k]大,这里找一个差就小就是最接近A[k]),交换A[i] 和 A[k];

3)反转A[k]后面子序列,不包含A[k]。

code:

class Solution {
public:
    void swap(int& a,int &b){
        a ^= b;
        b ^= a;
        a ^= b;
    }
    void reverseArray(vector<int>::iterator begin, vector<int>::iterator end) {  
        while (begin < end) {  
            swap(*begin,*end);
            begin++;  
            end--;  
        }  
    }  
    void nextPermutation(vector<int> &A) {
        int len = A.size(), index=-1;
        for(int i=len-1;i>=1;i--)
            if(A[i-1] < A[i]){//注意不能包含等于
                index = i-1;
                break;
            }
        if(index ==-1 ){
            reverseArray(A.begin(),A.end()-1);
            return;
        }
        int minV = A[index+1] - A[index], indexCh = index+1;
        for(int i = index+2;i < len;i++){
            if(A[i] > A[index] && A[i] - A[index] <= minV){//注意等于号不要丢到
                minV = A[i] - A[index];
                indexCh = i;
            }
        }
        swap(A[index],A[indexCh]);
        
        reverseArray(A.begin()+index+1,A.end()-1);
    }
};



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值