每日一题:LeetCode 31 下一个排列
总结
本题思路主要是找到 较小值(从后往前(下标n - 2开始)小于它后面的数的对应点i)找到i后再从后往前一遍(从n - 1开始),找到大于i的下标。之后对i和j进行swap,然后翻转i + 1及其后的数组。(由于先前第一次遍历时候,i后面的排序必是降序,故只需翻转)
在此附上代码及出处
- JAVA
public void nextPermutation(int[] nums){
int n = nums.length;
int i = n - 2,j = n - 1;
while(i >= 0 && nums[i] >= nums[i + 1]){
i--;
}
if(i >= 0){
while(j >= 0 && nums[i] >= nums[j]){
j--;
}
swap(nums,i,j);
}
reverse(nums,i + 1);
}
public void swap(int[] nums,int x, int y){
int tmp = nums[x];
nums[x] = nums[y];
nums[y] = tmp;
}
public void reverse(int[] nums,int start){
int l = start, r = nums.length - 1;
while(l < r){
swap(nums,l,r);
l++;
r--;
}
}
- C++
public:
void nextPermutation(vector<int> & nums){
int n = nums.size();
int i = n - 2, j = n - 1;
while(i >= 0 && nums[i] >= nums[i + 1]){
i--;
}
if(i >= 0){
while(j >= 0 && nums[i] >= nums[j]){
j--;
}
swap(nums[i], nums[j]);
}
reverse(nums.begin() + i + 1,nums.end());
};