首页 > 其他分享 >[leetcode每日一题]4.3

[leetcode每日一题]4.3

时间:2023-04-03 11:08:37浏览次数:49  
标签:arr 4.3 示例 int List 每日 交换 st leetcode

1053. 交换一次的先前排列

提示

中等

80

相关企业

给你一个正整数数组 arr(可能存在重复的元素),请你返回可在 一次交换(交换两数字 arr[i] 和 arr[j] 的位置)后得到的、按字典序排列小于 arr 的最大排列。

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

 

示例 1:

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

示例 2:

输入:arr = [1,1,5]
输出:[1,1,5]
解释:已经是最小排列

示例 3:

输入:arr = [1,9,4,6,7]
输出:[1,7,4,6,9]
解释:交换 9 和 7

 

提示:

  • 1 <= arr.length <= 104
  • 1 <= arr[i] <= 104

Solution

经过一早上的思考得出,如果想要达到字典序最小的元素,则必须选取最大的下标i满足i后面的位置存在数比arr[i]小,并与比其小的最大的那个数进行交换。如果有多个最大的那个数,那么交换最前面的那个最大的数。

我的做法是单调栈,每次考虑一个新元素的时候就更新可以交换的数。

class Solution:
    def prevPermOpt1(self, arr: List[int]) -> List[int]:
        st = []
        a, b = -1, -1
        for i in range(len(arr)):
            while st and arr[i] >= arr[st[-1]]:
                st.pop()
            if not st or arr[i] < arr[st[-1]]:
                st.append(i)
            if len(st) >= 2 and (a < st[-2] or a == st[-2] and arr[b] < arr[st[-1]]):
                a, b = st[-2], st[-1]
        if a != -1 and b != -1:
            arr[a], arr[b] = arr[b], arr[a]
        return arr

但是那样太慢了,根据上面的分析应该用贪心。每次去贪最后那个数。当然这个代码还是有点技巧的。这两次只判断相邻大小就很妙。

class Solution:
    def prevPermOpt1(self, arr: List[int]) -> List[int]:
        n = len(arr)
        for i in range(n - 2, -1, -1):
            if arr[i] > arr[i + 1]: # 只要判断相邻的大小
                j = n - 1
                while arr[j] >= arr[i] or arr[j] == arr[j - 1]: # 只要判断相邻的大小
                    j -= 1
                arr[i], arr[j] = arr[j], arr[i]
                break
        return arr

作者:力扣官方题解
链接:https://leetcode.cn/problems/previous-permutation-with-one-swap/solutions/2202472/jiao-huan-yi-ci-de-xian-qian-pai-lie-by-evkqi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


标签:arr,4.3,示例,int,List,每日,交换,st,leetcode
From: https://blog.51cto.com/u_15763108/6165716

相关文章

  • 【DP】LeetCode 256. 粉刷房子
    题目链接256.粉刷房子假如有一排房子,共n个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜......
  • leetcode题中的逆向思维——集锦
    417.太平洋大西洋水流问题虽然题目要求的是满足向下流能到达两个大洋的位置,如果我们对所有的位置进行搜索,那么在不剪枝的情况下复杂度会很高。因此我们可以反过来想,从两个大洋开始向上流,这样我们只需要对矩形四条边进行搜索。搜索完成后,只需遍历一遍矩阵,满足条件的位置即为两个......
  • 每日总结2023-04-02
    今天完成了厂商端 1.登录界面  2.查看数据界面,在此界面商家收到通知增加待完成选项,并选择是否准备好以及完成。   3.个人信息界面,可以保存个人信息 ......
  • 2024届计算机秋招100天备战:力扣每日打卡挑战全记录 & 面试题总结
    最近两个月力扣困难题不再落下,打卡全满勤,激发了持续刷题的斗志。这里将持续记录打卡过程中的难题和面试八股。2023/4/21039.多边形三角剖分的最低得分题目大意:多边形每个节点有一个数值,将多边形三角剖分,得分为所有三角形节点乘积之和。求三角剖分后的最低得分。做题评价:虽......
  • 每日总结 4.2
    今天进行了支付页面的编写,如下:  <!--pages/info/info.wxml--><viewclass="view1"><viewclass="thumb"><textclass="t1">{{name}}</text><imagesrc="{{image}}"mode=""/></......
  • 寒假每日一题——贝茜放慢脚步
    贝茜放慢脚步问题描述奶牛贝茜正在参加冬季哞林匹克运动会的越野滑雪比赛。她以每秒1米的速度出发。但是,随着时间的推移,她变得越来越疲倦,她开始放慢脚步。每次放慢脚步,贝茜的速度都会降低:减速一次后,她以每秒1/2米的速度移动,减速两次后,则以每秒1/3米的速度移动,依此类推......
  • 寒假每日一题——圆形牛棚
    圆形牛棚问题描述作为当代建筑的爱好者,农夫约翰建造了一个完美圆环形状的新牛棚。牛棚内部有n个房间,围成一个环形,按顺时针编号为1∼n。每个房间都既有通向相邻两个房间的门,也有通向牛棚外部的门。约翰想让第i个房间内恰好有ri头牛。为了让奶牛们有序的进入牛棚,他计划......
  • 寒假每日一题——镜子田地
    镜子田地问题描述农夫约翰在屋子外面放了一些旧镜子,他的奶牛们像往常一样调皮地偷走了它们!奶牛们将镜子放置在了一个矩形田地中,该田地可被划分为N×M个方格区域。在每个方格区域中,奶牛在其某对对角之间放置一个双面镜,因此,共有两种放法,一种为/放置(镜子连接方格左下角和右......
  • 寒假每日一题——懒惰的牛
    懒惰的牛问题描述这是一个炎热的夏日。懒洋洋的奶牛贝茜想将自己放置在田野中的某个位置,以便可以在短距离内尽可能多地吃到美味的草。贝茜所在的田野中共有N片草地,我们可以将田野视作一个一维数轴。第i片草地中包含gi单位的青草,位置坐标为xi。不同草地的位置不同。......
  • 寒假每日一题——金发姑娘和N头牛(map+手写离散化)
    金发姑娘和N头牛问题描述你可能听过关于金发姑娘和三只熊的经典故事。然而,鲜为人知的是,金发姑娘最终成了一个农民。在她的农场中,她的牛棚里有N头奶牛。不幸的是,她的奶牛对温度相当敏感。对于奶牛i,使其感到舒适的温度为Ai…Bi。如果金发姑娘将牛棚的恒温器的温度T设置......