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

力扣 下一个排列

交换位置,双指针,排序。

题目

下一个排列即在组成的排列中的下一个大的数,然后当这个排列为降序时即这个排列最大,因为大的数在前面,降序排列的下一个数即升序。所以,要是想找到当前排列的下一个排列,肯定是先从后面开始找,因为后面的数做交换才使得排列尽可能接近。可以想一下,从最后一个数往回找时,如果一直是升序,就说明已经是最大了,直到找到那个不是升序的数做交换,即要操作的下一排列了,交换时的数应该是扫描数组的大于目标数的最小数,这样才符合原数组的下一个排列。注意从后往前找的升序即从前往后的降序,找到目标数后,还要处理目标数的后面序列,从前往后看,显然刚刚扫描的序列是降序的,这样后面几个数组成的排列是最大的显然不符合下一个序列。在当前数do过后,后面的数应该是最小的即从前往后升序的状态。

时间复杂度: O(n),空间复杂度: O(1)。

class Solution {public void nextPermutation(int[] nums) {int i = nums.length - 2;while (i >= 0 && nums[i] >= nums[i + 1]) {i--;}if (i >= 0) {int j = nums.length - 1;while (j >= 0 && nums[i] >= nums[j]) {j--;}swap(nums, i, j);}reverse(nums, i + 1);}public void swap(int[] nums, int i, int j) {int temp = nums[i];nums[i] = nums[j];nums[j] = temp;}public void reverse(int[] nums, int start) {int left = start, right = nums.length - 1;while (left < right) {swap(nums, left, right);left++;right--;}}
}

也可以用sort方法直接排。

class Solution {public void nextPermutation(int[] nums) {int len = nums.length;for (int i = len - 1; i >= 0; i--) {if (i == 0) {Arrays.sort(nums);return;} else {if (nums[i] > nums[i - 1]) {Arrays.sort(nums, i, len);for (int j = i; j <len; j++) {if (nums[j] > nums[i - 1]){swap(nums,j,i-1);return;}}}}}}private void swap(int[] nums, int i,int j){int tmp =nums[i];nums[i]=nums[j];nums[j]=tmp;}
}

找准双指针扫描的范围,对准目标数做操控。 

 

http://www.lryc.cn/news/543039.html

相关文章:

  • JavaWeb 学习笔记
  • Linux7-线程
  • 在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案
  • 结构型模式 - 代理模式 (Proxy Pattern)
  • el-select滚动获取下拉数据;el-select滚动加载
  • HTTP GET 请求示例
  • 简单理解Oracle中的latch
  • ubuntu新系统使用指南
  • sage-huga改进SITAN
  • DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
  • Git add --- error: Filename too long
  • Python入门12:面向对象的三大特征与高级特性详解
  • 动态链接器(九):.init和.init_array
  • Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入
  • 安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!
  • 【落羽的落羽 数据结构篇】树、二叉树
  • [回顾]从原型链视角解读Vue底层实现Vue VueCompoent VM VC关系
  • springcloud nacos 整合seata解决分布式事务
  • 【算法系列】快速排序详解
  • 神经网络发展简史:从感知机到通用智能的进化之路
  • C语言番外篇(4)--------->goto语句
  • AI 编码 2.0 分析、思考与探索实践:从 Cursor Composer 到 AutoDev Sketch
  • Linux与自动化的基础
  • 安全开发-环境选择
  • 【算法设计与分析】(一)介绍算法与复杂度分析
  • SurfaceFlinger代码笔记
  • 2025 PHP授权系统网站源码
  • Fisher散度:从信息几何到机器学习的隐藏利器
  • 深度学习每周学习总结Y1(Yolov5 调用官方权重进行检测 )
  • 实体机器人在gazebo中的映射