Skip to content

Commit 5b47413

Browse files
authored
feat: add solutions to lc problem: No.2209 (doocs#2537)
1 parent 81248ea commit 5b47413

File tree

9 files changed

+151
-158
lines changed

9 files changed

+151
-158
lines changed

solution/2200-2299/2209.Minimum White Tiles After Covering With Carpets/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@
5757

5858
### 方法一:记忆化搜索
5959

60-
设计函数 $dfs(i, j)$ 表示从下标 $i$ 开始,使用 $j$ 条地毯,最少有多少个白色砖块没有被覆盖。答案即为 $dfs(0, numCarpets)$。
60+
我们设计一个函数 $dfs(i, j)$ 表示从下标 $i$ 开始,使用 $j$ 条地毯,最少有多少个白色砖块没有被覆盖。答案即为 $dfs(0, numCarpets)$。
6161

6262
对于下标 $i$,我们分情况讨论:
6363

solution/2200-2299/2210.Count Hills and Valleys in an Array/README.md

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -56,21 +56,33 @@
5656

5757
## 解法
5858

59-
### 方法一
59+
### 方法一:遍历
60+
61+
我们初始化一个指针 $j$ 指向下标 $0$ 的位置,然后在 $[1, n-1]$ 的范围内遍历数组。对于每一个位置 $i$:
62+
63+
- 如果 $nums[i] = nums[i+1]$,则跳过。
64+
- 否则,如果 $nums[i]$ 大于 $nums[j]$ 且 $nums[i]$ 大于 $nums[i+1]$,则 $i$ 是一个峰;如果 $nums[i]$ 小于 $nums[j]$ 且 $nums[i]$ 小于 $nums[i+1]$,则 $i$ 是一个谷。
65+
- 然后,我们将 $j$ 更新为 $i$,继续遍历。
66+
67+
遍历结束后,我们就可以得到峰和谷的数量。
68+
69+
时间复杂度 $O(n)$,其中 $n$ 是数组的长度。空间复杂度 $O(1)$。
6070

6171
<!-- tabs:start -->
6272

6373
```python
6474
class Solution:
6575
def countHillValley(self, nums: List[int]) -> int:
66-
arr = [nums[0]]
67-
for v in nums[1:]:
68-
if v != arr[-1]:
69-
arr.append(v)
70-
return sum(
71-
(arr[i] < arr[i - 1]) == (arr[i] < arr[i + 1])
72-
for i in range(1, len(arr) - 1)
73-
)
76+
ans = j = 0
77+
for i in range(1, len(nums) - 1):
78+
if nums[i] == nums[i + 1]:
79+
continue
80+
if nums[i] > nums[j] and nums[i] > nums[i + 1]:
81+
ans += 1
82+
if nums[i] < nums[j] and nums[i] < nums[i + 1]:
83+
ans += 1
84+
j = i
85+
return ans
7486
```
7587

7688
```java
@@ -100,9 +112,15 @@ public:
100112
int countHillValley(vector<int>& nums) {
101113
int ans = 0;
102114
for (int i = 1, j = 0; i < nums.size() - 1; ++i) {
103-
if (nums[i] == nums[i + 1]) continue;
104-
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) ++ans;
105-
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) ++ans;
115+
if (nums[i] == nums[i + 1]) {
116+
continue;
117+
}
118+
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) {
119+
++ans;
120+
}
121+
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) {
122+
++ans;
123+
}
106124
j = i;
107125
}
108126
return ans;
@@ -131,67 +149,47 @@ func countHillValley(nums []int) int {
131149

132150
```ts
133151
function countHillValley(nums: number[]): number {
134-
const n = nums.length;
135-
let res = 0;
136-
let prev = nums[0];
137-
for (let i = 1; i < n - 1; i++) {
138-
const num = nums[i];
139-
const next = nums[i + 1];
140-
if (num == next) {
152+
let ans = 0;
153+
for (let i = 1, j = 0; i < nums.length - 1; ++i) {
154+
if (nums[i] === nums[i + 1]) {
141155
continue;
142156
}
143-
if ((num > prev && num > next) || (num < prev && num < next)) {
144-
res += 1;
157+
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) {
158+
ans++;
159+
}
160+
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) {
161+
ans++;
145162
}
146-
prev = num;
163+
j = i;
147164
}
148-
return res;
165+
return ans;
149166
}
150167
```
151168

152169
```rust
153170
impl Solution {
154171
pub fn count_hill_valley(nums: Vec<i32>) -> i32 {
155-
let n = nums.len();
156-
let mut res = 0;
157-
let mut prev = nums[0];
158-
for i in 1..n - 1 {
159-
let num = nums[i];
160-
let next = nums[i + 1];
161-
if num == next {
172+
let mut ans = 0;
173+
let mut j = 0;
174+
175+
for i in 1..nums.len() - 1 {
176+
if nums[i] == nums[i + 1] {
162177
continue;
163178
}
164-
if (num > prev && num > next) || (num < prev && num < next) {
165-
res += 1;
179+
if nums[i] > nums[j] && nums[i] > nums[i + 1] {
180+
ans += 1;
181+
}
182+
if nums[i] < nums[j] && nums[i] < nums[i + 1] {
183+
ans += 1;
166184
}
167-
prev = num;
185+
j = i;
168186
}
169-
res
187+
188+
ans
170189
}
171190
}
172191
```
173192

174193
<!-- tabs:end -->
175194

176-
### 方法二
177-
178-
<!-- tabs:start -->
179-
180-
```python
181-
class Solution:
182-
def countHillValley(self, nums: List[int]) -> int:
183-
ans = j = 0
184-
for i in range(1, len(nums) - 1):
185-
if nums[i] == nums[i + 1]:
186-
continue
187-
if nums[i] > nums[j] and nums[i] > nums[i + 1]:
188-
ans += 1
189-
if nums[i] < nums[j] and nums[i] < nums[i + 1]:
190-
ans += 1
191-
j = i
192-
return ans
193-
```
194-
195-
<!-- tabs:end -->
196-
197195
<!-- end -->

solution/2200-2299/2210.Count Hills and Valleys in an Array/README_EN.md

Lines changed: 53 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -53,21 +53,33 @@ There are 0 hills and valleys so we return 0.
5353

5454
## Solutions
5555

56-
### Solution 1
56+
### Solution 1: Traversal
57+
58+
We initialize a pointer $j$ to point to the position with index $0$, and then traverse the array in the range $[1, n-1]$. For each position $i$:
59+
60+
- If $nums[i] = nums[i+1]$, then skip.
61+
- Otherwise, if $nums[i]$ is greater than $nums[j]$ and $nums[i]$ is greater than $nums[i+1]$, then $i$ is a peak; if $nums[i]$ is less than $nums[j]$ and $nums[i]$ is less than $nums[i+1]$, then $i$ is a valley.
62+
- Then, we update $j$ to $i$ and continue to traverse.
63+
64+
After the traversal, we can get the number of peaks and valleys.
65+
66+
The time complexity is $O(n)$, where $n$ is the length of the array. The space complexity is $O(1)$.
5767

5868
<!-- tabs:start -->
5969

6070
```python
6171
class Solution:
6272
def countHillValley(self, nums: List[int]) -> int:
63-
arr = [nums[0]]
64-
for v in nums[1:]:
65-
if v != arr[-1]:
66-
arr.append(v)
67-
return sum(
68-
(arr[i] < arr[i - 1]) == (arr[i] < arr[i + 1])
69-
for i in range(1, len(arr) - 1)
70-
)
73+
ans = j = 0
74+
for i in range(1, len(nums) - 1):
75+
if nums[i] == nums[i + 1]:
76+
continue
77+
if nums[i] > nums[j] and nums[i] > nums[i + 1]:
78+
ans += 1
79+
if nums[i] < nums[j] and nums[i] < nums[i + 1]:
80+
ans += 1
81+
j = i
82+
return ans
7183
```
7284

7385
```java
@@ -97,9 +109,15 @@ public:
97109
int countHillValley(vector<int>& nums) {
98110
int ans = 0;
99111
for (int i = 1, j = 0; i < nums.size() - 1; ++i) {
100-
if (nums[i] == nums[i + 1]) continue;
101-
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) ++ans;
102-
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) ++ans;
112+
if (nums[i] == nums[i + 1]) {
113+
continue;
114+
}
115+
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) {
116+
++ans;
117+
}
118+
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) {
119+
++ans;
120+
}
103121
j = i;
104122
}
105123
return ans;
@@ -128,67 +146,47 @@ func countHillValley(nums []int) int {
128146

129147
```ts
130148
function countHillValley(nums: number[]): number {
131-
const n = nums.length;
132-
let res = 0;
133-
let prev = nums[0];
134-
for (let i = 1; i < n - 1; i++) {
135-
const num = nums[i];
136-
const next = nums[i + 1];
137-
if (num == next) {
149+
let ans = 0;
150+
for (let i = 1, j = 0; i < nums.length - 1; ++i) {
151+
if (nums[i] === nums[i + 1]) {
138152
continue;
139153
}
140-
if ((num > prev && num > next) || (num < prev && num < next)) {
141-
res += 1;
154+
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) {
155+
ans++;
156+
}
157+
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) {
158+
ans++;
142159
}
143-
prev = num;
160+
j = i;
144161
}
145-
return res;
162+
return ans;
146163
}
147164
```
148165

149166
```rust
150167
impl Solution {
151168
pub fn count_hill_valley(nums: Vec<i32>) -> i32 {
152-
let n = nums.len();
153-
let mut res = 0;
154-
let mut prev = nums[0];
155-
for i in 1..n - 1 {
156-
let num = nums[i];
157-
let next = nums[i + 1];
158-
if num == next {
169+
let mut ans = 0;
170+
let mut j = 0;
171+
172+
for i in 1..nums.len() - 1 {
173+
if nums[i] == nums[i + 1] {
159174
continue;
160175
}
161-
if (num > prev && num > next) || (num < prev && num < next) {
162-
res += 1;
176+
if nums[i] > nums[j] && nums[i] > nums[i + 1] {
177+
ans += 1;
178+
}
179+
if nums[i] < nums[j] && nums[i] < nums[i + 1] {
180+
ans += 1;
163181
}
164-
prev = num;
182+
j = i;
165183
}
166-
res
184+
185+
ans
167186
}
168187
}
169188
```
170189

171190
<!-- tabs:end -->
172191

173-
### Solution 2
174-
175-
<!-- tabs:start -->
176-
177-
```python
178-
class Solution:
179-
def countHillValley(self, nums: List[int]) -> int:
180-
ans = j = 0
181-
for i in range(1, len(nums) - 1):
182-
if nums[i] == nums[i + 1]:
183-
continue
184-
if nums[i] > nums[j] and nums[i] > nums[i + 1]:
185-
ans += 1
186-
if nums[i] < nums[j] and nums[i] < nums[i + 1]:
187-
ans += 1
188-
j = i
189-
return ans
190-
```
191-
192-
<!-- tabs:end -->
193-
194192
<!-- end -->

solution/2200-2299/2210.Count Hills and Valleys in an Array/Solution.cpp

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ class Solution {
33
int countHillValley(vector<int>& nums) {
44
int ans = 0;
55
for (int i = 1, j = 0; i < nums.size() - 1; ++i) {
6-
if (nums[i] == nums[i + 1]) continue;
7-
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) ++ans;
8-
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) ++ans;
6+
if (nums[i] == nums[i + 1]) {
7+
continue;
8+
}
9+
if (nums[i] > nums[j] && nums[i] > nums[i + 1]) {
10+
++ans;
11+
}
12+
if (nums[i] < nums[j] && nums[i] < nums[i + 1]) {
13+
++ans;
14+
}
915
j = i;
1016
}
1117
return ans;

solution/2200-2299/2210.Count Hills and Valleys in an Array/Solution.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
class Solution {
22
public int countHillValley(int[] nums) {
3-
int ans = 0;
4-
for (int i = 1, j = 0; i < nums.length - 1; ++i) {
3+
int ans = 0, j = 0;
4+
for (int i = 1; i < nums.length - 1; ++i) {
55
if (nums[i] == nums[i + 1]) {
66
continue;
77
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
class Solution:
22
def countHillValley(self, nums: List[int]) -> int:
3-
arr = [nums[0]]
4-
for v in nums[1:]:
5-
if v != arr[-1]:
6-
arr.append(v)
7-
return sum(
8-
(arr[i] < arr[i - 1]) == (arr[i] < arr[i + 1])
9-
for i in range(1, len(arr) - 1)
10-
)
3+
ans = j = 0
4+
for i in range(1, len(nums) - 1):
5+
if nums[i] == nums[i + 1]:
6+
continue
7+
if nums[i] > nums[j] and nums[i] > nums[i + 1]:
8+
ans += 1
9+
if nums[i] < nums[j] and nums[i] < nums[i + 1]:
10+
ans += 1
11+
j = i
12+
return ans
Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,21 @@
11
impl Solution {
22
pub fn count_hill_valley(nums: Vec<i32>) -> i32 {
3-
let n = nums.len();
4-
let mut res = 0;
5-
let mut prev = nums[0];
6-
for i in 1..n - 1 {
7-
let num = nums[i];
8-
let next = nums[i + 1];
9-
if num == next {
3+
let mut ans = 0;
4+
let mut j = 0;
5+
6+
for i in 1..nums.len() - 1 {
7+
if nums[i] == nums[i + 1] {
108
continue;
119
}
12-
if (num > prev && num > next) || (num < prev && num < next) {
13-
res += 1;
10+
if nums[i] > nums[j] && nums[i] > nums[i + 1] {
11+
ans += 1;
1412
}
15-
prev = num;
13+
if nums[i] < nums[j] && nums[i] < nums[i + 1] {
14+
ans += 1;
15+
}
16+
j = i;
1617
}
17-
res
18+
19+
ans
1820
}
1921
}

0 commit comments

Comments
 (0)