Skip to content

Commit d7b59d3

Browse files
committed
feat: leetcode 556
1 parent 6ff2498 commit d7b59d3

File tree

8 files changed

+132
-1
lines changed

8 files changed

+132
-1
lines changed

README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<p align="center">
44
<!-- TOPICS COUNT START -->
5-
<img src="https://img.shields.io/badge/-进度:419-green" alt="进度:419">
5+
<img src="https://img.shields.io/badge/-进度:420-green" alt="进度:420">
66
<!-- TOPICS COUNT END -->
77
<a href="./assets/docs/TOPICS.md"><img src="https://img.shields.io/badge/-题库目录-blue" alt="题库目录"></a>
88
<a href="./assets/docs/CATEGORIES.md"><img src="https://img.shields.io/badge/-题库分类-red" alt="题库分类"></a>

assets/data/categories.json

+6
Original file line numberDiff line numberDiff line change
@@ -772,6 +772,12 @@
772772
"path": "./problemset/minimum-moves-to-equal-array-elements-2/README.md",
773773
"difficulty": "中等"
774774
},
775+
{
776+
"id": "556",
777+
"title": "下一个更大元素 III",
778+
"path": "./problemset/next-greater-element-3/README.md",
779+
"difficulty": "中等"
780+
},
775781
{
776782
"id": "719",
777783
"title": "找出第 K 小的数对距离",

assets/data/topics.json

+10
Original file line numberDiff line numberDiff line change
@@ -3099,6 +3099,16 @@
30993099
"url": "https://leetcode-cn.com/problems/optimal-division/",
31003100
"path": "./problemset/optimal-division/README.md"
31013101
},
3102+
{
3103+
"id": "556",
3104+
"title": {
3105+
"cn": "下一个更大元素 III",
3106+
"en": "next-greater-element-3"
3107+
},
3108+
"difficulty": "中等",
3109+
"url": "https://leetcode.cn/problems/next-greater-element-iii/",
3110+
"path": "./problemset/next-greater-element-3/README.md"
3111+
},
31023112
{
31033113
"id": "564",
31043114
"title": {

assets/docs/CATEGORIES.md

+1
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@
149149
| 327. [区间和的个数](../../problemset/count-of-range-sum/README.md) | 困难 |
150150
| 436. [寻找右区间](../../problemset/find-right-interval/README.md) | 中等 |
151151
| 462. [最少移动次数使数组元素相等 II](../../problemset/minimum-moves-to-equal-array-elements-2/README.md) | 中等 |
152+
| 556. [下一个更大元素 III](../../problemset/next-greater-element-3/README.md) | 中等 |
152153
| 719. [找出第 K 小的数对距离](../../problemset/find-k-th-smallest-pair-distance/README.md) | 困难 |
153154
| 937. [重新排列日志文件](../../problemset/reorder-data-in-log-files/README.md) | 简单 |
154155
| 954. [二倍数对数组](../../problemset/array-of-doubled-pairs/README.md) | 中等 |

assets/docs/TOPICS.md

+2
Original file line numberDiff line numberDiff line change
@@ -620,6 +620,8 @@
620620

621621
[553. 最优除法](../../problemset/optimal-division/README.md)
622622

623+
[556. 下一个更大元素 III](../../problemset/next-greater-element-3/README.md)
624+
623625
[564. 寻找最近的回文数](../../problemset/find-the-closest-palindrome/README.md)
624626

625627
[587. 安装栅栏](../../problemset/erect-the-fence/README.md)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
# 下一个更大元素 III
2+
3+
> 难度:中等
4+
>
5+
> https://leetcode.cn/problems/next-greater-element-iii/
6+
7+
## 题目
8+
9+
给你一个正整数 `n` ,请你找出符合条件的最小整数,其由重新排列 `n` 中存在的每位数字组成,并且其值大于 `n` 。如果不存在这样的正整数,则返回 `-1`
10+
11+
注意 ,返回的整数应当是一个 `32` 位整数 ,如果存在满足题意的答案,但不是 `32` 位整数 ,同样返回 `-1`
12+
13+
### 示例
14+
15+
#### 示例 1:
16+
17+
```
18+
输入:n = 12
19+
输出:21
20+
```
21+
22+
#### 示例 2:
23+
```
24+
输入:n = 21
25+
输出:-1
26+
```
27+
28+
## 解题
29+
30+
```ts
31+
/**
32+
* 下一个排列
33+
* @desc 时间复杂度 O(logN) 空间复杂度 O(logN)
34+
* @param n
35+
* @returns
36+
*/
37+
export function nextGreaterElement(n: number): number {
38+
const MAX = 2 ** 31 - 1
39+
40+
const nums = [...(`${n}`)]
41+
let i = nums.length - 2
42+
while (i >= 0 && nums[i] >= nums[i + 1]) i--
43+
44+
if (i < 0) return -1
45+
46+
let j = nums.length - 1
47+
while (j >= 0 && nums[i] >= nums[j]) j--;
48+
49+
[nums[i], nums[j]] = [nums[j], nums[i]]
50+
reverse(nums, i + 1)
51+
const ans = Number(nums.join(''))
52+
return ans > MAX ? -1 : ans
53+
54+
function reverse(nums: string[], begin: number) {
55+
let i = begin
56+
let j = nums.length - 1
57+
while (i < j) {
58+
[nums[i], nums[j]] = [nums[j], nums[i]]
59+
i++
60+
j--
61+
}
62+
}
63+
}
64+
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
import { describe, expect, it } from 'vitest'
2+
import { nextGreaterElement } from '.'
3+
4+
describe('下一个更大元素 III', () => {
5+
testCase(nextGreaterElement)
6+
})
7+
8+
function testCase(fn: (n: number) => number) {
9+
it.each([
10+
[12, 21],
11+
[21, -1],
12+
])('示例%#', (n, expected) => {
13+
expect(fn(n)).toBe(expected)
14+
})
15+
}
+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/**
2+
* 下一个排列
3+
* @desc 时间复杂度 O(logN) 空间复杂度 O(logN)
4+
* @param n
5+
* @returns
6+
*/
7+
export function nextGreaterElement(n: number): number {
8+
const MAX = 2 ** 31 - 1
9+
10+
const nums = [...(`${n}`)]
11+
let i = nums.length - 2
12+
while (i >= 0 && nums[i] >= nums[i + 1]) i--
13+
14+
if (i < 0) return -1
15+
16+
let j = nums.length - 1
17+
while (j >= 0 && nums[i] >= nums[j]) j--;
18+
19+
[nums[i], nums[j]] = [nums[j], nums[i]]
20+
reverse(nums, i + 1)
21+
const ans = Number(nums.join(''))
22+
return ans > MAX ? -1 : ans
23+
24+
function reverse(nums: string[], begin: number) {
25+
let i = begin
26+
let j = nums.length - 1
27+
while (i < j) {
28+
[nums[i], nums[j]] = [nums[j], nums[i]]
29+
i++
30+
j--
31+
}
32+
}
33+
}

0 commit comments

Comments
 (0)