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 5774816

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

Lines changed: 36 additions & 29 deletions
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‎

Lines changed: 36 additions & 29 deletions
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‎

Lines changed: 5 additions & 6 deletions
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‎

Lines changed: 55 additions & 51 deletions
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)

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