LeetCode_Submission Details

32 篇文章 0 订阅

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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值