思路如下:
假设当前给定permutation序列为 a1 a2 a3...an.
- 从序列尾部a[n]开始向头部扫描,找到第一个相邻升序序列 a[i-1]< a[i] ; 因为是扫描到的第一个相邻升序,则此时有a[i]>=a[i+1]>=a[i+2]...>=a[n].
- 从a[n]逆序遍历至a[i] 找到第一个大于a[i-1]的值a[j] ,交换a[i-1]和a[j].因为a[j]是第一个大于a[i-1]的,所以有a[j+1]至a[n]都小于等于a[i-1]. 即替换后的序列a[1]...a[j],a[i],a[i+1]..a[j-1],a[i-1],a[j+1]...a[n] 有a[i]>=a[i+1]>=a[j-1]>=a[j]>a[i-1]>=a[j+1]...>=a[n].即从i-n的范围仍然是个非升序序列。
- 因为我们已经改变a[i-1]的值为其后序列中大于a[i-1]的值中最接近他的。那么剩下的只需将a[i]~a[n]的范围内的值变为升序序列即可。
示例: 3 2 6 5 4 1
我们找到第一个相邻升序序列 2 6 然后找到2的后面第一个大于2的值4 交换。变为 3 4 6 5 2 1
然后将6 5 2 1变为升序序列,得到最后结果 3 4 1 2 5 6
简单说明下正确性吧: 当找到第一个升序序列 2 6,由于是第一个升序序列,所以以6开头的6 5 4 1肯定是非升序的。对于一个非升序的permutation部分,肯定是这部分内最大的了,所以没办法操作他们去获得整个permutation的下一个值,则需要替换前一位2(用后面的大于他的最小值4替换,由于后面部分是递减的,大于他的最小值肯定是从尾往前第一个比他大的)。序列变为 3 4 6 5 2 1,因为4是第一个比他大的,所以1<2.又因为6>5>4>2.所以后面的序列6 5 2 1也是递减的,使用i,j指针 交换为递增的 1 2 5 6 即可。
代码
public void nextPermutation(int[] num) { // Start typing your Java solution below // DO NOT write main() function if(num == null||num.length == 0) return ; int i = num.length-1; for(;i>=1;i--){ if(num[i]>num[i-1]){ break; } } int j = num.length-1; int temp; if(i>=1){ i = i-1; while(num[j]<=num[i]) j--; temp = num[i]; num[i] = num[j]; num[j] = temp; i = i+1; } j = num.length-1; while(i<j){ temp = num[i]; num[i] = num[j]; num[j] = temp; i++; j--; } }
相关推荐
java java_leetcode题解之Next Permutation.java
31.Next_Permutation_下一个排列【LeetCode单题讲解系列】
js js_leetcode题解之31-next-permutation.js
# [LeetCode](https://leetcode.com/problemset/algorithms/) !... Up to date (2016-12-18), there are `447` Algorithms / `13` ...31 | [Next Permutation](https://leetcode.com/problems/next-permutation/)| ...
leetcode category other hot keywords:Palindrome(mic), Subsequence Array 螺旋矩阵Spiral Matrix 顺时针打印矩阵 Next Permutation Product of Array Except Self 189.rotate-array 283.move-zero Range Sum ...
**1.28 Next Permutation (31)** - **问题描述**:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。 - **解题思路**: - 从后向前找到第一个升序对 (nums[i-1], nums[i])。...
- **Populating Next Right Pointers in Each Node**:连接二叉树每个节点的下一个右侧节点。 - **Convert Sorted List/Array to Binary Search Tree**:将有序列表或数组转换为二叉搜索树。 - **Path Sum II**:...
- 在 NextPermutation 题目中,需要使用递归或迭代来寻找给定数列的下一个全排列。 这些知识点构成了算法面试的主要考察内容,应聘者如果能熟练掌握这些知识,将有助于在IT行业的面试中获得更好的表现。
next_permutation.py - 将数字重新排列为按字典顺序排列的下一个更大的数字排列 permutations2.py - 返回所有可能的唯一排列 3sum_2.py - 查找数组中所有唯一的三元组,其总和为零。 3sum.py - 查找数组中所有唯一的...
Permutation (M) * -> index 주의, 부등호 하나 틀림 33. Search in Rotated Sorted Array (M) * -> 부등호 주의, 부등호 하나 틀림 34. Find First and Last Position of Element in Sorted Array (M) 35. Search ...
Permutation 解决方法:掌握排列组合的字典序规律,即可。这个规律找不到,我最后还是直接看答案的。 LeetCode: 581. Shortest Unsorted Continuous Subarray 解决方法:无序列中最大最小值 2018-08-17 19:47 ...
leetcode_0031_next_permutation.c leetcode_0033_search_rotate.c : binary search, offer11 81 leetcode_0034_first_last_pos.c : binary search leetcode_0035_search_inseart.c : binary search leetcode...
Permutation 算法也可用于迭代地查找数组的排列。 也可用于迭代查找数组的排列。 13 . 14 . 15 . 16 . 17 . Algorithm to find kth largest element from an unsorted array in linear time. (1) If the number of ...
NextPermutation 下一排序 完成 DFS 题目 说明 状态 NumIslands 岛屿数量 完成 DivideAndConquer 题目 说明 状态 MaxSubArray 最大子序和 完成 Back Tracing 题目 说明 状态 GenerateParenthesis 括号生成 完成 ...
lru cache leetcode LeetCode 这个库用于总结leetcode中遇到的习题 常用数据结构习题总结 1.线性表 解决进度 ...Next Permutation 公式 13 Permutation Sequence 公式 14 Valid Sudoku 15 Trapping Rain W
- **2.1.12 Next Permutation** - 寻找下一个更大的排列。 - 实现思路:从右向左扫描数组,找到第一个下降位置,然后交换该位置及其右侧的最大值,最后将右侧部分反转。 - **2.1.13 Permutation Sequence** - ...
最低加油次数 ...Next_permutation Stack, trick trick TOP 类似斐波拉契,一层层处理 字符串处理 TOP 完全背包 dfs Trick TOP next_permutation dfs or stl next_permutation dfs or stl TOP 排序后的字符串作
密码 leetcode回购 树 - - - - 杂凑 - - 二元搜寻 0004_findMedianSortedArrays - SLN 0033_search - SLN 0034_searchRange - SLN 0035_searchInsert - SLN ...0031_nextPermutation - SLN
对于这道题,常见的解法有两种:一是使用STL库中的`next_permutation`函数,二是自定义算法实现。在C语言中,由于没有内置的`next_permutation`函数,我们需要自己编写算法。一种常见的自定义方法是先找到序列中最后...