题目如下:
首先介绍一下什么是字典排序:
对于数字1、2、3......n的排列,不同排列的先后关系是从左到右逐个比较对应的数字的先后来决定的。例如对于5个数字的排列 12354和12345,排列12345在前,排列12354在后。按照这样的规定,5个数字的所有的排列中最前面的是12345,最后面的是 54321。(来自百度)。
下面摆出我的答案:
第一步:从后面往前判断,判断到哪里首次出现i使得nums[i]>nums[i-1],注意不存在nums[i]>nums[i-1]的情形,即nums为倒序!
第二步:寻找一个flag值,flag>=i,nums[flag]>nums[i-1]且nums[flag+1]<=nums[i-1],同时注意flag可能为nums.length的情形。
第三步:替换nums[flag]和nums[i-1]。
第四步:对nums中k>i-1后面的数值进行正序排序!即后面的部分需要完全倒过来。
class Solution {
public void nextPermutation(int[] nums) {
for(int i=nums.length-1;i>0;i--){
if(nums[i]>nums[i-1]){
int temp_min=nums[i-1];
int temp_max=nums[i];
int flag=i;
for(int j=i;j<nums.length;j++){
if(nums[j]<=temp_min){
flag=j-1;
break;
}else if(nums[j]>temp_min&&j==nums.length-1){
flag=j;
break;
}
}
nums[i-1]=nums[flag];
nums[flag]=temp_min;
for(int j=0;j<(nums.length-i)/2;j++){
int temp=nums[j+i];
nums[j+i]=nums[nums.length-1-j];
nums[nums.length-1-j]=temp;
}
break;
}else if(i==1&&nums[0]>nums[1]){
for(int j=0;j<nums.length/2;j++){
int temp=nums[j];
nums[j]=nums[nums.length-1-j];
nums[nums.length-i-j]=temp;
}
break;
}
}
}
}
运行结果:
运行时间击败百分之百,哈哈,但是这是在国外版leetcode的情况,但是在国内版的只击败68%
扫描二维码关注公众号,回复:
5487821 查看本文章