前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【leetcode刷题】T184-交换一次的先前排列

【leetcode刷题】T184-交换一次的先前排列

作者头像
木又AI帮
发布2019-10-21 15:32:36
3140
发布2019-10-21 15:32:36
举报
文章被收录于专栏:木又AI帮

【题目】

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

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

代码语言:javascript
复制
示例 1:
输入:[3,2,1]
输出:[3,1,2]
解释:
交换 2 和 1


示例 2:
输入:[1,1,5]
输出:[1,1,5]
解释: 
这已经是最小排列


示例 3:
输入:[1,9,4,6,7]
输出:[1,7,4,6,9]
解释:
交换 9 和 7


示例 4:
输入:[3,1,1,3]
输出:[1,3,1,3]
解释:
交换 1 和 3

提示:

1 <= A.length <= 10000 1 <= A[i] <= 10000

【思路】

很明显,如果数组从小到大排序,则肯定是最小排列;否则,修改最后一个排序错误的数字。

具体来说,从后往前遍历数组,如果A[i] <= A[i+1],不用进行任何操作;否则,找到i后面最后一个小于A[i]的元素A[j](如有重复,则为第一个重复元素),最后替换A[i]和A[j]。

【代码】

python版本

代码语言:javascript
复制
class Solution(object):
    def prevPermOpt1(self, A):
        """
        :type A: List[int]
        :rtype: List[int]
        """
        if len(A) < 1:
            return A
        i = len(A) - 2
        while i >= 0:
            if A[i] > A[i+1]:
                # 直接和最后一个元素比较
                if A[i] > A[-1]:
                    A[i], A[-1] = A[-1], A[i]
                else:
                    # 找到大于A[i]的第一个元素的前一个元素
                    j = i+2
                    while A[i] > A[j]:
                        j += 1
                    j -= 1
                    # 如果相邻的有重复元素,则必须找到重复元素第一个
                    while A[j] == A[j-1]:
                        j -= 1
                    A[i], A[j] = A[j], A[i]
                break
            i -= 1
        return A
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 木又AI帮 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档