题目描述

给定一个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相关推荐

  1. Java实现 LeetCode 556 下一个更大元素 III(数组的翻转)

    556. 下一个更大元素 III 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 1 ...

  2. LeetCode 556. 下一个更大元素 III

    1. 题目 给定一个32位正整数 n,你需要找到最小的32位整数,其与 n 中存在的位数完全相同,并且其值大于n.如果不存在这样的32位整数,则返回-1. 示例 1: 输入: 12 输出: 21示例 ...

  3. 2021-08-25556. 下一个更大元素 III

    556. 下一个更大元素 III 给你一个正整数 n ,请你找出符合条件的最小整数,其由重新排列 n 中存在的每位数字组成,并且其值大于 n .如果不存在这样的正整数,则返回 -1 . 注意 ,返回的 ...

  4. LeetCode 496. 下一个更大元素 I

    599. 两个列表的最小索引总和 添加链接描述 假设 Andy 和 Doris 想在晚餐时选择一家餐厅,并且他们都有一个表示最喜爱餐厅的列表,每个餐厅的名字用字符串表示. 你需要帮助他们用最少的索引和 ...

  5. LeetCode 496. 下一个更大元素 I(哈希)

    1. 题目 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nums1 中数字 x ...

  6. leetcode 503. 下一个更大元素 II

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  7. LeetCode 496. 下一个更大元素 I 解题思路及C++实现

    解题思路: 因为这两个int型的vector中不包含重复元素,所以考虑使用c++中的unordered_map,对num2进行遍历,找到每一个元素的下一个更大元素,这样的话,时间复杂度就是O(n). ...

  8. leetcode 503. 下一个更大元素 II(单调栈)

    给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它 ...

  9. Java实现 LeetCode 503 下一个更大元素 II

    503. 下一个更大元素 II 给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素.数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大 ...

  10. Java实现 LeetCode 496 下一个更大元素 I

    496. 下一个更大元素 I 给定两个没有重复元素的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集.找到 nums1 中每个元素在 nums2 中的下一个比其大的值. nu ...

最新文章

  1. 链表问题4——反转双向链表
  2. VS2008正式版创建silverlight项目失败的解决办法
  3. PostgreSQL切换用户,提示对等认证失败的解决方案
  4. 英伟达对ARM、Linux开放光线追踪,SDK已就位,网友:switch也能跑光追的节奏?...
  5. MySQL服务器参数介绍
  6. ?php php,PHP: Balises PHP - Manual
  7. 用VBA编写的简易计算器
  8. Python学习之路day01——002简单数据类型
  9. 注入漏洞之sql注入漏洞
  10. 微信小程序登录-开发文档
  11. 让iPhone不能自动下载系统更新的一个办法
  12. 64位CPU内存限制
  13. Pytorch踩坑记:赋值、浅拷贝、深拷贝三者的区别以及model.state_dict()和model.load_state_dict()的坑点
  14. 蓝牙低功耗音频技术--目录大纲
  15. 3dmax如何呈现Z频道
  16. UEFI+GPT更换硬盘GHOST,DD也可以。
  17. 微信小程序时间加法_微信小程序获取系统时间、时间戳、时间时间戳加减
  18. Win10系统电脑连接打印机的设置方法
  19. 老Java程序员谈谈swing要不要学
  20. Echarts实现3d 地图实现飞线效果

热门文章

  1. Windows最常用的几个网络CMD命令总结
  2. PHP扩展迁移为PHP7扩展兼容性问题记录
  3. Xilinx发布新版SDAccel开发环境加速数据中心应用
  4. css分类及其它技巧
  5. Microsoft SQL Server 2008 Management Studio Express 下载地址
  6. Python实现淘宝秒杀聚划算自动提醒源码
  7. django multidb --- router
  8. python - PyDev统一编码
  9. php gd实现简单图片验证码与图片背景文字水印
  10. Java网络通信 TCP网络,ServerSocket类