File tree 8 files changed +214
-2
lines changed
剑指 Offer II 008. 和大于等于 target 的最短子数组
剑指 Offer II 009. 乘积小于 K 的子数组
8 files changed +214
-2
lines changed Original file line number Diff line number Diff line change 66
66
<!-- 这里可写当前语言的特殊实现逻辑 -->
67
67
68
68
``` python
69
-
69
+ class Solution :
70
+ def minSubArrayLen (self , target : int , nums : List[int ]) -> int :
71
+ n = len (nums)
72
+ ans = float (' inf' )
73
+ sum = 0
74
+ left, right = 0 , 0
75
+ while right < n:
76
+ sum += nums[right]
77
+ right += 1
78
+ while sum >= target:
79
+ ans = min (ans, right - left)
80
+ sum -= nums[left]
81
+ left += 1
82
+ return 0 if ans == float (' inf' ) else ans
70
83
```
71
84
72
85
### ** Java**
73
86
74
87
<!-- 这里可写当前语言的特殊实现逻辑 -->
75
88
76
89
``` java
90
+ class Solution {
91
+ public int minSubArrayLen (int target , int [] nums ) {
92
+ int n = nums. length;
93
+ int ans = Integer . MAX_VALUE ;
94
+ int sum = 0 ;
95
+ int left = 0 , right = 0 ;
96
+ while (right < n) {
97
+ sum += nums[right++ ];
98
+ while (sum >= target) {
99
+ ans = Math . min(ans, right - left);
100
+ sum -= nums[left++ ];
101
+ }
102
+ }
103
+ return ans == Integer . MAX_VALUE ? 0 : ans;
104
+ }
105
+ }
106
+ ```
77
107
108
+ ### ** Go**
109
+
110
+ ``` go
111
+ func minSubArrayLen (target int , nums []int ) int {
112
+ n := len (nums)
113
+ ans := math.MaxInt32
114
+ sum := 0
115
+ left , right := 0 , 0
116
+ for right < n {
117
+ sum += nums[right]
118
+ right++
119
+ for sum >= target {
120
+ ans = min (ans, right-left)
121
+ sum -= nums[left]
122
+ left++
123
+ }
124
+ }
125
+ if ans == math.MaxInt32 {
126
+ return 0
127
+ }
128
+ return ans
129
+ }
130
+
131
+ func min (a , b int ) int {
132
+ if a < b {
133
+ return a
134
+ }
135
+ return b
136
+ }
78
137
```
79
138
80
139
### ** ...**
Original file line number Diff line number Diff line change
1
+ func minSubArrayLen (target int , nums []int ) int {
2
+ n := len (nums )
3
+ ans := math .MaxInt32
4
+ sum := 0
5
+ left , right := 0 , 0
6
+ for right < n {
7
+ sum += nums [right ]
8
+ right ++
9
+ for sum >= target {
10
+ ans = min (ans , right - left )
11
+ sum -= nums [left ]
12
+ left ++
13
+ }
14
+ }
15
+ if ans == math .MaxInt32 {
16
+ return 0
17
+ }
18
+ return ans
19
+ }
20
+
21
+ func min (a , b int ) int {
22
+ if a < b {
23
+ return a
24
+ }
25
+ return b
26
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public int minSubArrayLen (int target , int [] nums ) {
3
+ int n = nums .length ;
4
+ int ans = Integer .MAX_VALUE ;
5
+ int sum = 0 ;
6
+ int left = 0 , right = 0 ;
7
+ while (right < n ) {
8
+ sum += nums [right ++];
9
+ while (sum >= target ) {
10
+ ans = Math .min (ans , right - left );
11
+ sum -= nums [left ++];
12
+ }
13
+ }
14
+ return ans == Integer .MAX_VALUE ? 0 : ans ;
15
+ }
16
+ }
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def minSubArrayLen (self , target : int , nums : List [int ]) -> int :
3
+ n = len (nums )
4
+ ans = float ('inf' )
5
+ sum = 0
6
+ left , right = 0 , 0
7
+ while right < n :
8
+ sum += nums [right ]
9
+ right += 1
10
+ while sum >= target :
11
+ ans = min (ans , right - left )
12
+ sum -= nums [left ]
13
+ left += 1
14
+ return 0 if ans == float ('inf' ) else ans
Original file line number Diff line number Diff line change 42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
45
+ 利用滑动窗口,我们能求出每个不同 ` right ` 结尾的合法子数组的个数
46
+
45
47
<!-- tabs:start -->
46
48
47
49
### ** Python3**
48
50
49
51
<!-- 这里可写当前语言的特殊实现逻辑 -->
50
52
51
53
``` python
52
-
54
+ class Solution :
55
+ def numSubarrayProductLessThanK (self , nums : List[int ], k : int ) -> int :
56
+ n = len (nums)
57
+ ans = 0
58
+ sum = 1
59
+ left, right = 0 , 0
60
+ while right < n:
61
+ sum *= nums[right]
62
+ right += 1
63
+ while sum >= k and left < right:
64
+ sum /= nums[left]
65
+ left += 1
66
+ ans += right - left
67
+ return ans
53
68
```
54
69
55
70
### ** Java**
56
71
57
72
<!-- 这里可写当前语言的特殊实现逻辑 -->
58
73
59
74
``` java
75
+ class Solution {
76
+ public int numSubarrayProductLessThanK (int [] nums , int k ) {
77
+ int n = nums. length;
78
+ int ans = 0 ;
79
+ int sum = 1 ;
80
+ int left = 0 , right = 0 ;
81
+ while (right < n) {
82
+ sum *= nums[right++ ];
83
+ while (sum >= k && left < right) {
84
+ sum /= nums[left++ ];
85
+ }
86
+ ans += right - left;
87
+ }
88
+ return ans;
89
+ }
90
+ }
91
+ ```
60
92
93
+ ### ** Go**
94
+
95
+ ``` go
96
+ func numSubarrayProductLessThanK (nums []int , k int ) int {
97
+ n := len (nums)
98
+ ans := 0
99
+ sum := 1
100
+ left , right := 0 , 0
101
+ for right < n {
102
+ sum *= nums[right]
103
+ right++
104
+ for sum >= k && left < right {
105
+ sum /= nums[left]
106
+ left++
107
+ }
108
+ ans += right - left
109
+ }
110
+ return ans
111
+ }
61
112
```
62
113
63
114
### ** ...**
Original file line number Diff line number Diff line change
1
+ func numSubarrayProductLessThanK (nums []int , k int ) int {
2
+ n := len (nums )
3
+ ans := 0
4
+ sum := 1
5
+ left , right := 0 , 0
6
+ for right < n {
7
+ sum *= nums [right ]
8
+ right ++
9
+ for sum >= k && left < right {
10
+ sum /= nums [left ]
11
+ left ++
12
+ }
13
+ ans += right - left
14
+ }
15
+ return ans
16
+ }
Original file line number Diff line number Diff line change
1
+ class Solution {
2
+ public int numSubarrayProductLessThanK (int [] nums , int k ) {
3
+ int n = nums .length ;
4
+ int ans = 0 ;
5
+ int sum = 1 ;
6
+ int left = 0 , right = 0 ;
7
+ while (right < n ) {
8
+ sum *= nums [right ++];
9
+ while (sum >= k && left < right ) {
10
+ sum /= nums [left ++];
11
+ }
12
+ ans += right - left ;
13
+ }
14
+ return ans ;
15
+ }
16
+ }
Original file line number Diff line number Diff line change
1
+ class Solution :
2
+ def numSubarrayProductLessThanK (self , nums : List [int ], k : int ) -> int :
3
+ n = len (nums )
4
+ ans = 0
5
+ sum = 1
6
+ left , right = 0 , 0
7
+ while right < n :
8
+ sum *= nums [right ]
9
+ right += 1
10
+ while sum >= k and left < right :
11
+ sum /= nums [left ]
12
+ left += 1
13
+ ans += right - left
14
+ return ans
You can’t perform that action at this time.
0 commit comments