当前位置:网站首页>每日一题-下一个排列-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 --;
}
}
边栏推荐
- LeetCode刷题之第530题
- CVPR best paper winner Huang Gao's team from Tsinghua University presented the first dynamic network review
- 关于存储IOPS你必须了解的概念
- You should write like this
- CVPR 2022 | 70% memory savings, 2x faster training
- 【shell编程】第二章:条件测试语句
- 电子产品量产工具(3)- 文字系统实现
- 浅谈遇到的小问题
- [Pytorch study notes] 9. How to evaluate the classification results of the classifier - using confusion matrix, F1-score, ROC curve, PR curve, etc. (taking Softmax binary classification as an example)
- 【ts】typescript高阶:分布式条件类型
猜你喜欢
随机推荐
最简单的防抖节流理解法
【Over 15】A week of learning lstm
CVPR最佳论文得主清华黄高团队提出首篇动态网络综述
dataframe 常用操作
LeetCode刷题之第33题
网络通信及相关函数介绍
C语言联合体union占用空间大小问题
Redis集群(docker版)——从原理到实战超详细
电子产品量产工具(3)- 文字系统实现
原来何恺明提出的MAE还是一种数据增强
七、请求处理——Map、Model类型参数处理原理
二、自动配置之底层注解
【shell编程】第二章:条件测试语句
[Database and SQL study notes] 9. (T-SQL language) Define variables, advanced queries, process control (conditions, loops, etc.)
八、响应处理——ReturnValueHandler匹配返回值处理器并处理返回值原理解析
[Intensive reading of the paper] R-CNN's Bounding box regression problem is detailed
初识机器学习
CVPR2020 - 自校准卷积
浅谈遇到的小问题
【ts】typescript高阶:条件类型与infer