LeetCode_Submission Details
2015-09-14 11:28
513 查看
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.
题目分析:题目是说给出一个整形数组,输出的是经过排序组合后的第一个比输入的顺序大的那个数组,比如说输入2,1,3,那么这三个数字任意组合的顺序有:1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1这六种组合,而刚好比输入的2,1,3大的第一种组合是2,3,1,所以输出就应该是2,3,1的顺序,题目中还说了,如果找不到比输入的顺序还大的情况(比如输入的是3,2,1,已经是这三个数最大的了),那么就输出这几个数经过排序后最小的一个数(就是1,2,3)。
解题分析:从个位开始,一旦找到高一位比低一位小的情况,则从低一位和之后的所有位中找到一个比该高一位大的第一个数,两数互换,然后将低一位和之后的所有位升序排列,就得到了最后的答案。举例说明一下,比如输入5,10,9,7,6,4,2,1,从个位1开始向左找,直到找到5的时候,发现高位的5比低位的10还小,那么停下来,该做一些处理了,处理就是:从低一位的10一直到个位1这几个数中,找到比5大的第一个数,就是6(关于如何找到6,由于10~1是按序排列的,所有使用二分法),然后将5和6互换,这样,原数组就变成6,10,9,7,5,4,2,1了,然后将10~1这几个数升序排列,就变成6,1,2,4,5,7,9,10,就是最后答案了。
Java解题:
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
题目分析:题目是说给出一个整形数组,输出的是经过排序组合后的第一个比输入的顺序大的那个数组,比如说输入2,1,3,那么这三个数字任意组合的顺序有:1,2,3;1,3,2;2,1,3;2,3,1;3,1,2;3,2,1这六种组合,而刚好比输入的2,1,3大的第一种组合是2,3,1,所以输出就应该是2,3,1的顺序,题目中还说了,如果找不到比输入的顺序还大的情况(比如输入的是3,2,1,已经是这三个数最大的了),那么就输出这几个数经过排序后最小的一个数(就是1,2,3)。
解题分析:从个位开始,一旦找到高一位比低一位小的情况,则从低一位和之后的所有位中找到一个比该高一位大的第一个数,两数互换,然后将低一位和之后的所有位升序排列,就得到了最后的答案。举例说明一下,比如输入5,10,9,7,6,4,2,1,从个位1开始向左找,直到找到5的时候,发现高位的5比低位的10还小,那么停下来,该做一些处理了,处理就是:从低一位的10一直到个位1这几个数中,找到比5大的第一个数,就是6(关于如何找到6,由于10~1是按序排列的,所有使用二分法),然后将5和6互换,这样,原数组就变成6,10,9,7,5,4,2,1了,然后将10~1这几个数升序排列,就变成6,1,2,4,5,7,9,10,就是最后答案了。
Java解题:
public static void nextPermutation(int[] nums) { if(nums==null) return; int length=nums.length; if(length==0||length==1) return; int flag=-1; for(int i=length-2;i>=0;i--){ if(nums[i]<nums[i+1]){ flag=i; break; } } if(flag>-1){ int flag2=findBigger(nums,flag+1,length-1,nums[flag]); exchange(nums,flag,flag2); } int left = flag>-1?flag+1:0; int right = length-1; while(right>left){ exchange(nums,right,left); right--; left++; } } public static void exchange(int nums[],int a,int b){ int temp=nums[a]; nums[a]=nums[b]; nums[b]=temp; } public static int findBigger(int[] nums,int left,int right,int target){ //二分法 int middle = (left+right)/2; if(target==nums[middle]) return middle-1; if(middle==left) return nums[right]>target?right:left; if(target>nums[middle]) right=middle; else if(target<nums[middle]) left=middle; return findBigger(nums,left,right,target); }
相关文章推荐
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法
- C#动态调整数组大小的方法
- 详解Lua中的数组概念知识
- Perl中的列表和数组学习笔记
- 探索PowerShell (八) 数组、哈希表(附:复制粘贴技巧)
- C#中数组初始化与数组元素复制的方法
- C#交错数组用法实例
- PowerShell数组的一些操作技巧
- C#通过yield实现数组全排列的方法
- C#不重复输出一个数组中所有元素的方法
- C#实现将数组内元素打乱顺序的方法
- Ruby简明教程之数组和Hash介绍
- C语言查找数组里数字重复次数的方法
- C语言柔性数组实例详解
- Perl中怎样从数组中删除某个值?
- 详解C++编程中用数组名作函数参数的方法
- C语言安全之数组长度与指针实例解析
- Lua检测数组(tabble)中是否包含某个值