关闭页面特效

leetcode_no_31 下一个排列

题目

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1

代码

/** * 参考: * https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode/ */ public class Solution { public static void main(String[] args) { } public static void nextPermutation(int[] nums) { // 分成两步: // 第一步:从后往前找到第一个下标为i的元素,a[i] < a[i + 1] // 第二步:将a[i](除a[i]外)) 后面的所有的元素从小到大排序 int i = nums.length - 2; // i >=0 确保不会出现数组越界异常 while (i >= 0 && nums[i] >= nums[i+1]) { i--; } // nums[i] < nums[i+1] if (i >= 0) { int j = nums.length - 1; while (j >= 0 && nums[j] <= nums[i]) { j--; } // 此时 nums[j] > nums[i] swap(nums, i, j); } // 将 i + 1 之后的元素排序 sort(nums, i + 1); } // 这里的排序算法和以往的都不一样,这是因为数组nums在下标start之后的元素是从大到小排序的 // 所以只需要反转即可将nums[start] 之后的元素从小到大排序 public static void sort(int[] nums, int start) { int end = nums.length - 1; while (start < end) { swap(nums, start, end); start++; end--; } } // 数值交换 private static void swap(int[] nums, int i, int j) { nums[i] = nums[i] ^ nums[j]; nums[j] = nums[i] ^ nums[j]; nums[i] = nums[i] ^ nums[j]; } }

__EOF__

作  者行走在代码边缘
出  处https://www.cnblogs.com/zhangyuestudying/p/13843820.html
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!

posted @   行走在代码边缘  阅读(76)  评论(0编辑  收藏  举报
编辑推荐:
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
阅读排行:
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· 程序员常用高效实用工具推荐,办公效率提升利器!
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 【译】WinForms:分析一下(我用 Visual Basic 写的)
点击右上角即可分享
微信分享提示