您的位置:首页 > 大数据 > 人工智能

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.
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);
}



                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息