NextPermutation,寻找下一个全排列

问题描述:给定一个数组是一个全排列,寻找下一个全排列。例如123->132, 321->123, 115->151.

算法分析:从后往前寻找顺序,找到后从往前寻找第一个大于当前元素,即第一个逆序,然后元素交换,重新sort当前元素后面的元素。如果都是逆序,reverse数组。

 1 package Leecode_Permutation;
 2
 3 import java.util.Arrays;
 4
 5 public class NextPermutation {
 6     public void nextPermutation(int[] num)
 7     {
 8         if(num.length <= 1)
 9         {
10             return ;
11         }
12         //从后往前,找正序,下一个是逆序
13         for(int i = num.length - 2; i >= 0; i--)
14         {
15             if(num[i] < num[i+1])
16             {
17                 int j;
18                 for(j = num.length - 1; j >= i; j--)
19                 {
20                     if(num[i] < num[j])
21                     {
22                         break;
23                     }
24                 }
25                 // swap the two numbers.
26                 //num[i] = num[i] ^ num[j];
27                 //num[j] = num[i] ^ num[j];
28                 //num[i] = num[i] ^ num[j];
29
30                 int temp = num[i];
31                 num[i] = num[j];
32                 num[j] = temp;
33
34                 //sort the rest of arrays after the swap point.
35                 Arrays.sort(num, i+1, num.length);
36                 return ;
37             }
38         }
39         //如果都是逆序,说明下一个全排列是正序,reverse it。
40         for(int i = 0; i < num.length / 2; i++)
41         {
42             int tmp = num[i];
43             num[i] = num[num.length - i - 1];
44             num[num.length - i - 1] = tmp;
45         }
46         return ;
47
48     }
49     public static void main(String[] args) {
50         NextPermutation np = new NextPermutation();
51         int[] num = {1,2};
52         np.nextPermutation(num);
53         for (int i : num) {
54             System.out.println(i);
55         }
56     }
57 }
时间: 2024-10-27 08:10:58

NextPermutation,寻找下一个全排列的相关文章

LeetCode 31 Next Permutation(下一个全排列)

题目链接: https://leetcode.com/problems/next-permutation/?tab=Description Problem :寻找给定int数组的下一个全排列(要求:be in-place) 倒序查找到该数组中第一个满足后面的数字大于前面的数字的下标i (当前下标 i 指向 后面的那个比较大的数) 参考代码: package leetcode_50; /*** * * @author pengfei_zheng * 下一个全排列 */ public class S

数据结构——栈——寻找下一个较大元素

题目描述 给出一个数组,向右寻找每一个元素的下一个较大的元素,没有更大的则为-1 举例 {4,6,1,3,2,5} 则求得的答案应为 {6,-1,3,5,5,-1} 题目分析 首先对于这样的题目,我们总是先想到最简单的,那么就是枚举,每次循环一个元素,不停的向右找就可以了.时间复杂度应该是n^2 但是这样肯定是不够用的. 然后我们考虑,这道题我们实际上遇到的问题是什么? 其实简单的说,这道题的意思是,在变化的数组中找到下一个较大的值. 难点在于,数组元素的变化,以及不是找最大值,而是找下一个较大

【算法题7】寻找下一个排列

来自:LeetCode 37 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列.1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1 解决方案: 参见博客:Next lexicographical permutation algorithm 代码如下: 1 class

阿里云MVP携手博客园,寻找下一个MVP!专属服务、大咖交流、企业游学等你来!申请就送100元代金券!

"传递技术力量,传承布道精神."阿里云MVP(最有价值专家)第七期全球招募开启,与博客园携手,寻找热爱技术.乐于分享.关注个人成长的你! 戳链接,通过[博客园绿色通道]一键直达: https://mvp.aliyun.com/mvp/apply?recommendType=2&recommendId=qxJWelDeU8KrQWUUyLKtYw== 前20名申请即提供100元代金券,认证成功还送阿里云T-shirt. 如果你是资深开发者,想第一时间接触最新云技术,实现个人能力跃

寻找下一个同级元素节点

function getNextElement(node){      var nextNode=node.nextSibling;       if(nextNode){              if(nextNode.nodeType==1){                  return nextNode;              }        else{              return getNextElement(nextNode);              }  

31. Next Permutation (下一个全排列)

Implement next permutation, which rearranges numbers into the lexicographically next greater permutation of numbers. If such arrangement is not possible, it must rearrange it as the lowest possible order (ie, sorted in ascending order). The replaceme

下一个排列

该题的思路是从后向前扫描数组,找到第一对位置 i,j (i < j) 使得 i 位置的值小于 j 位置的值,交换 i 位置和 j 位置的元素值,然后对 i 位置之后的元素进行排序即可.代码如下: vector<int> nextPermutation(vector<int> &nums) { // write your code here int size = nums.size(); //标记数组是否为递减数组 bool flag = false; //找出从后向前

LeetCode 31. 下一个排列(Next Permutation)

题目描述 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许使用额外常数空间. 以下是一些例子,输入位于左侧列,其相应输出位于右侧列. 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1 解题思路 由于各个排列按照字典序排序,所以以 1,3,2 → 2,1,3为例,寻找下一个排列的步骤是: 首先找到从后往前第一个升序数对,在此例中即(1

556. 下一个更大元素 III

556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: 21 示例 2: 输入: 21 输出: -1 代码 class Solution { public int nextGreaterElement(int n) { int[] array = transfer(n); /* 求出的下一个全排列可能会超出int类型的范围 这并不符合得出的答