算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !
今天和大家聊的问题叫做 下一个更大元素 III,我们先来看题面:
https://leetcode-cn.com/problems/next-greater-element-iii/
Given a positive integer n, find the smallest integer which has exactly the same digits existing in the integer n and is greater in value than n. If no such positive integer exists, return -1.
Note that the returned integer should fit in 32-bit integer, if there is a valid answer but it does not fit in 32-bit integer, return -1.
给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n 。如果不存在这样的正整数,则返回 -1 。
注意 ,返回的整数应当是一个 32 位整数 ,如果存在满足题意的答案,但不是 32 位整数 ,同样返回 -1 。
示例
示例 1:
输入:n = 12
输出:21
示例 2:
输入:n = 21
输出:-1
解题
https://blog.csdn.net/weixin_44171872/article/details/107312518
主要思路:
首先将整数转化为对应的字符串,对字符串进行操作,这就相当于将原题转化为下一个全排列问题,只不过,为了避免越界,将最后的字符串先转化为long int 类型,然后和INT_MAX比较,决定输出哪个结果 .
class Solution {
public:
int nextGreaterElement(int n) {
string str=to_string(n);//将数组转化为字符串
//寻找一个更大的全排列
int i=str.size()-2;
while(i>=0&&str[i]>=str[i+1])
--i;
if(i==-1)
return -1;
int tmp=str.size()-1;
while (str[i] >= str[tmp])
--tmp;
swap(str[i],str[tmp]);
reverse(str.begin()+i+1,str.end());
//先将字符串转化为long int ,避免越界
long int res=atol(str.c_str());
return res>INT_MAX?-1:res;//根据是否越界,输出结果
}
};
好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力 。
上期推文: