题目:31. 下一个排列

题目描述:

本题是给你一个整数数组,返回该数组的下一个线性顺序排列

举个例子:给你一个[1, 2, 3]的数组,他的线性排列顺序从小到大依次为[1, 3, 2],[2, 1, 3],[2, 3, 1],[3, 1, 2],[3, 2, 1]

所以如果给你数组是[1, 2, 3],就应该返回[1, 3, 2],如果数组是[1, 3, 2],就应该返回[2, 1, 3]

题目要求,如果已经是最大线性顺序排列,应当返回最小线性顺序排列,例如数组[3, 2, 1],应返回[1, 2, 3],可以将其理解为一个环。

步骤:

这道题需要从右往左遍历

1、从右往左遍历,从n - 2下标开始遍历,每一个遍历元素下标为i,如果i一直都大于等于i+1,那么说明该数组已经是最大线性顺序排列,直接反转数组,返回最小线性顺序排列即可。

例如:[5, 4, 3, 3, 1, 1],直接反转数组,返回[1, 1, 3, 3, 4, 5]即可

2、如果在从右往左遍历过程中,一直在升序,突然有一个元素降序了,将该元素下标记录下来,记为较小数,下标为 less

3、然后找到less右边中,大于less的数中最小的那个数的下标,记为more下标。将这两个下标进行交换

4、将原来less下标之后的元素反转一遍,即可得到原数组的下一个线性顺序排列。

解释:

举一个例子,解释上面的操作为什么能得到原数组的下一个线性顺序排列。

原数组[1, 2, 4, 7, 6, 3, 2, 1]less下标元素就是4,因为4是首次降序的元素,所以4后面的元素一定是最大线性顺序[7, 6, 3, 2, 1]

且因为4是首次降序的元素,则后面有比4大的元素,所以4前面的元素肯定不需要动

所以暂时抛弃4前面的元素,求以4开头一直到结束的数组[4, 7, 6, 3, 2, 1],下一线性顺序即可。

很容易理解,以4开头的[4, 7, 6, 3, 2, 1]数组的下一线性顺序数组一定是以6开头,即下标为more的元素,因为6是4后面大于4的数字中最小的那个,所以6一定是下一线性顺序数组的开头,将4和6交换之后,数组变为[6, 7, 4, 3, 2, 1]

然后,[4, 7, 6, 3, 2, 1]数组中,是以4开头的最大线性顺序,他的下一线性顺序,肯定是以6开头的最小线性顺序,所以将6后面的元素反转即可,将[6, 7, 4, 3, 2, 1]变为[6, 1, 2, 3, 4, 7]

最终,原数组[1, 2, 4, 7, 6, 3, 2, 1],下一个线性顺序排列为[1, 2, 6, 1, 2, 3, 4, 7]

代码:

    public void nextPermutation(int[] nums) {
if (nums == null || nums.length < 2) return; int N = nums.length;
// 从右往左第一次降序的位置
int firstLess = -1;
for (int i = N - 2; i >= 0; i--) {
if (nums[i] < nums[i + 1]) {
firstLess = i;
break;
}
} if (firstLess == -1) {
reverse(nums, 0, N - 1);
} else {
// 找到最靠右的,同时比nums[firstLess]大的数的下标
int rightClosestMore = -1;
// 这里也可以使用二分进行优化
for (int i = N - 1; i > firstLess; i--) {
if (nums[i] > nums[firstLess]) {
rightClosestMore = i;
break;
}
} swap(nums, firstLess, rightClosestMore);
reverse(nums, firstLess + 1, N - 1);
} } public void reverse(int[] nums, int start, int end) {
while (start < end) {
swap(nums, start, end);
start++;
end--;
}
} public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}

LeetCode HOT 100:下一个排列的更多相关文章

  1. [LeetCode] Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  2. Leetcode题目31.下一个排列(中等)

    题目描述: 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外 ...

  3. 【LeetCode 31】下一个排列

    题目链接 [题解] 从右往左找第一个下降的位置i(即满足nums[i]<nums[i+1]); 然后在[i+1..len-1]这个区间里面找到一个最大的下标k,使得nums[k]>nums ...

  4. LeetCode:下一个排列【31】

    LeetCode:下一个排列[31] 题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排 ...

  5. [LeetCode] 31. Next Permutation 下一个排列

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

  6. 31,Leetcode下一个排列 - C++ 原地算法

    题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常 ...

  7. 【LeetCode】下一个排列【找规律】

    实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. ...

  8. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  9. LeetCode(31): 下一个排列

    Medium! 题目描述: (请仔细读题) 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列) ...

  10. 【LeetCode每天一题】Next Permutation(下一个排列)

    Implement next permutation, which rearranges numbers into the lexicographically next greater permuta ...

随机推荐

  1. PVC-U排水管及管件

  2. Kafka Eagle 3.0.1功能预览

    1.概述 最近有同学留言,关于Kafka Eagle的一些使用问题.今天笔者就为大家来详细介绍Kafka Eagle 3.0.1的功能以及使用方法. 2.内容 在3.0.1版本中,EFAK优化了分布式 ...

  3. PTA2021 跨年挑战赛部分题解

    7-1 压岁钱 不用说 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn ...

  4. 谣言检测()《Data Fusion Oriented Graph Convolution Network Model for Rumor Detection》

    论文信息 论文标题:Data Fusion Oriented Graph Convolution Network Model for Rumor Detection论文作者:Erxue Min, Yu ...

  5. Python全栈工程师之从网页搭建入门到Flask全栈项目实战(1) - ES6标准入门和Flex布局

    1.简述 1.什么是ES6?ES6, 全称 ECMAScript 6.0,是 JavaScript 的下一个版本标准,2015年6月份发版.ES6的主要目的是为了解决 ES5 的先天不足. 2.了解E ...

  6. Kafka 之 Streams

    Kafka 之 Streams 一.概述 1.1 Kafka Streams Kafka Streams.Apache Kafka开源项目的一个组成部分.是一个功能强大,易于使用的库.用于在Kafka ...

  7. 记一个深层的bug

    1. 业务场景 产品需要每隔几天进行一次组件的更新,在自动化测试中,每隔30s检测一次更新源上的某个文件MD5值是否与本地一致,不一致代表有更新的版本,开始更新. 2. 问题出现 一个再平常不过的繁忙 ...

  8. 彻底学会Selenium元素定位

    转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/63099961.html 你好,我是测试蔡坨坨. 最近收到不少初学UI自动化测试的小伙伴私信,对于元素的定位还是有些头疼,总 ...

  9. salesforce零基础学习(一百二十)快去迁移你的代码中的 Alert / Confirm 以及 Prompt吧

    本篇参考: https://developer.salesforce.com/blogs/2022/01/preparing-your-components-for-the-removal-of-al ...

  10. Substring 在BCL和CLR里面搞了啥

    楔子 还是做点事情,不要那么散漫. 本文以简单的Substring(int startindex,int Length)函数为例,来递进下它在托管和非托管的一些行为. 以下均为个人理解,如有疏漏请指正 ...