[leetcode-31]Next Permutation(C)
来源:互联网 发布:静态路由协议端口号 编辑:程序博客网 时间:2024/05/16 18:03
问题描述:
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 replacement must be in-place, do not allocate extra memory.
Here are some examples. Inputs are in the left-hand column and its corresponding outputs are in the right-hand column.
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1
分析:这道题有必要说说题意。假设有5个数:1,2,3,4,5,那么会有一个全排列。12345,12354,12435,12453,,,,,,共5!种从小到大的排列。那么12345的下一个数就是12354。依次类推,我们知道最后一个数:54321,那它的下一个数就是12345了。
题意明白了,算法也是有现成的。
- 从右向左查找出现满足条件的第一个元素j。该元素大于右边的元素
- 如果找不到,直接反转整个数组
- 然后在j的右边,找到大于nums[j]的最小元素i,且尽量向右延伸
- 交换nums[i]和nums[j]
- 对j右边的元素进行反转。
代码如下:4ms
void reverse(int *nums,int start,int end){ int left = start; int right = end-1; int tmp; while(left<right){ tmp = nums[left]; nums[left] = nums[right]; nums[right] = tmp; left++; right--; }}void nextPermutation(int* nums, int numsSize) { if(numsSize<2) return; int i,j; for(i = numsSize-2;i>=0;i--){ if(nums[i]<nums[i+1]) break; } if(i<0){ reverse(nums,0,numsSize); return; } int min = nums[i+1]; int index = i+1; for(j = i+2;j<numsSize;j++){ if(nums[j]>nums[i]&&nums[j]<=min){ min = nums[j]; index = j; } } nums[index] = nums[i]; nums[i] = min; reverse(nums,i+1,numsSize);}
0 0
- [leetcode-31]Next Permutation(C)
- LeetCode(31): Next Permutation (C++)
- LeetCode(31) Next Permutation
- LeetCode (31)Next Permutation
- 【LeetCode算法练习(C++)】Next Permutation
- 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) Next Permutation
- LeetCode-31 Next Permutation
- Leetcode#31||Next Permutation
- LeetCode 31: Next Permutation
- LeetCode(31)-Next Permutation
- leetcode(31) Next Permutation
- LeetCode 31 - Next Permutation
- iOS开发多线程篇—GCD介绍
- ehcache时如何持久化数据到磁盘,并且在应用服务器重启后不丢失数据
- NOT IN和NOT EXISTS小区别
- Android弹出框效果——popupwindow
- 最小二乘法(自我理解+自我熟悉)(1)
- [leetcode-31]Next Permutation(C)
- 附近地点搜索解决方案
- 游戏UI库
- JAVA连接MySQL时常见的错误解决方法
- Graphics architecture
- Implement Queue using Stacks
- js中Math的几个函数
- 利用jenkens和ant来自动化打包、部署、执行你的helloWorld工程只(菜鸟成长之路一)
- 双击与单击并存