当前位置:网站首页>每日一题-下一个排列-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 --;
}
}
边栏推荐
猜你喜欢

CVPR2020 - 自校准卷积

CH32V307 LwIP移植使用

LeetCode刷题之第416题
![[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)](/img/7e/566bfa17c5b138d1f909185721c735.png)
[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)

网络信息安全运营方法论 (下)

LeetCode刷题之第23题

网管日记:故障网络交换机快速替换方法

【论文阅读-表情捕捉】High-quality Real Time Facial Capture Based on Single Camera

十、视图解析原理与源码分析

【UiPath2022+C#】UiPath变量和参数
随机推荐
原来何恺明提出的MAE还是一种数据增强
11%的参数就能优于Swin,微软提出快速预训练蒸馏方法TinyViT
六步搞定子网划分
亲身实感十多年的面试官面试的题目
【ts】typescript高阶:联合类型与交叉类型
IT系统运行维护方法及策略
(oj)原地移除数组中所有的元素val、删除排序数组中的重复项、合并两个有序数组
TinyFlashDB:一种超轻量的可纠错的通用单片机flash存储方案
网工必用神器:网络排查工具MTR
电子产品量产工具(3)- 文字系统实现
【ts】typescript高阶:分布式条件类型
[After a 12] No record for a whole week
【UiPath2022+C#】UiPath 循环
MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
电子产品量产工具(4)-UI系统实现
用GAN的方法来进行图片匹配!休斯顿大学提出用于文本图像匹配的对抗表示学习,消除模态差异!
基于STM32F407的一个温度传感器报警系统(用的是DS18B20温度传感器,4针0.96寸OLED显示屏,并且附带日期显示)
常见的 PoE 错误和解决方案
浅谈遇到的小问题
[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers