当前位置: 首页 > news >正文

【每日一题Day166】LC1053交换一次的先前排列 | 贪心

交换一次的先前排列【LC1053】

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

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

虽然写出来了,但是花了55分钟…
还是有思路但是思路不清晰,然后直接敲代码,改来改去,老毛病了
笔试绝对ggg
看了别人的贪心,感觉自己笨笨的

  • 思路:贪心

    假设交换的左边元素为arr[i]arr[i]arr[i],右边的元素为arr[j]arr[j]arr[j]

    • 怎样交换一次可以使字典序减小?

      交换元素arr[i]>arr[j]arr[i]>arr[j]arr[i]>arr[j]时,可以使字典序较小,所以数组必须是非递增的

    • 如何使字典序小于原数组的情况下最大?【贪心】

      保留前面高位部分的数组,尽可能交换低位部分的数组,即尽可能最小化jjj的同时,最大化iii

      枚举每个右端点,此时的右端点rrr必须小于等于nums[j]nums[j]nums[j],找到在[i,r−1][i,r-1][i,r1]范围内,从右往左第一个大于其的左端点进行交换

      • 如果arr[r]>arr[j]arr[r] > arr[j]arr[r]>arr[j], 那么从右往左第一个大于arr[r]arr[r]arr[r]的左端点一定在i的左边包括i,那么我们无法获得比目前的排列更大的排列
      • 如果arr[r]==arr[j]arr[r] == arr[j]arr[r]==arr[j], 那么从右往左第一个大于arr[r]arr[r]arr[r]的左端点还是为iii,只需要修改右端点
      • 如果arr[r]<arr[j]arr[r] < arr[j]arr[r]<arr[j], 那么lll需要在[i+1,r−1][i+1,r-1][i+1,r1]的范围内才可能是字典序增大
  • 实现

    class Solution {public int[] prevPermOpt1(int[] arr) {int n = arr.length;int l = 0;// 升序数组本身就是最小排列while (l < n - 1 && arr[l] <= arr[l + 1]){l++;}if (l == n - 1) return arr; // 升序数组// 非升序数组 枚举每个右端点 找到从右往左第一个大于其的左端点进行交换// 之后交换的右端点必须小于等于arr[j],并且左端点l必须大于i才能使交换结果变小// 如果arr[r] > arr[j], 那么从右往左第一个大于arr[r]的左端点一定在i的左边包括i,那么我们无法获得比目前的排列更大的排列// 如果arr[r] == arr[j], 那么从右往左第一个大于arr[r]的左端点还是为i,只需要修改右端点// 如果arr[r] < arr[j], 那么l需要在[i+1,r-1]的范围内才可能是字典序增大int i = -1, j = -1;// 记录最终的交换结果for (int r = n - 1; r > i; r--){if (j != -1 && arr[r] > arr[j]) continue;if (j != -1 && arr[r] == arr[j]) {j = r;continue;}for (l = r - 1; l >= (i != -1 ? i + 1 : 0); l--){if (arr[l] > arr[r]){i = l;j = r;break;}}}// 交换int tmp = arr[i];arr[i] = arr[j];arr[j] = tmp;return arr;}
    }
    
    • 复杂度
      • 时间复杂度:O(n2)O(n^2)O(n2)
      • 空间复杂度:O(1)O(1)O(1)
  • 别人的贪心
    我们先从右到左遍历数组,找到第一个满足 arr[i−1]>arr[i]arr[i−1]>arr[i]arr[i1]>arr[i]的下标 iii,此时 arr[i−1]arr[i−1]arr[i1]就是我们要交换的数字,我们再从右到左遍历数组,找到第一个满足 arr[j]<arr[i−1]arr[j]<arr[i−1]arr[j]<arr[i1]arr[j]≠arr[j−1]arr[j] \neq arr[j - 1]arr[j]=arr[j1] 的下标 j,此时我们交换 arr[i−1]arr[i−1]arr[i1]arr[j]arr[j]arr[j] 后返回即可。

class Solution {public int[] prevPermOpt1(int[] arr) {int n = arr.length;for (int i = n - 1; i > 0; --i) {if (arr[i - 1] > arr[i]) {for (int j = n - 1; j > i - 1; --j) {if (arr[j] < arr[i - 1] && arr[j] != arr[j - 1]) {int t = arr[i - 1];arr[i - 1] = arr[j];arr[j] = t;return arr;}}}}return arr;}
}作者:ylb
链接:https://leetcode.cn/problems/previous-permutation-with-one-swap/solutions/2205403/python3javacgotypescript-yi-ti-yi-jie-ta-pxxt/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
  • 复杂度
    • 时间复杂度:O(n)O(n)O(n)
    • 空间复杂度:O(1)O(1)O(1)

相关文章:

【每日一题Day166】LC1053交换一次的先前排列 | 贪心

交换一次的先前排列【LC1053】 给你一个正整数数组 arr&#xff08;可能存在重复的元素&#xff09;&#xff0c;请你返回可在 一次交换&#xff08;交换两数字 arr[i] 和 arr[j] 的位置&#xff09;后得到的、按字典序排列小于 arr 的最大排列。 如果无法这么操作&#xff0c;…...

Canal增量数据订阅和消费——原理详解

文章目录 简介工作原理MySQL主备复制原理canal 工作原理Canal-HA机制应用场景同步缓存 Redis /全文搜索 ES下发任务数据异构简介 canal 翻译为管道,主要用途是基于 MySQL 数据库的增量日志 Binlog 解析,提供增量数据订阅和消费。 早期阿里巴巴因为杭州和美国双机房部署,存…...

为什么要使用线程池

Java线程的创建非常昂贵&#xff0c;需要JVM和OS&#xff08;操作系统&#xff09;配合完成大量的工作&#xff1a; (1)必须为线程堆栈分配和初始化大量内存块&#xff0c;其中包含至少1MB的栈内存。 (2)需要进行系统调用&#xff0c;以便在OS&#xff08;操作系统&#xff09;…...

在云服务部署前后端以及上传数据库

1.上传数据库(sql文件) 首先建立一个目录&#xff0c;用于存放要部署的sql文件&#xff0c;然后在此目录中进入mysql 进入后建立一个数据库&#xff0c;create database 数据库名 完成后&#xff0c;通过select * from 表名可以查到数据说明导入成功。 2.部署Maven后端 将Ma…...

Onedrive for Business迁移方案 | 分享一

文章目录 前言 一、Onedrive for Business迁移方案应用范围? 1.准备目标平台 2.导出源平台数据 <...

pt01数据类型、语句选择

python01 pycharm常用快捷键 (1) 移动到本行开头&#xff1a;home键 (2) 移动到本行末尾&#xff1a;end键盘 (3) 注释代码&#xff1a;ctrl / (4) 复制行&#xff1a;ctrl d #光标放行上 (5) 删除行&#xff1a;shift delete (6) 选择列&#xff1a;shift alt 鼠标左键…...

ChatGPT 存在很大的隐私问题

当 OpenAI 发布时 2020 年 7 月的 GPT-3&#xff0c;它提供了用于训练大型语言模型的数据的一瞥。 根据一篇技术论文&#xff0c;从网络、帖子、书籍等中收集的数百万页被用于创建生成文本系统。 在此数据中收集的是您在网上分享的一些关于您自己的个人信息,这些数据现在让 O…...

图的迭代深度优先遍历

图的深度优先遍历(或搜索)类似于树的深度优先遍历(DFS)。这里唯一的问题是,与树不同,图可能包含循环,因此一个节点可能会被访问​​两次。为避免多次处理一个节点,请使用布尔访问数组。 例子: 输入: n = 4, e = 6 0 -> 1, 0 -> 2, 1 -> 2, 2 -> 0, …...

华为OD机试-开放日活动-2022Q4 A卷-Py/Java/JS

某部门开展Family Day开放日活动&#xff0c;其中有个从桶里取球的游戏&#xff0c;游戏规则如下:有N个容量一样的小桶等距排开&#xff0c;且每个小桶都默认装了数量不等的小球&#xff0c; 每个小桶装的小球数量记录在数组 bucketBallNums 中,游戏开始时&#xff0c;要求所有…...

两亲性聚合物:Lauric acid PEG Maleimide,Mal-PEG-Lauric acid,月桂酸PEG马来酰亚胺,试剂知识分享

Lauric acid PEG Maleimide&#xff0c;Lauric acid PEG Mal| 月桂酸PEG马来酰亚胺 | CAS&#xff1a;N/A | 端基取代率&#xff1a;95%一、试剂参数信息&#xff1a; 外观&#xff08;Appearance&#xff09;&#xff1a;灰白色/白色固体或粘性液体取决于分子量 溶解性&am…...

FB使用入口点函数例子

一、DLL的入口点 1.1 VFB的自带DLL模式入口 FB是把代码转成C&#xff08;GCC编译&#xff09;或者汇编&#xff08;GAS编译&#xff09;后编译的&#xff0c;本身就有一个main函数&#xff0c;所以在程序里其实不需要入口点&#xff0c;直接写就可以顺序执行&#xff0c;而有的…...

学习周报4/9

文章目录前言文献阅读摘要简介方法结论时间序列预测总结前言 本周阅读文献《Improving LSTM hydrological modeling with spatiotemporal deep learning and multi-task learning: A case study of three mountainous areas on the Tibetan Plateau》&#xff0c;文章主要基于…...

49天精通Java,第14天,Java泛型方法的定义和使用

目录一、基本介绍1、Java泛型的基本语法格式为&#xff1a;2、在使用泛型时&#xff0c;还需要注意以下几点&#xff1a;二、泛型的优点1、类型安全2、消除强制类型转换3、更高的效率4、潜在的性能收益三、常见泛型字母含义四、使用泛型时的注意事项五、泛型的使用1、泛型类2、…...

20230402英语学习

reasonable adj.合理的&#xff1b;通情达理的&#xff1b;明智的&#xff0c;理智的 abstract adj.抽象的&#xff0c;理论的 reflection n.反射; 映像, 倒影; 反映; 表达, 抒发; (长相等)酷似的人; 惟妙惟肖的事物; 深思; 考虑 instruction n.教授; 教导, 指导; 指示, 命令…...

Java知识复习(十七)SpringCloud

1、什么是微服务架构 微服务架构就是将单体的应用程序分成多个应用程序&#xff0c;这多个应用程序就成为微服务&#xff0c;每个微服务运行在自己的进程中&#xff0c;并使用轻量级的机制通信这些服务围绕业务能力来划分&#xff0c;并通过自动化部署机制来独立部署。这些服务…...

MySQL 数据库操作

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、关系模型二、数据库的操作 创建数据库查看数据库选择数据库删除数据库三、MySQL 数据库命名规范总结一、关系模型 关系数据库是建立在关系模型上的。而关系模…...

Cesium更换地球背景

设置背景图片 #cesiumContainer {width: 100%;height: 100%;background-image: url("/assets/image/背景.png"); }设置渲染, 用来去掉地球表面的大气效果的黑圈问题 this.viewer new Cesium.Viewer("cesiumContainer", {......// 设置渲染orderIndepe…...

测试人员的瓶颈期

测试人员的瓶颈期 做测试久了&#xff0c;会在所难免地碰到职业瓶颈期&#xff0c;这很正常&#xff0c;从事任何职业的工作人员都会遇到&#xff0c;关键是要看你如何去克服它。对优秀的软件测试人员来讲&#xff0c;除了要具备全面的技能、丰富的经验、良好的心理素质&#x…...

HTML5 <form> 标签

HTML5 <form> 标签 实例 带有两个输入字段和一个提交按钮的 HTML 表单&#xff1a; <form action"demo_form.php" method"get">First name: <input type"text" name"fname"><br>Last name: <input type&qu…...

编译技术-词法理论

一、文法的种类 1.1 分类定义 Chomsky 文法定义&#xff1a; G(V,Vt,P,Z)G (V, V_t, P, Z)G(V,Vt​,P,Z)VVV&#xff1a;符号集合VtV_tVt​&#xff1a;终结符号集合PPP &#xff1a;有穷规则集合ZZZ&#xff1a;是被符号&#xff0c;不能是终结符 关于不同文法的区别 类型…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...

第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词

Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵&#xff0c;其中每行&#xff0c;每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid&#xff0c;其中有多少个 3 3 的 “幻方” 子矩阵&am…...

稳定币的深度剖析与展望

一、引言 在当今数字化浪潮席卷全球的时代&#xff0c;加密货币作为一种新兴的金融现象&#xff0c;正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而&#xff0c;加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下&#xff0c;稳定…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...