LeetCode (31)Next Permutation
2017-05-19 16:51
323 查看
(31)Next Permutation
题目:找到比目标数大的,只使用目标数内数字组成的最小的数。如果这种安排是不可能的,它必须重新安排它作为最低可能的顺序(即按升序排序)。更换必须到位,不要分配额外内存。例如:
1,2,3 -> 1,3,2 3,2,1 -> 1,2,3 1,1,5 -> 1,5,1
自己推算几次,找几个例子,就能有一个比较好的想法了。
首先对于比这个数大的最小数,那么就是从最后位开始向前找,当找到下一个数字比当前数字小的时候,那么就从这一位往后直到末位,在这些里面进行变换,先说一下变换方式,方式是:首先从后先前找到前一个数字比后一个数字小的数字,为nums[top],在top直至nums.end()之间找到比num[top]大的最小数字num[next],将两个数字调换,然后将top+1直到nums.end()间的数字做排序,小数字在前大数字在后,就获得了目标数。
这里我举一个例子,假如数是“1234651”,那么由于从后向前查找的过程中,第一次前一个数字比后一个小的情况是“4”比“6”小,那么就是在“4651”这几个数字里面进行变换,问题变成找到能比“4651”大的第一个数,首位为“4”,后面的各个数字中比“4”大的最小数字是“5”(由于在“651”里面比“4”大的最小数字是“5”),那么把这两个数字调换位置,“4651”变成了“5641”,将“641”进行排序,小数字在前,大数字在后,获得“146“,这样就获得了目标数“1235146”。
但要注意一个问题,如果整个数字原本就是从大到小的一个序列,比如“654321”,那么通过搜索找不到top的位置,此时top为-1,那么就是直接全体排序。
下面是代码:
class Solut 4000 ion { public: void nextPermutation(vector<int>& nums) { int top,len = nums.size(); if(len == 1||len == 0){ return ; } int temp = nums[len-1]; int i = 0; for(i = len - 2; i >= 0; i --){ if(temp > nums[i]){ top = i; break; } else{ temp = nums[i]; } } if(i<0){ vector<int>::iterator left = nums.begin(), right = nums.end(); sort(left , right); return; } temp = nums[i]; int next = nums[i + 1], num = i + 1; for( i = i + 1; i <= len - 1; i ++ ){ if(nums[i] > temp){ if(nums[i] < next){ next = nums[i]; num = i; } } } nums[num] = temp; nums[top] = next; vector<int>::iterator left = nums.begin()+top+1, right = nums.end(); sort(left , right); } };
相关文章推荐
- [Leetcode] 31. Next Permutation 解题报告
- Leetcode-31: 31. Next Permutation
- LeetCode-31. Next Permutation
- leetcode problem 31 -- Next Permutation
- [leetcode-31]Next Permutation(C)
- [Leetcode]_31 Next Permutation
- [LeetCode] 31. Next Permutation
- LeetCode 31. Next Permutation
- LeetCode 31. Next Permutation
- leetcode 31. Next Permutation
- Leetcode刷题记——31. Next Permutation(下一个排列)
- leetCode练习(31)
- (Java)LeetCode-31. Next Permutation
- LeetCode 2016.3.18 47,31
- leetcode 刷题之路 31 Triangle
- LeetCode 31: Next Permutation
- leetcode题解-31. Next Permutation
- 【LeetCode】31. Next Permutation解法
- leetcode 31. Next Permutation
- leetcode(31) Next Permutation