每日算法系列【LeetCode 556】下一个更大元素 III
题目描述
给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n。如果不存在这样的32位整数,则返回-1。
示例1
输入:
12
输出:
21
示例2
输入:
21
输出:
-1
题解
首先要发现一个性质,如果调换两个数位之后,整个数字变大了,那说明第一个数位的数字小于第二个数位的数。所以我们只需要找到一个顺序对,调换它俩顺序就行了。
但是如果存在两个顺序对 和 ,那我们就要找 更大的那个,因为前面的尽量不动才会使调换后的数字最小。
如果 相同的话,就要在 右边找最小的使得 的数,这样 处的数字才是最小的,同时整体数字还会变大。
最后因为 处已经变大了,所以 后面的数字全部都要升序排列,这样整体数字才是最小的。
所以整体算法就有了,我们从右往左找,找到第一个上升的位置 ,也就是 。这样 右边就是降序了,不存在顺序对。然后在 右边的数字中二分查找最小的大于 的数 ,调换它俩位置。最后把 右边的数字变成升序即可。
代码
c++
class Solution {public:int nextGreaterElement(int n) {int a[11], len = 0;while (n > 0) {a[++len] = n % 10;n /= 10;}a[0] = INT_MIN;int ok = 0;for (int i = 1; i <= len; ++i) {if (a[i] < a[i-1]) {int idx = upper_bound(a+1, a+i, a[i]) - a;swap(a[idx], a[i]);for (int j = 1; j <= (i-1)/2; ++j) {swap(a[j], a[i-j]);}ok = 1;break;}}if (!ok) return -1;long res = 0;for (int i = len; i > 0; --i) {res = res * 10 + a[i];}return res > INT_MAX ? -1 : res;}
};
python
class Solution:def nextGreaterElement(self, n: int) -> int:s = str(n)n = len(s)res = ''for i in range(n-1, -1, -1):res = s[i] + resif i < n-1 and res[0] < res[1]:res = ''.join(sorted(res))for j in range(n-i):if res[j] > s[i]:res = res[j] + res[:j] + res[j+1:]breaks = s[:i] + resreturn int(s) if int(s) < pow(2, 31) else -1return -1
后记
这题还可以直接用 c++ 标准库函数 next_permutation
直接生成下一个更大的字符串排列,然后转换成整数就行了,代码如下:
class Solution {public:int nextGreaterElement(int n) {string s = to_string(n);next_permutation(s.begin(), s.end());long res = stoll(s);return res > INT_MAX || res <= n ? -1 : res;}
};
每日算法系列【LeetCode 556】下一个更大元素 III相关推荐
- Java实现 LeetCode 556 下一个更大元素 III(数组的翻转)
556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 1 ...
- LeetCode 556. 下一个更大元素 III
1. 题目 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: 21示例 ...
- 2021-08-25556. 下一个更大元素 III
556. 下一个更大元素 III 给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n .如果不存在这样的正整数,则返回 -1 . 注意 ,返回的 ...
- LeetCode 496. 下一个更大元素 I
599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...
- LeetCode 496. 下一个更大元素 I(哈希)
1. 题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...
- leetcode 503. 下一个更大元素 II
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
- LeetCode 496. 下一个更大元素 I 解题思路及C++实现
解题思路: 因为这两个int型的vector中不包含重复元素,所以考虑使用c++中的unordered_map,对num2进行遍历,找到每一个元素的下一个更大元素,这样的话,时间复杂度就是O(n). ...
- leetcode 503. 下一个更大元素 II(单调栈)
给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...
- Java实现 LeetCode 503 下一个更大元素 II
503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...
- Java实现 LeetCode 496 下一个更大元素 I
496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...
最新文章
- 链表问题4——反转双向链表
- VS2008正式版创建silverlight项目失败的解决办法
- PostgreSQL切换用户,提示对等认证失败的解决方案
- 英伟达对ARM、Linux开放光线追踪,SDK已就位,网友:switch也能跑光追的节奏?...
- MySQL服务器参数介绍
- ?php php,PHP: Balises PHP - Manual
- 用VBA编写的简易计算器
- Python学习之路day01——002简单数据类型
- 注入漏洞之sql注入漏洞
- 微信小程序登录-开发文档
- 让iPhone不能自动下载系统更新的一个办法
- 64位CPU内存限制
- Pytorch踩坑记:赋值、浅拷贝、深拷贝三者的区别以及model.state_dict()和model.load_state_dict()的坑点
- 蓝牙低功耗音频技术--目录大纲
- 3dmax如何呈现Z频道
- UEFI+GPT更换硬盘GHOST,DD也可以。
- 微信小程序时间加法_微信小程序获取系统时间、时间戳、时间时间戳加减
- Win10系统电脑连接打印机的设置方法
- 老Java程序员谈谈swing要不要学
- Echarts实现3d 地图实现飞线效果