Skip to content

Commit 5d6b9e7

Browse files
authored
feat: add solutions to lc problems: No.0896~0898 (#2107)
* No.0896.Monotonic Array * No.0897.Increasing Order Search Tree * No.0898.Bitwise ORs of Subarray
1 parent 24e882c commit 5d6b9e7

21 files changed

+506
-375
lines changed

solution/0800-0899/0896.Monotonic Array/README.md

+47-66
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
否则遍历结束,说明是单调数组,返回 `true`
5959

60-
时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 为数组长度
60+
时间复杂度 $O(n)$,其中 $n$ 为数组长度。空间复杂度 $O(1)$。
6161

6262
<!-- tabs:start -->
6363

@@ -68,23 +68,9 @@
6868
```python
6969
class Solution:
7070
def isMonotonic(self, nums: List[int]) -> bool:
71-
isIncr = isDecr = False
72-
for i, v in enumerate(nums[1:]):
73-
if v < nums[i]:
74-
isIncr = True
75-
elif v > nums[i]:
76-
isDecr = True
77-
if isIncr and isDecr:
78-
return False
79-
return True
80-
```
81-
82-
```python
83-
class Solution:
84-
def isMonotonic(self, nums: List[int]) -> bool:
85-
incr = all(a <= b for a, b in pairwise(nums))
86-
decr = all(a >= b for a, b in pairwise(nums))
87-
return incr or decr
71+
asc = all(a <= b for a, b in pairwise(nums))
72+
desc = all(a >= b for a, b in pairwise(nums))
73+
return asc or desc
8874
```
8975

9076
### **Java**
@@ -94,14 +80,14 @@ class Solution:
9480
```java
9581
class Solution {
9682
public boolean isMonotonic(int[] nums) {
97-
boolean isIncr = false, isDecr = false;
83+
boolean asc = false, desc = false;
9884
for (int i = 1; i < nums.length; ++i) {
99-
if (nums[i] < nums[i - 1]) {
100-
isIncr = true;
101-
} else if (nums[i] > nums[i - 1]) {
102-
isDecr = true;
85+
if (nums[i - 1] < nums[i]) {
86+
asc = true;
87+
} else if (nums[i - 1] > nums[i]) {
88+
desc = true;
10389
}
104-
if (isIncr && isDecr) {
90+
if (asc && desc) {
10591
return false;
10692
}
10793
}
@@ -116,12 +102,16 @@ class Solution {
116102
class Solution {
117103
public:
118104
bool isMonotonic(vector<int>& nums) {
119-
bool isIncr = false;
120-
bool isDecr = false;
105+
bool asc = false, desc = false;
121106
for (int i = 1; i < nums.size(); ++i) {
122-
if (nums[i] < nums[i - 1]) isIncr = true;
123-
if (nums[i] > nums[i - 1]) isDecr = true;
124-
if (isIncr && isDecr) return false;
107+
if (nums[i - 1] < nums[i]) {
108+
asc = true;
109+
} else if (nums[i - 1] > nums[i]) {
110+
desc = true;
111+
}
112+
if (asc && desc) {
113+
return false;
114+
}
125115
}
126116
return true;
127117
}
@@ -132,14 +122,14 @@ public:
132122
133123
```go
134124
func isMonotonic(nums []int) bool {
135-
isIncr, isDecr := false, false
136-
for i, v := range nums[1:] {
137-
if v < nums[i] {
138-
isIncr = true
139-
} else if v > nums[i] {
140-
isDecr = true
125+
asc, desc := false, false
126+
for i, x := range nums[1:] {
127+
if nums[i] < x {
128+
asc = true
129+
} else if nums[i] > x {
130+
desc = true
141131
}
142-
if isIncr && isDecr {
132+
if asc && desc {
143133
return false
144134
}
145135
}
@@ -155,16 +145,14 @@ func isMonotonic(nums []int) bool {
155145
* @return {boolean}
156146
*/
157147
var isMonotonic = function (nums) {
158-
let isIncr = false;
159-
let isDecr = false;
148+
let [asc, desc] = [false, false];
160149
for (let i = 1; i < nums.length; ++i) {
161-
if (nums[i] < nums[i - 1]) {
162-
isIncr = true;
150+
if (nums[i - 1] < nums[i]) {
151+
asc = true;
152+
} else if (nums[i - 1] > nums[i]) {
153+
desc = true;
163154
}
164-
if (nums[i] > nums[i - 1]) {
165-
isDecr = true;
166-
}
167-
if (isIncr && isDecr) {
155+
if (asc && desc) {
168156
return false;
169157
}
170158
}
@@ -176,18 +164,14 @@ var isMonotonic = function (nums) {
176164

177165
```ts
178166
function isMonotonic(nums: number[]): boolean {
179-
const n = nums.length;
180-
let isOrder = false;
181-
let isDecs = false;
182-
for (let i = 1; i < n; i++) {
183-
const pre = nums[i - 1];
184-
const cur = nums[i];
185-
if (pre < cur) {
186-
isOrder = true;
187-
} else if (pre > cur) {
188-
isDecs = true;
167+
let [asc, desc] = [false, false];
168+
for (let i = 1; i < nums.length; ++i) {
169+
if (nums[i - 1] < nums[i]) {
170+
asc = true;
171+
} else if (nums[i - 1] > nums[i]) {
172+
desc = true;
189173
}
190-
if (isOrder && isDecs) {
174+
if (asc && desc) {
191175
return false;
192176
}
193177
}
@@ -200,18 +184,15 @@ function isMonotonic(nums: number[]): boolean {
200184
```rust
201185
impl Solution {
202186
pub fn is_monotonic(nums: Vec<i32>) -> bool {
203-
let n = nums.len();
204-
let mut is_order = false;
205-
let mut is_decs = false;
206-
for i in 1..n {
207-
let pre = nums[i - 1];
208-
let cur = nums[i];
209-
if pre < cur {
210-
is_order = true;
211-
} else if pre > cur {
212-
is_decs = true;
187+
let mut asc = false;
188+
let mut desc = false;
189+
for i in 1..nums.len() {
190+
if nums[i - 1] < nums[i] {
191+
asc = true;
192+
} else if nums[i - 1] > nums[i] {
193+
desc = true;
213194
}
214-
if is_order && is_decs {
195+
if asc && desc {
215196
return false;
216197
}
217198
}

solution/0800-0899/0896.Monotonic Array/README_EN.md

+54-65
Original file line numberDiff line numberDiff line change
@@ -42,45 +42,39 @@
4242

4343
## Solutions
4444

45+
**Solution 1: Single Traversal**
46+
47+
We traverse the array, and if an increasing or decreasing situation occurs, we record it. We then check whether both increasing and decreasing situations have occurred. If both have occurred, it means that the array is not monotonic, and we return `false`.
48+
49+
Otherwise, if we reach the end of the traversal, it means that the array is monotonic, and we return `true`.
50+
51+
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
52+
4553
<!-- tabs:start -->
4654

4755
### **Python3**
4856

4957
```python
5058
class Solution:
5159
def isMonotonic(self, nums: List[int]) -> bool:
52-
isIncr = isDecr = False
53-
for i, v in enumerate(nums[1:]):
54-
if v < nums[i]:
55-
isIncr = True
56-
elif v > nums[i]:
57-
isDecr = True
58-
if isIncr and isDecr:
59-
return False
60-
return True
61-
```
62-
63-
```python
64-
class Solution:
65-
def isMonotonic(self, nums: List[int]) -> bool:
66-
incr = all(a <= b for a, b in pairwise(nums))
67-
decr = all(a >= b for a, b in pairwise(nums))
68-
return incr or decr
60+
asc = all(a <= b for a, b in pairwise(nums))
61+
desc = all(a >= b for a, b in pairwise(nums))
62+
return asc or desc
6963
```
7064

7165
### **Java**
7266

7367
```java
7468
class Solution {
7569
public boolean isMonotonic(int[] nums) {
76-
boolean isIncr = false, isDecr = false;
70+
boolean asc = false, desc = false;
7771
for (int i = 1; i < nums.length; ++i) {
78-
if (nums[i] < nums[i - 1]) {
79-
isIncr = true;
80-
} else if (nums[i] > nums[i - 1]) {
81-
isDecr = true;
72+
if (nums[i - 1] < nums[i]) {
73+
asc = true;
74+
} else if (nums[i - 1] > nums[i]) {
75+
desc = true;
8276
}
83-
if (isIncr && isDecr) {
77+
if (asc && desc) {
8478
return false;
8579
}
8680
}
@@ -95,12 +89,16 @@ class Solution {
9589
class Solution {
9690
public:
9791
bool isMonotonic(vector<int>& nums) {
98-
bool isIncr = false;
99-
bool isDecr = false;
92+
bool asc = false, desc = false;
10093
for (int i = 1; i < nums.size(); ++i) {
101-
if (nums[i] < nums[i - 1]) isIncr = true;
102-
if (nums[i] > nums[i - 1]) isDecr = true;
103-
if (isIncr && isDecr) return false;
94+
if (nums[i - 1] < nums[i]) {
95+
asc = true;
96+
} else if (nums[i - 1] > nums[i]) {
97+
desc = true;
98+
}
99+
if (asc && desc) {
100+
return false;
101+
}
104102
}
105103
return true;
106104
}
@@ -111,14 +109,14 @@ public:
111109
112110
```go
113111
func isMonotonic(nums []int) bool {
114-
isIncr, isDecr := false, false
115-
for i, v := range nums[1:] {
116-
if v < nums[i] {
117-
isIncr = true
118-
} else if v > nums[i] {
119-
isDecr = true
112+
asc, desc := false, false
113+
for i, x := range nums[1:] {
114+
if nums[i] < x {
115+
asc = true
116+
} else if nums[i] > x {
117+
desc = true
120118
}
121-
if isIncr && isDecr {
119+
if asc && desc {
122120
return false
123121
}
124122
}
@@ -134,16 +132,14 @@ func isMonotonic(nums []int) bool {
134132
* @return {boolean}
135133
*/
136134
var isMonotonic = function (nums) {
137-
let isIncr = false;
138-
let isDecr = false;
135+
let [asc, desc] = [false, false];
139136
for (let i = 1; i < nums.length; ++i) {
140-
if (nums[i] < nums[i - 1]) {
141-
isIncr = true;
142-
}
143-
if (nums[i] > nums[i - 1]) {
144-
isDecr = true;
137+
if (nums[i - 1] < nums[i]) {
138+
asc = true;
139+
} else if (nums[i - 1] > nums[i]) {
140+
desc = true;
145141
}
146-
if (isIncr && isDecr) {
142+
if (asc && desc) {
147143
return false;
148144
}
149145
}
@@ -155,18 +151,14 @@ var isMonotonic = function (nums) {
155151

156152
```ts
157153
function isMonotonic(nums: number[]): boolean {
158-
const n = nums.length;
159-
let isOrder = false;
160-
let isDecs = false;
161-
for (let i = 1; i < n; i++) {
162-
const pre = nums[i - 1];
163-
const cur = nums[i];
164-
if (pre < cur) {
165-
isOrder = true;
166-
} else if (pre > cur) {
167-
isDecs = true;
154+
let [asc, desc] = [false, false];
155+
for (let i = 1; i < nums.length; ++i) {
156+
if (nums[i - 1] < nums[i]) {
157+
asc = true;
158+
} else if (nums[i - 1] > nums[i]) {
159+
desc = true;
168160
}
169-
if (isOrder && isDecs) {
161+
if (asc && desc) {
170162
return false;
171163
}
172164
}
@@ -179,18 +171,15 @@ function isMonotonic(nums: number[]): boolean {
179171
```rust
180172
impl Solution {
181173
pub fn is_monotonic(nums: Vec<i32>) -> bool {
182-
let n = nums.len();
183-
let mut is_order = false;
184-
let mut is_decs = false;
185-
for i in 1..n {
186-
let pre = nums[i - 1];
187-
let cur = nums[i];
188-
if pre < cur {
189-
is_order = true;
190-
} else if pre > cur {
191-
is_decs = true;
174+
let mut asc = false;
175+
let mut desc = false;
176+
for i in 1..nums.len() {
177+
if nums[i - 1] < nums[i] {
178+
asc = true;
179+
} else if nums[i - 1] > nums[i] {
180+
desc = true;
192181
}
193-
if is_order && is_decs {
182+
if asc && desc {
194183
return false;
195184
}
196185
}

solution/0800-0899/0896.Monotonic Array/Solution.cpp

+9-5
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
class Solution {
22
public:
33
bool isMonotonic(vector<int>& nums) {
4-
bool isIncr = false;
5-
bool isDecr = false;
4+
bool asc = false, desc = false;
65
for (int i = 1; i < nums.size(); ++i) {
7-
if (nums[i] < nums[i - 1]) isIncr = true;
8-
if (nums[i] > nums[i - 1]) isDecr = true;
9-
if (isIncr && isDecr) return false;
6+
if (nums[i - 1] < nums[i]) {
7+
asc = true;
8+
} else if (nums[i - 1] > nums[i]) {
9+
desc = true;
10+
}
11+
if (asc && desc) {
12+
return false;
13+
}
1014
}
1115
return true;
1216
}

0 commit comments

Comments
 (0)