Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 5b47413

Browse files
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)

AltStyle によって変換されたページ (->オリジナル) /