leetCoe31.下一个排序

版权声明:前半生,不害怕;后半生,不后悔! https://blog.csdn.net/qq_14842117/article/details/89220700

问题:实现下一个排列,它将数字重新排列到字典上的下一个更大的数字排列。

如果这种安排不可能,则必须将其重新排列为尽可能低的顺序(即按升序排序)。

替换必须就地,并且仅使用常数的额外内存。
举例:

1,2,31,3,2
3,2,11,2,3
1,1,51,5,1
public void nextPermutation(int[] nums) {
	   int n = nums.length;
	   int index = n-1;
	   //寻找第一个比右边大的数所在的位置
	   while(index>0) {
		   if(nums[index]>nums[index-1]) break;
		   index--;
	   }
	    //如果索引为0,说明数组时逆序,下一个应该为正序
	   if(index == 0) {
		   reverse(nums,index,n-1);
	   }else {
		   int val = nums[index-1];
		   int j = n-1;
		   //从index到最后一个是逆序,从最后往前找,找到第一个大于index-1的值交换
		   while(j>=index) {
			   if(nums[j]>val) {
				   swap(nums,index-1,j);
				   break;
			   }
			   j--;
		   }
		   //将index到数组最后一个元素是逆序,变为正序。
		   reverse(nums,index,n-1);
	   }
   }
private void reverse(int[] nums, int i, int j) {
	
	while(i<j) {
		swap(nums,i,j);
		i++;
		j--;
	}
}
private void swap(int[] nums, int i, int j) {
	int temp = nums[i];
	nums[i] = nums[j];
	nums[j] = temp;
	
}
   

猜你喜欢

转载自blog.csdn.net/qq_14842117/article/details/89220700