File tree 8 files changed +132
-1
lines changed
problemset/next-greater-element-3
8 files changed +132
-1
lines changed Original file line number Diff line number Diff line change 2
2
3
3
<p align =" center " >
4
4
<!-- 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 " >
6
6
<!-- TOPICS COUNT END -->
7
7
<a href =" ./assets/docs/TOPICS.md " ><img src =" https://img.shields.io/badge/-题库目录-blue " alt =" 题库目录 " ></a >
8
8
<a href =" ./assets/docs/CATEGORIES.md " ><img src =" https://img.shields.io/badge/-题库分类-red " alt =" 题库分类 " ></a >
Original file line number Diff line number Diff line change 772
772
"path" : " ./problemset/minimum-moves-to-equal-array-elements-2/README.md" ,
773
773
"difficulty" : " 中等"
774
774
},
775
+ {
776
+ "id" : " 556" ,
777
+ "title" : " 下一个更大元素 III" ,
778
+ "path" : " ./problemset/next-greater-element-3/README.md" ,
779
+ "difficulty" : " 中等"
780
+ },
775
781
{
776
782
"id" : " 719" ,
777
783
"title" : " 找出第 K 小的数对距离" ,
Original file line number Diff line number Diff line change 3099
3099
"url" : " https://leetcode-cn.com/problems/optimal-division/" ,
3100
3100
"path" : " ./problemset/optimal-division/README.md"
3101
3101
},
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
+ },
3102
3112
{
3103
3113
"id" : " 564" ,
3104
3114
"title" : {
Original file line number Diff line number Diff line change 149
149
| 327. [ 区间和的个数] ( ../../problemset/count-of-range-sum/README.md ) | 困难 |
150
150
| 436. [ 寻找右区间] ( ../../problemset/find-right-interval/README.md ) | 中等 |
151
151
| 462. [ 最少移动次数使数组元素相等 II] ( ../../problemset/minimum-moves-to-equal-array-elements-2/README.md ) | 中等 |
152
+ | 556. [ 下一个更大元素 III] ( ../../problemset/next-greater-element-3/README.md ) | 中等 |
152
153
| 719. [ 找出第 K 小的数对距离] ( ../../problemset/find-k-th-smallest-pair-distance/README.md ) | 困难 |
153
154
| 937. [ 重新排列日志文件] ( ../../problemset/reorder-data-in-log-files/README.md ) | 简单 |
154
155
| 954. [ 二倍数对数组] ( ../../problemset/array-of-doubled-pairs/README.md ) | 中等 |
Original file line number Diff line number Diff line change 620
620
621
621
[ 553. 最优除法] ( ../../problemset/optimal-division/README.md )
622
622
623
+ [ 556. 下一个更大元素 III] ( ../../problemset/next-greater-element-3/README.md )
624
+
623
625
[ 564. 寻找最近的回文数] ( ../../problemset/find-the-closest-palindrome/README.md )
624
626
625
627
[ 587. 安装栅栏] ( ../../problemset/erect-the-fence/README.md )
Original file line number Diff line number Diff line change
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 number Diff line number Diff line change
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
+ }
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments