Skip to content

Commit 5774816

Browse files
authored
feat: add solutions to lc problems: No.0162,0163 (#1771)
* No.0162.Find Peak Element * No.0163.Missing Ranges
1 parent 2abe01e commit 5774816

File tree

10 files changed

+274
-248
lines changed

10 files changed

+274
-248
lines changed

solution/0100-0199/0162.Find Peak Element/README.md

+36-29
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,15 @@
4646

4747
<!-- 这里可写通用的实现逻辑 -->
4848

49-
二分查找。
49+
**方法一:二分查找**
50+
51+
我们定义二分查找的左边界 $left=0$,右边界 $right=n-1$,其中 $n$ 是数组的长度。在每一步二分查找中,我们找到当前区间的中间元素 $mid$,然后比较 $mid$ 与其右边元素 $mid+1$ 的值:
52+
53+
- 如果 $mid$ 的值大于 $mid+1$ 的值,则左侧存在峰值元素,我们将右边界 $right$ 更新为 $mid$;
54+
- 否则,右侧存在峰值元素,我们将左边界 $left$ 更新为 $mid+1$。
55+
- 最后,当左边界 $left$ 与右边界 $right$ 相等时,我们就找到了数组的峰值元素。
56+
57+
时间复杂度 $O(\log n)$,其中 $n$ 是数组 $nums$ 的长度。每一步二分查找可以将搜索区间减少一半,因此时间复杂度为 $O(\log n)$。空间复杂度 $O(1)$。
5058

5159
<!-- tabs:start -->
5260

@@ -88,22 +96,24 @@ class Solution {
8896
}
8997
```
9098

91-
### **TypeScript**
99+
### **C++**
92100

93-
```ts
94-
function findPeakElement(nums: number[]): number {
95-
let left = 0,
96-
right = nums.length - 1;
97-
while (left < right) {
98-
let mid: number = (left + right) >> 1;
99-
if (nums[mid] <= nums[mid + 1]) {
100-
left = mid + 1;
101-
} else {
102-
right = mid;
101+
```cpp
102+
class Solution {
103+
public:
104+
int findPeakElement(vector<int>& nums) {
105+
int left = 0, right = nums.size() - 1;
106+
while (left < right) {
107+
int mid = left + right >> 1;
108+
if (nums[mid] > nums[mid + 1]) {
109+
right = mid;
110+
} else {
111+
left = mid + 1;
112+
}
103113
}
114+
return left;
104115
}
105-
return left;
106-
}
116+
};
107117
```
108118
109119
### **Go**
@@ -123,24 +133,21 @@ func findPeakElement(nums []int) int {
123133
}
124134
```
125135

126-
### **C++**
136+
### **TypeScript**
127137

128-
```cpp
129-
class Solution {
130-
public:
131-
int findPeakElement(vector<int>& nums) {
132-
int left = 0, right = nums.size() - 1;
133-
while (left < right) {
134-
int mid = left + right >> 1;
135-
if (nums[mid] > nums[mid + 1]) {
136-
right = mid;
137-
} else {
138-
left = mid + 1;
139-
}
138+
```ts
139+
function findPeakElement(nums: number[]): number {
140+
let [left, right] = [0, nums.length - 1];
141+
while (left < right) {
142+
const mid = (left + right) >> 1;
143+
if (nums[mid] > nums[mid + 1]) {
144+
right = mid;
145+
} else {
146+
left = mid + 1;
140147
}
141-
return left;
142148
}
143-
};
149+
return left;
150+
}
144151
```
145152

146153
### **...**

solution/0100-0199/0162.Find Peak Element/README_EN.md

+36-29
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,15 @@
3838

3939
## Solutions
4040

41-
Binary search.
41+
**Solution 1: Binary Search**
42+
43+
We define the left boundary of binary search as $left=0$ and the right boundary as $right=n-1$, where $n$ is the length of the array. In each step of binary search, we find the middle element $mid$ of the current interval, and compare the values of $mid$ and its right neighbor $mid+1$:
44+
45+
- If the value of $mid$ is greater than the value of $mid+1$, there exists a peak element on the left side, and we update the right boundary $right$ to $mid$.
46+
- Otherwise, there exists a peak element on the right side, and we update the left boundary $left$ to $mid+1$.
47+
- Finally, when the left boundary $left$ is equal to the right boundary $right$, we have found the peak element of the array.
48+
49+
The time complexity is $O(\log n)$, where $n$ is the length of the array $nums$. Each step of binary search can reduce the search interval by half, so the time complexity is $O(\log n)$. The space complexity is $O(1)$.
4250

4351
<!-- tabs:start -->
4452

@@ -76,22 +84,24 @@ class Solution {
7684
}
7785
```
7886

79-
### **TypeScript**
87+
### **C++**
8088

81-
```ts
82-
function findPeakElement(nums: number[]): number {
83-
let left = 0,
84-
right = nums.length - 1;
85-
while (left < right) {
86-
let mid: number = (left + right) >> 1;
87-
if (nums[mid] <= nums[mid + 1]) {
88-
left = mid + 1;
89-
} else {
90-
right = mid;
89+
```cpp
90+
class Solution {
91+
public:
92+
int findPeakElement(vector<int>& nums) {
93+
int left = 0, right = nums.size() - 1;
94+
while (left < right) {
95+
int mid = left + right >> 1;
96+
if (nums[mid] > nums[mid + 1]) {
97+
right = mid;
98+
} else {
99+
left = mid + 1;
100+
}
91101
}
102+
return left;
92103
}
93-
return left;
94-
}
104+
};
95105
```
96106
97107
### **Go**
@@ -111,24 +121,21 @@ func findPeakElement(nums []int) int {
111121
}
112122
```
113123

114-
### **C++**
124+
### **TypeScript**
115125

116-
```cpp
117-
class Solution {
118-
public:
119-
int findPeakElement(vector<int>& nums) {
120-
int left = 0, right = nums.size() - 1;
121-
while (left < right) {
122-
int mid = left + right >> 1;
123-
if (nums[mid] > nums[mid + 1]) {
124-
right = mid;
125-
} else {
126-
left = mid + 1;
127-
}
126+
```ts
127+
function findPeakElement(nums: number[]): number {
128+
let [left, right] = [0, nums.length - 1];
129+
while (left < right) {
130+
const mid = (left + right) >> 1;
131+
if (nums[mid] > nums[mid + 1]) {
132+
right = mid;
133+
} else {
134+
left = mid + 1;
128135
}
129-
return left;
130136
}
131-
};
137+
return left;
138+
}
132139
```
133140

134141
### **...**

solution/0100-0199/0162.Find Peak Element/Solution.ts

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
function findPeakElement(nums: number[]): number {
2-
let left = 0,
3-
right = nums.length - 1;
2+
let [left, right] = [0, nums.length - 1];
43
while (left < right) {
5-
let mid: number = (left + right) >> 1;
6-
if (nums[mid] <= nums[mid + 1]) {
7-
left = mid + 1;
8-
} else {
4+
const mid = (left + right) >> 1;
5+
if (nums[mid] > nums[mid + 1]) {
96
right = mid;
7+
} else {
8+
left = mid + 1;
109
}
1110
}
1211
return left;

solution/0100-0199/0163.Missing Ranges/README.md

+55-51
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@
4848

4949
**方法一:模拟**
5050

51-
按照题意模拟即可
51+
我们直接按照题意模拟即可
5252

53-
时间复杂度 $O(n)$,忽略答案的空间消耗,空间复杂度 $O(1)$。其中 $n$ 为数组 `nums` 的长度。
53+
时间复杂度 $O(n)$,其中 $n$ 为数组 $nums$ 的长度。忽略答案的空间消耗,空间复杂度 $O(1)$
5454

5555
<!-- tabs:start -->
5656

@@ -60,21 +60,20 @@
6060

6161
```python
6262
class Solution:
63-
def findMissingRanges(self, nums: List[int], lower: int, upper: int) -> List[str]:
64-
def f(a, b):
65-
return str(a) if a == b else f'{a}->{b}'
66-
63+
def findMissingRanges(
64+
self, nums: List[int], lower: int, upper: int
65+
) -> List[List[int]]:
6766
n = len(nums)
6867
if n == 0:
69-
return [f(lower, upper)]
68+
return [[lower, upper]]
7069
ans = []
7170
if nums[0] > lower:
72-
ans.append(f(lower, nums[0] - 1))
71+
ans.append([lower, nums[0] - 1])
7372
for a, b in pairwise(nums):
7473
if b - a > 1:
75-
ans.append(f(a + 1, b - 1))
74+
ans.append([a + 1, b - 1])
7675
if nums[-1] < upper:
77-
ans.append(f(nums[-1] + 1, upper))
76+
ans.append([nums[-1] + 1, upper])
7877
return ans
7978
```
8079

@@ -84,31 +83,25 @@ class Solution:
8483

8584
```java
8685
class Solution {
87-
public List<String> findMissingRanges(int[] nums, int lower, int upper) {
86+
public List<List<Integer>> findMissingRanges(int[] nums, int lower, int upper) {
8887
int n = nums.length;
89-
List<String> ans = new ArrayList<>();
9088
if (n == 0) {
91-
ans.add(f(lower, upper));
92-
return ans;
89+
return List.of(List.of(lower, upper));
9390
}
91+
List<List<Integer>> ans = new ArrayList<>();
9492
if (nums[0] > lower) {
95-
ans.add(f(lower, nums[0] - 1));
93+
ans.add(List.of(lower, nums[0] - 1));
9694
}
9795
for (int i = 1; i < n; ++i) {
98-
int a = nums[i - 1], b = nums[i];
99-
if (b - a > 1) {
100-
ans.add(f(a + 1, b - 1));
96+
if (nums[i] - nums[i - 1] > 1) {
97+
ans.add(List.of(nums[i - 1] + 1, nums[i] - 1));
10198
}
10299
}
103100
if (nums[n - 1] < upper) {
104-
ans.add(f(nums[n - 1] + 1, upper));
101+
ans.add(List.of(nums[n - 1] + 1, upper));
105102
}
106103
return ans;
107104
}
108-
109-
private String f(int a, int b) {
110-
return a == b ? a + "" : a + "->" + b;
111-
}
112105
}
113106
```
114107

@@ -117,27 +110,22 @@ class Solution {
117110
```cpp
118111
class Solution {
119112
public:
120-
vector<string> findMissingRanges(vector<int>& nums, int lower, int upper) {
121-
auto f = [](int a, int b) {
122-
return a == b ? to_string(a) : to_string(a) + "->" + to_string(b);
123-
};
113+
vector<vector<int>> findMissingRanges(vector<int>& nums, int lower, int upper) {
124114
int n = nums.size();
125-
vector<string> ans;
126115
if (n == 0) {
127-
ans.emplace_back(f(lower, upper));
128-
return ans;
116+
return {{lower, upper}};
129117
}
118+
vector<vector<int>> ans;
130119
if (nums[0] > lower) {
131-
ans.emplace_back(f(lower, nums[0] - 1));
120+
ans.push_back({lower, nums[0] - 1});
132121
}
133-
for (int i = 1; i < n; ++i) {
134-
int a = nums[i - 1], b = nums[i];
135-
if (b - a > 1) {
136-
ans.emplace_back(f(a + 1, b - 1));
122+
for (int i = 1; i < nums.size(); ++i) {
123+
if (nums[i] - nums[i - 1] > 1) {
124+
ans.push_back({nums[i - 1] + 1, nums[i] - 1});
137125
}
138126
}
139127
if (nums[n - 1] < upper) {
140-
ans.emplace_back(f(nums[n - 1] + 1, upper));
128+
ans.push_back({nums[n - 1] + 1, upper});
141129
}
142130
return ans;
143131
}
@@ -147,34 +135,50 @@ public:
147135
### **Go**
148136
149137
```go
150-
func findMissingRanges(nums []int, lower int, upper int) (ans []string) {
151-
f := func(a, b int) string {
152-
if a == b {
153-
return strconv.Itoa(a)
154-
}
155-
return strconv.Itoa(a) + "->" + strconv.Itoa(b)
156-
}
138+
func findMissingRanges(nums []int, lower int, upper int) (ans [][]int) {
157139
n := len(nums)
158140
if n == 0 {
159-
ans = append(ans, f(lower, upper))
160-
return
141+
return [][]int{{lower, upper}}
161142
}
162143
if nums[0] > lower {
163-
ans = append(ans, f(lower, nums[0]-1))
144+
ans = append(ans, []int{lower, nums[0] - 1})
164145
}
165-
for i := 1; i < n; i++ {
166-
a, b := nums[i-1], nums[i]
167-
if b-a > 1 {
168-
ans = append(ans, f(a+1, b-1))
146+
for i, b := range nums[1:] {
147+
if a := nums[i]; b-a > 1 {
148+
ans = append(ans, []int{a + 1, b - 1})
169149
}
170150
}
171151
if nums[n-1] < upper {
172-
ans = append(ans, f(nums[n-1]+1, upper))
152+
ans = append(ans, []int{nums[n-1] + 1, upper})
173153
}
174154
return
175155
}
176156
```
177157

158+
### **TypeScript**
159+
160+
```ts
161+
function findMissingRanges(nums: number[], lower: number, upper: number): number[][] {
162+
const n = nums.length;
163+
if (n === 0) {
164+
return [[lower, upper]];
165+
}
166+
const ans: number[][] = [];
167+
if (nums[0] > lower) {
168+
ans.push([lower, nums[0] - 1]);
169+
}
170+
for (let i = 1; i < n; ++i) {
171+
if (nums[i] - nums[i - 1] > 1) {
172+
ans.push([nums[i - 1] + 1, nums[i] - 1]);
173+
}
174+
}
175+
if (nums[n - 1] < upper) {
176+
ans.push([nums[n - 1] + 1, upper]);
177+
}
178+
return ans;
179+
}
180+
```
181+
178182
### **...**
179183

180184
```

0 commit comments

Comments
 (0)