当前位置:网站首页>每日一题-下一个排列-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 --;
}
}
边栏推荐
猜你喜欢
随机推荐
OSPF网络类型
ECCV2022 | RU&谷歌提出用CLIP进行zero-shot目标检测!
【UiPath2022+C#】UiPath 练习和解决方案-变量、数据类型和控制流程
最简单的防抖节流理解法
物联网:LoRa无线通信技术
【UiPath2022+C#】UiPath 数据操作
电子产品量产工具(5)- 页面系统实现
读论文-Cycle GAN
LeetCode刷题之第61题
「实用」运维新手一定不能错过的17 个技巧
MSRA提出学习实例和分布式视觉表示的极端掩蔽模型ExtreMA
[Database and SQL study notes] 10. (T-SQL language) functions, stored procedures, triggers
LeetCode刷题之第55题
【ts】typeScript高阶:any和unknown
[Kaggle project actual combat record] Steps and ideas sharing of a picture classification project - taking leaf classification as an example (using Pytorch)
LeetCode刷题之第33题
吞吐?带宽?傻傻分不清楚
网工必用神器:网络排查工具MTR
CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
1008 数组元素循环右移问题 (20 分)









