下一个排序
作者:互联网
题目链接:https://leetcode.cn/problems/next-permutation/
变式题目链接:https://leetcode.cn/problems/next-greater-element-iii/
思路一:查找当前数值的下一个排序,相当于从个位起找到一个高位数值大于低位的数值,将其交换得到一个比当前数值大的排序,然后将求得的高位到低位之间的数递减排序,得到当前数值的下一个排序(大于当前数值的最小的由原数值元素排序得到的数)
将数值转为数组方便处理,使用INT_MAX得到最大的32位整数。此种思路时间复杂度为\(O(n^2)\)
优化后的思路二:从个位数开始双指针遍历找到高位中的较小数位置为i,其中nums[i]>nums[i+1]
,然后再从低位找到较大于nums[i]
的数值与其交换,构造较大于原数值的数,由于i~n-1
之间为顺序排列,只需要reverse达到递增排序效果。
下一个排序 代码(使用思路二): 通过while循环更方便写找到对应位置的代码
class Solution {
public:
void nextPermutation(vector<int>& nums) {
int l=nums.size()-2;
while(l>=0&&nums[l]>=nums[l+1])l--;
int i=nums.size()-1;
if(l>=0){
while(i>=0&&nums[i]<=nums[l])i--;
if(i>=0)
swap(nums[i],nums[l]);
}
// cout<<l<<" "<<i<<endl;
reverse(nums.begin()+l+1,nums.end());
return ;
}
};
下一个更大元素Ⅲ 代码(使用思路一):
class Solution {
public:
int nextGreaterElement(int n) {
int a[10];
int t=n;
int i=0;
while(t){
a[i++]=t%10;
t/=10;
}
function<bool(int,int)> cmp=[&](int a,int b){
return a>b;
};
bool f=true;
for(int j=0;j<i;j++)
{
if(f){
for(int k=0;k<j;k++)
if(a[k]>a[j]){
swap(a[k],a[j]);
f=false;
sort(a,a+j,cmp);
break;
}
}
}
// for(int j=0;j<i;j++)cout<<a[j]<<" ";
// for(int j=0;j<i;j++)cout<<a[j]<<" ";
long long num=0;
for(int j=i-1;j>=0;j--)
num=a[j]+num*10;
// cout<<num<<endl;
if(num<=n||num>INT_MAX)return -1;
else return num;
}
};
标签:10,nums,一个,数值,int,while,排序 来源: https://www.cnblogs.com/abestxun/p/16441575.html