题目链接
题目分析
这个题我好像在算法课上听过,因此5个月前我用算法课上的想法实现了一次,但是时隔5个月,我却忘记了之前的思路,所以专门再写一篇记录文章。
这个题要求我们找比这个数大的最小元素,比如说1 4 2 3 1,那么比这个数更大的最小元素就是1 4 3 1 2
那么其实根据这个思路我们就很好理解了,我们需要从尾巴开始找,找到第一对正序对,因为当a[i] < a[j] (i < j) 的情况下, 我们把a[j] 和a[i]对调,得到的元素肯定比原来的要大。
第二个问题是怎么确保这个元素是比原来的数值大的最小元素呢?
我们可以利用排序的思想,将j + 1到最后一个元素按照升序的思想进行排序,那么这部分的元素绝对是最小的。
代码实现
class Solution {
public void nextPermutation(int[] nums) {
int n = nums.length-1;
for (int i = n-1; i >= 0; i--) {
for(int j = n;j>i;j--){
// 找到a[j] > a[i]的情况,调换两者然后对i + 1到 nums.length 进行排序
if (nums[j]>nums[i]){
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
Arrays.sort(nums,i+1,n+1);
return;
}
}
}
//当数组本身就是降序的时候,下一个更大的元素就应该将整个数组进行排序
Arrays.sort(nums);
}
}