Skip to content

Commit d10c1af

Browse files
committed
feat: add solutions to lc problem: No.2401
No.2401.Longest Nice Subarray
1 parent c917eeb commit d10c1af

File tree

7 files changed

+125
-106
lines changed

7 files changed

+125
-106
lines changed

solution/2400-2499/2401.Longest Nice Subarray/README.md

Lines changed: 51 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,21 @@
4848

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

51-
**方法一:滑动窗口**
51+
**方法一:双指针**
5252

53-
时间复杂度 $O(n)$,其中 $n$ 为数组 `nums` 的长度。
53+
我们定义一个变量 $mask$,用于记录当前子数组中的元素按位或的结果,初始时 $mask = 0$。另外,使用双指针 $j$ 和 $i$ 分别指向当前子数组的左右端点,初始时 $i = j = 0$。
54+
55+
接下来,我们从左到右遍历数组 $nums$,对于遍历到的每个元素 $x$:
56+
57+
我们将其与 $mask$ 按位与,如果结果不为 $0$,则说明 $x$ 和 $mask$ 中至少有一个元素的二进制表示中的某一位为 $1$,而另一个元素的二进制表示中的对应位为 $0$,这样的元素对不可能满足题目要求,因此我们需要将 $j$ 右移,直到 $x$ 和 $mask$ 按位与的结果为 $0$ 为止。
58+
59+
此时,我们就找到了一个满足题目要求的子数组,其长度为 $i - j + 1$,我们将其与当前的最长优雅子数组的长度进行比较,如果大于当前的最长优雅子数组的长度,则更新最长优雅子数组的长度。
60+
61+
然后我们将 $mask$ 和 $x$ 按位或,继续遍历下一个元素。
62+
63+
最终,我们得到的最长优雅子数组的长度即为答案。
64+
65+
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组 $nums$ 的长度。
5466

5567
<!-- tabs:start -->
5668

@@ -61,13 +73,13 @@
6173
```python
6274
class Solution:
6375
def longestNiceSubarray(self, nums: List[int]) -> int:
64-
ans = j = t = 0
65-
for i, v in enumerate(nums):
66-
while t & v:
67-
t ^= nums[j]
76+
ans = j = mask = 0
77+
for i, x in enumerate(nums):
78+
while mask & x:
79+
mask ^= nums[j]
6880
j += 1
69-
t |= v
7081
ans = max(ans, i - j + 1)
82+
mask |= x
7183
return ans
7284
```
7385

@@ -78,14 +90,13 @@ class Solution:
7890
```java
7991
class Solution {
8092
public int longestNiceSubarray(int[] nums) {
81-
int j = 0, t = 0;
82-
int ans = 0;
83-
for (int i = 0; i < nums.length; ++i) {
84-
while ((t & nums[i]) != 0) {
85-
t ^= nums[j++];
93+
int ans = 0, mask = 0;
94+
for (int i = 0, j = 0; i < nums.length; ++i) {
95+
while ((mask & nums[i]) != 0) {
96+
mask ^= nums[j++];
8697
}
87-
t |= nums[i];
8898
ans = Math.max(ans, i - j + 1);
99+
mask |= nums[i];
89100
}
90101
return ans;
91102
}
@@ -98,14 +109,13 @@ class Solution {
98109
class Solution {
99110
public:
100111
int longestNiceSubarray(vector<int>& nums) {
101-
int t = 0, j = 0;
102-
int ans = 0;
103-
for (int i = 0; i < nums.size(); ++i) {
104-
while (t & nums[i]) {
105-
t ^= nums[j++];
112+
int ans = 0, mask = 0;
113+
for (int i = 0, j = 0; i < nums.size(); ++i) {
114+
while (mask & nums[i]) {
115+
mask ^= nums[j++];
106116
}
107-
t |= nums[i];
108117
ans = max(ans, i - j + 1);
118+
mask |= nums[i];
109119
}
110120
return ans;
111121
}
@@ -115,32 +125,36 @@ public:
115125
### **Go**
116126
117127
```go
118-
func longestNiceSubarray(nums []int) int {
119-
t, j := 0, 0
120-
ans := 0
121-
for i, v := range nums {
122-
for (t & v) != 0 {
123-
t ^= nums[j]
124-
j++
128+
func longestNiceSubarray(nums []int) (ans int) {
129+
mask, j := 0, 0
130+
for i, x := range nums {
131+
for ; mask&x != 0; j++ {
132+
mask ^= nums[j]
125133
}
126-
t |= v
127-
ans = max(ans, i-j+1)
128-
}
129-
return ans
130-
}
131-
132-
func max(a, b int) int {
133-
if a > b {
134-
return a
134+
if k := i - j + 1; ans < k {
135+
ans = k
136+
}
137+
mask |= x
135138
}
136-
return b
139+
return
137140
}
138141
```
139142

140143
### **TypeScript**
141144

142145
```ts
143-
146+
function longestNiceSubarray(nums: number[]): number {
147+
let mask = 0;
148+
let ans = 0;
149+
for (let i = 0, j = 0; i < nums.length; ++i) {
150+
while ((mask & nums[i]) !== 0) {
151+
mask ^= nums[j++];
152+
}
153+
ans = Math.max(ans, i - j + 1);
154+
mask |= nums[i];
155+
}
156+
return ans;
157+
}
144158
```
145159

146160
### **...**

solution/2400-2499/2401.Longest Nice Subarray/README_EN.md

Lines changed: 37 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -51,13 +51,13 @@ It can be proven that no longer nice subarray can be obtained, so we return 3.</
5151
```python
5252
class Solution:
5353
def longestNiceSubarray(self, nums: List[int]) -> int:
54-
ans = j = t = 0
55-
for i, v in enumerate(nums):
56-
while t & v:
57-
t ^= nums[j]
54+
ans = j = mask = 0
55+
for i, x in enumerate(nums):
56+
while mask & x:
57+
mask ^= nums[j]
5858
j += 1
59-
t |= v
6059
ans = max(ans, i - j + 1)
60+
mask |= x
6161
return ans
6262
```
6363

@@ -66,14 +66,13 @@ class Solution:
6666
```java
6767
class Solution {
6868
public int longestNiceSubarray(int[] nums) {
69-
int j = 0, t = 0;
70-
int ans = 0;
71-
for (int i = 0; i < nums.length; ++i) {
72-
while ((t & nums[i]) != 0) {
73-
t ^= nums[j++];
69+
int ans = 0, mask = 0;
70+
for (int i = 0, j = 0; i < nums.length; ++i) {
71+
while ((mask & nums[i]) != 0) {
72+
mask ^= nums[j++];
7473
}
75-
t |= nums[i];
7674
ans = Math.max(ans, i - j + 1);
75+
mask |= nums[i];
7776
}
7877
return ans;
7978
}
@@ -86,14 +85,13 @@ class Solution {
8685
class Solution {
8786
public:
8887
int longestNiceSubarray(vector<int>& nums) {
89-
int t = 0, j = 0;
90-
int ans = 0;
91-
for (int i = 0; i < nums.size(); ++i) {
92-
while (t & nums[i]) {
93-
t ^= nums[j++];
88+
int ans = 0, mask = 0;
89+
for (int i = 0, j = 0; i < nums.size(); ++i) {
90+
while (mask & nums[i]) {
91+
mask ^= nums[j++];
9492
}
95-
t |= nums[i];
9693
ans = max(ans, i - j + 1);
94+
mask |= nums[i];
9795
}
9896
return ans;
9997
}
@@ -103,32 +101,36 @@ public:
103101
### **Go**
104102
105103
```go
106-
func longestNiceSubarray(nums []int) int {
107-
t, j := 0, 0
108-
ans := 0
109-
for i, v := range nums {
110-
for (t & v) != 0 {
111-
t ^= nums[j]
112-
j++
104+
func longestNiceSubarray(nums []int) (ans int) {
105+
mask, j := 0, 0
106+
for i, x := range nums {
107+
for ; mask&x != 0; j++ {
108+
mask ^= nums[j]
113109
}
114-
t |= v
115-
ans = max(ans, i-j+1)
116-
}
117-
return ans
118-
}
119-
120-
func max(a, b int) int {
121-
if a > b {
122-
return a
110+
if k := i - j + 1; ans < k {
111+
ans = k
112+
}
113+
mask |= x
123114
}
124-
return b
115+
return
125116
}
126117
```
127118

128119
### **TypeScript**
129120

130121
```ts
131-
122+
function longestNiceSubarray(nums: number[]): number {
123+
let mask = 0;
124+
let ans = 0;
125+
for (let i = 0, j = 0; i < nums.length; ++i) {
126+
while ((mask & nums[i]) !== 0) {
127+
mask ^= nums[j++];
128+
}
129+
ans = Math.max(ans, i - j + 1);
130+
mask |= nums[i];
131+
}
132+
return ans;
133+
}
132134
```
133135

134136
### **...**

solution/2400-2499/2401.Longest Nice Subarray/Solution.cpp

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
class Solution {
22
public:
33
int longestNiceSubarray(vector<int>& nums) {
4-
int t = 0, j = 0;
5-
int ans = 0;
6-
for (int i = 0; i < nums.size(); ++i) {
7-
while (t & nums[i]) {
8-
t ^= nums[j++];
4+
int ans = 0, mask = 0;
5+
for (int i = 0, j = 0; i < nums.size(); ++i) {
6+
while (mask & nums[i]) {
7+
mask ^= nums[j++];
98
}
10-
t |= nums[i];
119
ans = max(ans, i - j + 1);
10+
mask |= nums[i];
1211
}
1312
return ans;
1413
}
Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
1-
func longestNiceSubarray(nums []int) int {
2-
t, j := 0, 0
3-
ans := 0
4-
for i, v := range nums {
5-
for (t & v) != 0 {
6-
t ^= nums[j]
7-
j++
1+
func longestNiceSubarray(nums []int) (ans int) {
2+
mask, j := 0, 0
3+
for i, x := range nums {
4+
for ; mask&x != 0; j++ {
5+
mask ^= nums[j]
86
}
9-
t |= v
10-
ans = max(ans, i-j+1)
11-
}
12-
return ans
13-
}
14-
15-
func max(a, b int) int {
16-
if a > b {
17-
return a
7+
if k := i - j + 1; ans < k {
8+
ans = k
9+
}
10+
mask |= x
1811
}
19-
return b
12+
return
2013
}

solution/2400-2499/2401.Longest Nice Subarray/Solution.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
class Solution {
22
public int longestNiceSubarray(int[] nums) {
3-
int j = 0, t = 0;
4-
int ans = 0;
5-
for (int i = 0; i < nums.length; ++i) {
6-
while ((t & nums[i]) != 0) {
7-
t ^= nums[j++];
3+
int ans = 0, mask = 0;
4+
for (int i = 0, j = 0; i < nums.length; ++i) {
5+
while ((mask & nums[i]) != 0) {
6+
mask ^= nums[j++];
87
}
9-
t |= nums[i];
108
ans = Math.max(ans, i - j + 1);
9+
mask |= nums[i];
1110
}
1211
return ans;
1312
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
class Solution:
22
def longestNiceSubarray(self, nums: List[int]) -> int:
3-
ans = j = t = 0
4-
for i, v in enumerate(nums):
5-
while t & v:
6-
t ^= nums[j]
3+
ans = j = mask = 0
4+
for i, x in enumerate(nums):
5+
while mask & x:
6+
mask ^= nums[j]
77
j += 1
8-
t |= v
98
ans = max(ans, i - j + 1)
9+
mask |= x
1010
return ans
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
function longestNiceSubarray(nums: number[]): number {
2+
let mask = 0;
3+
let ans = 0;
4+
for (let i = 0, j = 0; i < nums.length; ++i) {
5+
while ((mask & nums[i]) !== 0) {
6+
mask ^= nums[j++];
7+
}
8+
ans = Math.max(ans, i - j + 1);
9+
mask |= nums[i];
10+
}
11+
return ans;
12+
}

0 commit comments

Comments
 (0)