Skip to content

Commit 8dde1d5

Browse files
committed
feat: add solutions to lc problem: No.1493
No.1493.Longest Subarray of 1's After Deleting One Element
1 parent 7c170a6 commit 8dde1d5

File tree

6 files changed

+278
-2
lines changed

6 files changed

+278
-2
lines changed

solution/1400-1499/1493.Longest Subarray of 1's After Deleting One Element/README.md

+101-1
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,122 @@
4848

4949
<!-- 这里可写通用的实现逻辑 -->
5050

51+
**方法一:枚举**
52+
53+
枚举删除的位置 $i$,那么每一个位置 $i$ 的最长子数组长度为 $i$ 左边连续的 $1$ 的个数加上 $i$ 右边连续的 $1$ 的个数。
54+
55+
因此,我们可以先遍历一遍数组,统计每个位置 $i$ 左边连续的 $1$ 的个数,记录在 `left` 数组;然后再从右向左遍历一遍数组,统计每个位置 $i$ 右边连续的 $1$ 的个数,记录在 `right` 数组,最后枚举删除的位置 $i$,求出最大值即可。
56+
57+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为数组 `nums` 的长度。
58+
5159
<!-- tabs:start -->
5260

5361
### **Python3**
5462

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

5765
```python
58-
66+
class Solution:
67+
def longestSubarray(self, nums: List[int]) -> int:
68+
n = len(nums)
69+
left = [0] * n
70+
right = [0] * n
71+
for i in range(1, n):
72+
if nums[i - 1] == 1:
73+
left[i] = left[i - 1] + 1
74+
for i in range(n - 2, -1, -1):
75+
if nums[i + 1] == 1:
76+
right[i] = right[i + 1] + 1
77+
return max(left[i] + right[i] for i in range(n))
5978
```
6079

6180
### **Java**
6281

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

6584
```java
85+
class Solution {
86+
public int longestSubarray(int[] nums) {
87+
int n = nums.length;
88+
int[] left = new int[n];
89+
int[] right = new int[n];
90+
for (int i = 1; i < n; ++i) {
91+
if (nums[i - 1] == 1) {
92+
left[i] = left[i - 1] + 1;
93+
}
94+
}
95+
for (int i = n - 2; i >= 0; --i) {
96+
if (nums[i + 1] == 1) {
97+
right[i] = right[i + 1] + 1;
98+
}
99+
}
100+
int ans = 0;
101+
for (int i = 0; i < n; ++i) {
102+
ans = Math.max(ans, left[i] + right[i]);
103+
}
104+
return ans;
105+
}
106+
}
107+
```
108+
109+
### **C++**
110+
111+
```cpp
112+
class Solution {
113+
public:
114+
int longestSubarray(vector<int>& nums) {
115+
int n = nums.size();
116+
vector<int> left(n);
117+
vector<int> right(n);
118+
for (int i = 1; i < n; ++i) {
119+
if (nums[i - 1] == 1) {
120+
left[i] = left[i - 1] + 1;
121+
}
122+
}
123+
for (int i = n - 2; ~i; --i) {
124+
if (nums[i + 1] == 1) {
125+
right[i] = right[i + 1] + 1;
126+
}
127+
}
128+
int ans = 0;
129+
for (int i = 0; i < n; ++i) {
130+
ans = max(ans, left[i] + right[i]);
131+
}
132+
return ans;
133+
}
134+
};
135+
```
66136
137+
### **Go**
138+
139+
```go
140+
func longestSubarray(nums []int) int {
141+
n := len(nums)
142+
left := make([]int, n)
143+
right := make([]int, n)
144+
for i := 1; i < n; i++ {
145+
if nums[i-1] == 1 {
146+
left[i] = left[i-1] + 1
147+
}
148+
}
149+
for i := n - 2; i >= 0; i-- {
150+
if nums[i+1] == 1 {
151+
right[i] = right[i+1] + 1
152+
}
153+
}
154+
ans := 0
155+
for i := 0; i < n; i++ {
156+
ans = max(ans, left[i]+right[i])
157+
}
158+
return ans
159+
}
160+
161+
func max(a, b int) int {
162+
if a > b {
163+
return a
164+
}
165+
return b
166+
}
67167
```
68168

69169
### **...**

solution/1400-1499/1493.Longest Subarray of 1's After Deleting One Element/README_EN.md

+93-1
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,105 @@
4848
### **Python3**
4949

5050
```python
51-
51+
class Solution:
52+
def longestSubarray(self, nums: List[int]) -> int:
53+
n = len(nums)
54+
left = [0] * n
55+
right = [0] * n
56+
for i in range(1, n):
57+
if nums[i - 1] == 1:
58+
left[i] = left[i - 1] + 1
59+
for i in range(n - 2, -1, -1):
60+
if nums[i + 1] == 1:
61+
right[i] = right[i + 1] + 1
62+
return max(left[i] + right[i] for i in range(n))
5263
```
5364

5465
### **Java**
5566

5667
```java
68+
class Solution {
69+
public int longestSubarray(int[] nums) {
70+
int n = nums.length;
71+
int[] left = new int[n];
72+
int[] right = new int[n];
73+
for (int i = 1; i < n; ++i) {
74+
if (nums[i - 1] == 1) {
75+
left[i] = left[i - 1] + 1;
76+
}
77+
}
78+
for (int i = n - 2; i >= 0; --i) {
79+
if (nums[i + 1] == 1) {
80+
right[i] = right[i + 1] + 1;
81+
}
82+
}
83+
int ans = 0;
84+
for (int i = 0; i < n; ++i) {
85+
ans = Math.max(ans, left[i] + right[i]);
86+
}
87+
return ans;
88+
}
89+
}
90+
```
91+
92+
### **C++**
93+
94+
```cpp
95+
class Solution {
96+
public:
97+
int longestSubarray(vector<int>& nums) {
98+
int n = nums.size();
99+
vector<int> left(n);
100+
vector<int> right(n);
101+
for (int i = 1; i < n; ++i) {
102+
if (nums[i - 1] == 1) {
103+
left[i] = left[i - 1] + 1;
104+
}
105+
}
106+
for (int i = n - 2; ~i; --i) {
107+
if (nums[i + 1] == 1) {
108+
right[i] = right[i + 1] + 1;
109+
}
110+
}
111+
int ans = 0;
112+
for (int i = 0; i < n; ++i) {
113+
ans = max(ans, left[i] + right[i]);
114+
}
115+
return ans;
116+
}
117+
};
118+
```
57119
120+
### **Go**
121+
122+
```go
123+
func longestSubarray(nums []int) int {
124+
n := len(nums)
125+
left := make([]int, n)
126+
right := make([]int, n)
127+
for i := 1; i < n; i++ {
128+
if nums[i-1] == 1 {
129+
left[i] = left[i-1] + 1
130+
}
131+
}
132+
for i := n - 2; i >= 0; i-- {
133+
if nums[i+1] == 1 {
134+
right[i] = right[i+1] + 1
135+
}
136+
}
137+
ans := 0
138+
for i := 0; i < n; i++ {
139+
ans = max(ans, left[i]+right[i])
140+
}
141+
return ans
142+
}
143+
144+
func max(a, b int) int {
145+
if a > b {
146+
return a
147+
}
148+
return b
149+
}
58150
```
59151

60152
### **...**
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
class Solution {
2+
public:
3+
int longestSubarray(vector<int>& nums) {
4+
int n = nums.size();
5+
vector<int> left(n);
6+
vector<int> right(n);
7+
for (int i = 1; i < n; ++i) {
8+
if (nums[i - 1] == 1) {
9+
left[i] = left[i - 1] + 1;
10+
}
11+
}
12+
for (int i = n - 2; ~i; --i) {
13+
if (nums[i + 1] == 1) {
14+
right[i] = right[i + 1] + 1;
15+
}
16+
}
17+
int ans = 0;
18+
for (int i = 0; i < n; ++i) {
19+
ans = max(ans, left[i] + right[i]);
20+
}
21+
return ans;
22+
}
23+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
func longestSubarray(nums []int) int {
2+
n := len(nums)
3+
left := make([]int, n)
4+
right := make([]int, n)
5+
for i := 1; i < n; i++ {
6+
if nums[i-1] == 1 {
7+
left[i] = left[i-1] + 1
8+
}
9+
}
10+
for i := n - 2; i >= 0; i-- {
11+
if nums[i+1] == 1 {
12+
right[i] = right[i+1] + 1
13+
}
14+
}
15+
ans := 0
16+
for i := 0; i < n; i++ {
17+
ans = max(ans, left[i]+right[i])
18+
}
19+
return ans
20+
}
21+
22+
func max(a, b int) int {
23+
if a > b {
24+
return a
25+
}
26+
return b
27+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
class Solution {
2+
public int longestSubarray(int[] nums) {
3+
int n = nums.length;
4+
int[] left = new int[n];
5+
int[] right = new int[n];
6+
for (int i = 1; i < n; ++i) {
7+
if (nums[i - 1] == 1) {
8+
left[i] = left[i - 1] + 1;
9+
}
10+
}
11+
for (int i = n - 2; i >= 0; --i) {
12+
if (nums[i + 1] == 1) {
13+
right[i] = right[i + 1] + 1;
14+
}
15+
}
16+
int ans = 0;
17+
for (int i = 0; i < n; ++i) {
18+
ans = Math.max(ans, left[i] + right[i]);
19+
}
20+
return ans;
21+
}
22+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
class Solution:
2+
def longestSubarray(self, nums: List[int]) -> int:
3+
n = len(nums)
4+
left = [0] * n
5+
right = [0] * n
6+
for i in range(1, n):
7+
if nums[i - 1] == 1:
8+
left[i] = left[i - 1] + 1
9+
for i in range(n - 2, -1, -1):
10+
if nums[i + 1] == 1:
11+
right[i] = right[i + 1] + 1
12+
return max(left[i] + right[i] for i in range(n))

0 commit comments

Comments
 (0)