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

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 - 1
	left := 0

	flag := 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--
	}

}


http://www.kler.cn/news/288979.html

相关文章:

  • 深度学习100问27:什么是截断的BPTT
  • mysql的组从复制
  • 检测文件解析漏洞的工具
  • 技术Leader在训练团队思考力中的核心职责
  • MySQL常用的查询优化分析方法有哪些?
  • 【Qt】 QComboBox | QSpinBox
  • 【qt】qss使用
  • 钢铁百科:A633GrE钢板材质、A633GrE力学性能、A633GrE执行标准
  • JAVA - 关于防重复提交探讨
  • uniapp scroll-view滚动触底加载 height高度自适应
  • centos7 安装python3.12.5
  • 【链表】环形链表
  • Linux-centos7目录结构
  • C++入门基础知识45——【关于C++ 函数】定义函数、函数声明
  • 【网络安全】服务基础第一阶段——第六节:Windows系统管理基础---- DNS部署与安全
  • 【WPF动画】
  • kubeadm部署 Kubernetes(k8s) 高可用集群【V1.20 】
  • 智能创作与优化新时代:【ChatGPT-4o】在【数学建模】、【AI绘画】、【海报设计】与【论文优化】中的创新应用
  • 深度学习100问13:什么是二分类问题
  • 项目实战 ---- 商用落地视频搜索系统(5)---service层核心
  • Python进阶08-爬虫
  • 前端 数值列 禁止输入多个小数点
  • 按图搜索与精准营销:深度剖析拍立淘API用户画像构建
  • AlphaGo围棋模型——基于python语言
  • 交叉编译 gdb
  • HarmonyOS开发实战( Beta5版)优化实践/合理使用缓存提升性能
  • Linux 命令行快捷键
  • Netty Reactor面试连环问
  • 学习笔记 ---- 莫比乌斯反演总结
  • Spring Boot 入门