Skip to content

Commit f787456

Browse files
committed
feat: add solutions to lcof2 problems: No.008,009
1 parent 874f053 commit f787456

File tree

8 files changed

+214
-2
lines changed

8 files changed

+214
-2
lines changed

lcof2/剑指 Offer II 008. 和大于等于 target 的最短子数组/README.md

+60-1
Original file line numberDiff line numberDiff line change
@@ -66,15 +66,74 @@
6666
<!-- 这里可写当前语言的特殊实现逻辑 -->
6767

6868
```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
7083
```
7184

7285
### **Java**
7386

7487
<!-- 这里可写当前语言的特殊实现逻辑 -->
7588

7689
```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+
```
77107

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+
}
78137
```
79138

80139
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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

lcof2/剑指 Offer II 009. 乘积小于 K 的子数组/README.md

+52-1
Original file line numberDiff line numberDiff line change
@@ -42,22 +42,73 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
利用滑动窗口,我们能求出每个不同 `right` 结尾的合法子数组的个数
46+
4547
<!-- tabs:start -->
4648

4749
### **Python3**
4850

4951
<!-- 这里可写当前语言的特殊实现逻辑 -->
5052

5153
```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
5368
```
5469

5570
### **Java**
5671

5772
<!-- 这里可写当前语言的特殊实现逻辑 -->
5873

5974
```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+
```
6092

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+
}
61112
```
62113

63114
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
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 numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
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

0 commit comments

Comments
 (0)