Skip to content

Commit 392d634

Browse files
committed
add: 下一个更大元素 III
1 parent 095f6c9 commit 392d634

File tree

3 files changed

+47
-0
lines changed

3 files changed

+47
-0
lines changed

README.md

+4
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,10 @@ TypeScript / JavaScript 基础算法、数据结构练习,包含 LeetCode 或
456456

457457
### 数学
458458

459+
- [下一个更大元素 III](src/math/next-greater-element-iii.ts) [数学, 双指针, 字符串]
460+
461+
- LeetCode 556. 下一个更大元素 III <https://leetcode.cn/problems/next-greater-element-iii>
462+
459463
- [阶乘后的零](src/math/factorial-trailing-zeroes.js)
460464

461465
- LeetCode 172. 阶乘后的零 <https://leetcode-cn.com/problems/factorial-trailing-zeroes/submissions/>

src/math/next-greater-element-iii.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
// 下一个更大元素 III
2+
// https://leetcode.cn/problems/next-greater-element-iii
3+
// 解题思路:参考 31. 下一个排列
4+
5+
const reverse = (nums: string[], begin: number) => {
6+
let i = begin, j = nums.length - 1
7+
while (i < j) {
8+
[nums[i], nums[j]] = [nums[j], nums[i]]
9+
i++
10+
j--
11+
}
12+
}
13+
14+
export function nextGreaterElement (n: number): number {
15+
const numStrArr = [...n.toString()]
16+
let i = numStrArr.length - 2
17+
while (i >= 0 && numStrArr[i + 1] <= numStrArr[i]) {
18+
i--
19+
}
20+
21+
if (i < 0) return -1
22+
23+
let j = numStrArr.length - 1
24+
while (j >= 0 && numStrArr[i] >= numStrArr[j]) { j-- }
25+
;[numStrArr[i], numStrArr[j]] = [numStrArr[j], numStrArr[i]]
26+
reverse(numStrArr, i + 1)
27+
const res = Number(numStrArr.join(''))
28+
return res > 2 ** 31 - 1 ? -1 : res
29+
}
+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { nextGreaterElement } from '../../src/math/next-greater-element-iii'
2+
3+
test('下一个更大元素 III', () => {
4+
// 示例 1:
5+
// 输入:n = 12
6+
// 输出:21
7+
8+
// 示例 2:
9+
// 输入:n = 21
10+
// 输出:-1
11+
12+
expect(nextGreaterElement(12)).toBe(21)
13+
expect(nextGreaterElement(21)).toBe(-1)
14+
})

0 commit comments

Comments
 (0)