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

leecode 31.下一个排列(Golang)

题目:

整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。

如何解决题目:

主要实现目标可以拆分为几点:

1.比之前要大

2.在比之前要大的基础上      ,要最小的那个

3.如果没有比之前更大的了, 比如  3->2->1 这样的倒序序列,则整体反转

实现步骤:

1.从后向前 查找第一个 相邻升序 的元素对 (i,j),满足 A[i] < A[j]。此时 [j,end) 必然是降序 
2.在 [j,end) 从后向前 查找第一个满足 A[i] < A[k] 的 k。A[i]、A[k] 分别就是上文所说的「小数」、「大数」
3.将 A[i] 与 A[k] 交换 //将最小的数 放到前面
4.可以断定这时 [j,end) 必然是降序,逆置 [j,end),使其升序 //换的那个数 还是小于换之前的,所以依然是降序,要更小一点,所以反转
5.如果在步骤 1 找不到符合的相邻元素对,说明当前 [begin,end) 为一个降序顺序,则直接跳到步骤1

三、具体代码


func nextPermutation(nums []int) []int {length := len(nums)right := length - 1left := 0flag := false // 用来看是否找到了右边比左边大的值for right > left {if nums[right] > nums[right-1] { //低位的数字   大于高位的了,也就是找到了flag = true//从右开始找到第一个大于right-1的 , 也就是找到最小的比    right-1大的值, 交换,交换完  右边还是降序,因为找的是第一个for i := length - 1; i >= right; i-- {if nums[i] > nums[right-1] {nums[i], nums[right-1] = nums[right-1], nums[i]break}}reverse(nums, right, length-1)break}right--}if !flag {reverse(nums, 0, length-1)}return nums}func reverse(nums []int, start, end int) {for start < end {nums[start], nums[end] = nums[end], nums[start]start++end--}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数学基础 -- 线性代数之矩阵因式分解
  • 2024 年的 Web3 游戏:演变、趋势和市场动态
  • 卷积神经网络(CNN):算法、原理与应用
  • Java 如何实现一个简单 RabbitMQ 示例
  • 前端速通面经八股系列(六)—— Vue(下)
  • python的版本如何选择?
  • 【Python 报错已解决】`TypeError: ‘method‘ object is not subscriptable`
  • 如何有效防御区块链中的黑客攻击
  • Elasticsearch 8.13.4 LocalDateTime类型转换问题
  • OpenCV小练习:人脸检测
  • [Linux]如何將A主機的docker image轉移到B主機,並在B主機中重新配置和執行該docker image?
  • C++(this指针/常函数与常对象/拷贝构造函数/赋值函数/静态成员/静态成员函数/单列模式)
  • JAVA中的元注解
  • 【nvm】解决问题: Could not retrieve https://nodejs.org/dist/index.json.
  • 学习 TagUI 踩过的坑
  • chrome扩展demo1-小时钟
  • co.js - 让异步代码同步化
  • create-react-app项目添加less配置
  • HTTP 简介
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript实现分页效果
  • Selenium实战教程系列(二)---元素定位
  • Vue 2.3、2.4 知识点小结
  • 成为一名优秀的Developer的书单
  • 聚类分析——Kmeans
  • 来,膜拜下android roadmap,强大的执行力
  • 双管齐下,VMware的容器新战略
  • Oracle Portal 11g Diagnostics using Remote Diagnostic Agent (RDA) [ID 1059805.
  • raise 与 raise ... from 的区别
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • # Panda3d 碰撞检测系统介绍
  • #传输# #传输数据判断#
  • (2)STL算法之元素计数
  • (C++)八皇后问题
  • (多级缓存)缓存同步
  • (翻译)terry crowley: 写给程序员
  • (附源码)ssm高校升本考试管理系统 毕业设计 201631
  • (十) 初识 Docker file
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (自适应手机端)行业协会机构网站模板
  • .naturalWidth 和naturalHeight属性,
  • .net core IResultFilter 的 OnResultExecuted和OnResultExecuting的区别
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET框架
  • .project文件
  • @RequestMapping 的作用是什么?
  • [ C++ ] STL---string类的模拟实现
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [12] 使用 CUDA 加速排序算法
  • [C/C++]数据结构----顺序表的实现(增删查改)
  • [HTML]Web前端开发技术6(HTML5、CSS3、JavaScript )DIV与SPAN,盒模型,Overflow——喵喵画网页
  • [H贪心] lc100376. 新增道路查询后的最短距离 II(贪心+读题+代码实现+周赛409_3)