美文网首页
LeetCode-1053. 交换一次的先前排列

LeetCode-1053. 交换一次的先前排列

作者: 一只可爱的柠檬树 | 来源:发表于2019-05-29 13:00 被阅读0次

题目描述 [ 交换一次的先前排列]

给你一个正整数的数组 A(其中的元素不一定完全不同),请你返回可在 一次交换(交换两数字 A[i] 和 A[j] 的位置)后得到的、按字典序排列小于 A 的最大可能排列。

如果无法这么操作,就请返回原数组。

示例

输入:[3,2,1]
输出:[3,1,2]
解释:
交换 2 和 1

解题思路

从数组的末尾开始往前遍历,保证遍历过的子数组从后往前降序排列,找到第一个不满足降序要求的数字。例如对于数组[1,9,4,6,7],[7,6,4]降序排列,因此找到的第一个数字是9。然后将该数字与它后面小于它的最大数字交换即可。

代码

class Solution {
public:
    vector<int> prevPermOpt1(vector<int>& A) {
        for(int i=A.size()-2; i>=0; i--){
            if(A[i]>A[i+1]){
                for(int j=A.size()-1;j>i;j--){
                    if(A[j]<A[i]){
                        swap(A[i], A[j]);
                        return A;
                    }
                }
            }
        }
        return A;
    }
};

相关文章

  • LeetCode #1053 Previous Permutat

    1053 Previous Permutation With One Swap 交换一次的先前排列 Descrip...

  • 38-字符串的排列-排列组合

    排列 输入一个字符串,打印出该字符串中字符的所有排列。 排列算法基于交换,将当前项与后面的每一项都进行一次交换,就...

  • 全排列与全组合

    递归+交换值实现全排列 非重复的全排列 位运算实现全组和

  • 全排列算法

    全排列的定义见全排列.这里我们详细讲一下交换法和字典序法 交换法 举个简单的例子,假设我们要对1234进行全排列1...

  • 【OJ】亚信2017校招编程题

    【题目】string的全排列 【思路】用交换法产生全排列,因为是全排列,所以时间复杂度是阶乘 【代码】

  • 4.2 回溯法(2)

    套路 解决全排列问题可以用到回溯 全排列问题往往可以用交换两位置元素的方法,完成后续步骤后,需要回溯时再交换回原来...

  • 逆序数

    再来一个定义:交换一个排列中的两个数,则排列的奇偶性发生改变。 以上定义都摘自《高等代数》。 拼图排列必须是偶排列...

  • 排列组合与回溯法

    排列,组合,回溯法 ex.1 ex.2 排列 全排列:从第一个数字起,每个数字分别与它后面的数字交换 去重全排列:...

  • Java基础02 选择排序

    选择排序 选择排序和冒泡排序差不多,只不过它是每一次是固定位与其他位置进行比较交换,本文采用的是升序排列。下面来看...

  • JAVA-给定个数对象的全排列原理

    一直都不太理解递归,这次写全排列的时候找到一张图最为简单的解释了“固定-交换”求全排列的原理。 【ABC】按照当前...

网友评论

      本文标题:LeetCode-1053. 交换一次的先前排列

      本文链接:https://www.haomeiwen.com/subject/mzvmtctx.html