当前位置:网站首页>每日一题-下一个排列-0723
每日一题-下一个排列-0723
2022-08-05 05:17:00 【菜鸡程序媛】
题目
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。
例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。
整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。
例如,arr = [1,2,3] 的下一个排列是 [1,3,2] 。
类似地,arr = [2,3,1] 的下一个排列是 [3,1,2] 。
而 arr = [3,2,1] 的下一个排列是 [1,2,3] ,因为 [3,2,1] 不存在一个字典序更大的排列。
给你一个整数数组 nums ,找出 nums 的下一个排列。
必须 原地 修改,只允许使用额外常数空间。
思路
- 从右面开始找到第一对左面比右面小的组合,确定 j,nums[j] < nums[i]
- 如果这个时候 j>=0,证明存在上面这样的组合,这个时候赋值k=nums.length-1的下标,找到最右面第一个比nums[j]大的数字(因为队尾肯定是从j开始往后算最小的数字),与nums[j]进行交换;如果j<0,证明当前的数组是严格单调递减的,已经是最大的排列了,那么直接执行第三步
- 就是将j+1开始的下标,与后面的数字进行交换,实现单调递增,即越小的数字位数越高
代码
public void nextPermutation(int[] nums) {
if(nums == null || nums.length <= 0)
return;
// 找到第一对前面数字小于后面数字的
int i = nums.length - 1;
int j = nums.length - 2;
while((j >= 0) && (nums[j] >= nums[i])){
j --;
i --;
}
if(j >= 0 && nums[j] < nums[i]) {
int k = nums.length - 1;
while((k > j) && nums[k] <= nums[j]){
k --;
}
swap(nums, j, k);
}
reverse(nums, j + 1);
}
private void swap(int[] nums, int j, int k){
int temp = nums[j];
nums[j] = nums[k];
nums[k] = temp;
}
private void reverse(int[] nums, int index){
int left = index, right = nums.length - 1;
while(left < right){
swap(nums, left, right);
left ++;
right --;
}
}
边栏推荐
- 深度学习系列(一)简介、线性回归与成本函数
- 伪RTOS-ProroThread在CH573芯片上的移植
- 【ts】typescript高阶:模版字面量类型
- 【UiPath2022+C#】UiPath If条件语句
- TinyFlashDB:一种超轻量的可纠错的通用单片机flash存储方案
- 浅谈遇到的小问题
- C语言入门笔记 —— 初识
- 【UiPath2022+C#】UiPath 练习和解决方案-变量、数据类型和控制流程
- 原型版本管理
- [Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
猜你喜欢
[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers
C语言入门笔记 —— 函数(1)
伪RTOS-ProroThread在CH573芯片上的移植
物联网-广域网技术之NB-IoT
AIDL detailed explanation
发顶会顶刊论文,你应该这样写作
面向小白的深度学习代码库,一行代码实现30+中attention机制。
Tensorflow steps on the pit notes and records various errors and solutions
网络信息安全运营方法论 (中)
[Database and SQL study notes] 8. Views in SQL
随机推荐
HuiFer 带你读懂 BeanFactory getBean 方法
【shell编程】第三章:函数
【ts】typescript高阶:键值类型及type与interface区别
【论文阅读-表情捕捉】ExpNet: Landmark-Free, Deep, 3D Facial Expressions
ECCV2022 | RU&谷歌提出用CLIP进行zero-shot目标检测!
三、自动配置源码分析
SharedPreferences and SQlite database
【UiPath2022+C#】UiPath变量和参数
「实用」运维新手一定不能错过的17 个技巧
八、响应处理——ReturnValueHandler匹配返回值处理器并处理返回值原理解析
【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera
面向小白的深度学习代码库,一行代码实现30+中attention机制。
基于STM32F407的WIFI通信(使用的是ESP8266模块)
MySQL主从复制—有手就能学会的MySQL集群搭建教程
栈的应用——力扣 20.有效的括号
网络信息安全运营方法论 (上)
MySQL
[Pytorch study notes] 10. How to quickly create your own Dataset dataset object (inherit the Dataset class and override the corresponding method)
【UiPath2022+C#】UiPath 循环
LeetCode刷题之第86题