Skip to content

Commit 64070e1

Browse files
authored
feat: add solutions to lcof2 problems (doocs#1396)
1 parent 9750047 commit 64070e1

File tree

24 files changed

+481
-381
lines changed

24 files changed

+481
-381
lines changed

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

Lines changed: 71 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,14 @@
5858

5959
<!-- 这里可写通用的实现逻辑 -->
6060

61+
**方法一:双指针**
62+
63+
我们使用双指针维护一个和小于 $target$ 的连续子数组。每次右边界 $j$ 向右移动一位,如果和大于等于 $target$,则更新答案的最小值,同时左边界 $i$ 向右移动,直到和小于 $target$。
64+
65+
最后,如果答案没有被更新过,返回 $0$,否则返回答案。
66+
67+
时间复杂度 $O(n)$,其中 $n$ 是数组的长度。空间复杂度 $O(1)$。
68+
6169
<!-- tabs:start -->
6270

6371
### **Python3**
@@ -67,17 +75,14 @@
6775
```python
6876
class Solution:
6977
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
70-
n = len(nums)
7178
ans = inf
72-
sum = 0
73-
left, right = 0, 0
74-
while right < n:
75-
sum += nums[right]
76-
right += 1
77-
while sum >= target:
78-
ans = min(ans, right - left)
79-
sum -= nums[left]
80-
left += 1
79+
s = i = 0
80+
for j, x in enumerate(nums):
81+
s += x
82+
while s >= target:
83+
ans = min(ans, j - i + 1)
84+
s -= nums[i]
85+
i += 1
8186
return 0 if ans == inf else ans
8287
```
8388

@@ -88,40 +93,59 @@ class Solution:
8893
```java
8994
class Solution {
9095
public int minSubArrayLen(int target, int[] nums) {
91-
int n = nums.length;
92-
int ans = Integer.MAX_VALUE;
93-
int sum = 0;
94-
int left = 0, right = 0;
95-
while (right < n) {
96-
sum += nums[right++];
97-
while (sum >= target) {
98-
ans = Math.min(ans, right - left);
99-
sum -= nums[left++];
96+
final int inf = 1 << 30;
97+
int ans = inf;
98+
int s = 0;
99+
for (int i = 0, j = 0; j < nums.length; ++j) {
100+
s += nums[j];
101+
while (s >= target) {
102+
ans = Math.min(ans, j - i + 1);
103+
s -= nums[i++];
100104
}
101105
}
102-
return ans == Integer.MAX_VALUE ? 0 : ans;
106+
return ans == inf ? 0 : ans;
103107
}
104108
}
105109
```
106110

111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
int minSubArrayLen(int target, vector<int>& nums) {
117+
const int inf = 1 << 30;
118+
int ans = inf;
119+
int n = nums.size();
120+
int s = 0;
121+
for (int i = 0, j = 0; j < n; ++j) {
122+
s += nums[j];
123+
while (s >= target) {
124+
ans = min(ans, j - i + 1);
125+
s -= nums[i++];
126+
}
127+
}
128+
return ans == inf ? 0 : ans;
129+
}
130+
};
131+
```
132+
107133
### **Go**
108134
109135
```go
110136
func minSubArrayLen(target int, nums []int) int {
111-
n := len(nums)
112-
ans := math.MaxInt32
113-
sum := 0
114-
left, right := 0, 0
115-
for right < n {
116-
sum += nums[right]
117-
right++
118-
for sum >= target {
119-
ans = min(ans, right-left)
120-
sum -= nums[left]
121-
left++
137+
const inf = 1 << 30
138+
ans := inf
139+
s, i := 0, 0
140+
for j, x := range nums {
141+
s += x
142+
for s >= target {
143+
ans = min(ans, j-i+1)
144+
s -= nums[i]
145+
i++
122146
}
123147
}
124-
if ans == math.MaxInt32 {
148+
if ans == inf {
125149
return 0
126150
}
127151
return ans
@@ -135,27 +159,23 @@ func min(a, b int) int {
135159
}
136160
```
137161

138-
### **C++**
139-
140-
```cpp
141-
class Solution {
142-
public:
143-
int minSubArrayLen(int target, vector<int>& nums) {
144-
int left = 0, right;
145-
int sum = 0;
146-
int minlen = INT_MAX;
147-
148-
for (right = 0; right < nums.size(); right++) {
149-
sum += nums[right];
150-
while (left <= right && sum >= target) {
151-
minlen = min(minlen, right - left + 1);
152-
sum -= nums[left++];
153-
}
162+
### **TypeScript**
163+
164+
```ts
165+
function minSubArrayLen(target: number, nums: number[]): number {
166+
const n = nums.length;
167+
const inf = 1 << 30;
168+
let ans = inf;
169+
let s = 0;
170+
for (let i = 0, j = 0; j < n; ++j) {
171+
s += nums[j];
172+
while (s >= target) {
173+
ans = Math.min(ans, j - i + 1);
174+
s -= nums[i++];
154175
}
155-
156-
return minlen == INT_MAX ? 0 : minlen;
157176
}
158-
};
177+
return ans === inf ? 0 : ans;
178+
}
159179
```
160180

161181
### **...**
Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
class Solution {
2-
public:
3-
int minSubArrayLen(int target, vector<int>& nums) {
4-
int left = 0, right;
5-
int sum = 0;
6-
int minlen = INT_MAX;
7-
8-
for (right = 0; right < nums.size(); right++) {
9-
sum += nums[right];
10-
while (left <= right && sum >= target) {
11-
minlen = min(minlen, right - left + 1);
12-
sum -= nums[left++];
13-
}
14-
}
15-
16-
return minlen == INT_MAX ? 0 : minlen;
17-
}
1+
class Solution {
2+
public:
3+
int minSubArrayLen(int target, vector<int>& nums) {
4+
const int inf = 1 << 30;
5+
int ans = inf;
6+
int n = nums.size();
7+
int s = 0;
8+
for (int i = 0, j = 0; j < n; ++j) {
9+
s += nums[j];
10+
while (s >= target) {
11+
ans = min(ans, j - i + 1);
12+
s -= nums[i++];
13+
}
14+
}
15+
return ans == inf ? 0 : ans;
16+
}
1817
};

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

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,16 @@
11
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++
2+
const inf = 1 << 30
3+
ans := inf
4+
s, i := 0, 0
5+
for j, x := range nums {
6+
s += x
7+
for s >= target {
8+
ans = min(ans, j-i+1)
9+
s -= nums[i]
10+
i++
1311
}
1412
}
15-
if ans == math.MaxInt32 {
13+
if ans == inf {
1614
return 0
1715
}
1816
return ans
Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
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-
}
1+
class Solution {
2+
public int minSubArrayLen(int target, int[] nums) {
3+
final int inf = 1 << 30;
4+
int ans = inf;
5+
int s = 0;
6+
for (int i = 0, j = 0; j < nums.length; ++j) {
7+
s += nums[j];
8+
while (s >= target) {
9+
ans = Math.min(ans, j - i + 1);
10+
s -= nums[i++];
11+
}
12+
}
13+
return ans == inf ? 0 : ans;
14+
}
1615
}
Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
class Solution:
2-
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
3-
n = len(nums)
4-
ans = 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 == inf else ans
1+
class Solution:
2+
def minSubArrayLen(self, target: int, nums: List[int]) -> int:
3+
ans = inf
4+
s = i = 0
5+
for j, x in enumerate(nums):
6+
s += x
7+
while s >= target:
8+
ans = min(ans, j - i + 1)
9+
s -= nums[i]
10+
i += 1
11+
return 0 if ans == inf else ans
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
function minSubArrayLen(target: number, nums: number[]): number {
2+
const n = nums.length;
3+
const inf = 1 << 30;
4+
let ans = inf;
5+
let s = 0;
6+
for (let i = 0, j = 0; j < n; ++j) {
7+
s += nums[j];
8+
while (s >= target) {
9+
ans = Math.min(ans, j - i + 1);
10+
s -= nums[i++];
11+
}
12+
}
13+
return ans === inf ? 0 : ans;
14+
}

0 commit comments

Comments
 (0)