版权声明:前半生,不害怕;后半生,不后悔! https://blog.csdn.net/qq_14842117/article/details/89220700
问题:实现下一个排列,它将数字重新排列到字典上的下一个更大的数字排列。
如果这种安排不可能,则必须将其重新排列为尽可能低的顺序(即按升序排序)。
替换必须就地,并且仅使用常数的额外内存。
举例:
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,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;
}