Skip to content

Commit fec5cdc

Browse files
authored
Merge pull request #18 from programmingbookclub/meetup-25
LeetCode 讀書會第 25 次聚會
2 parents d233deb + ff9f656 commit fec5cdc

File tree

1 file changed

+239
-0
lines changed

1 file changed

+239
-0
lines changed

紀錄/25 20210420.md

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,239 @@
1+
# LeetCode 讀書會第 25 次聚會 2021/04/20
2+
3+
leetcode 讀書會通知
4+
1. 項目: 第 25 次聚會
5+
2. 目的: 線上一起寫題目, 由有想法的人帶領, 先解題, 再看該題有趣的解法
6+
3. 時間: 4/20 (二) 20:00 ~ 21:00
7+
4. 地點: google meet 線上 (前 10 分鐘預備鏈接)
8+
5. 解題項目: [Binary search](https://leetcode.com/explore/learn/card/binary-search)
9+
6. 共筆: GitHub https://github.com/programmingbookclub/Leetcode-club
10+
7. 備註: 上次有稍微聊一下 658 題目,這次會重頭開始聊658,會強調如何理解題目、題目預期的答案,與如何實作。
11+
12+
last weak
13+
```swift=
14+
class Solution {
15+
func searchRange(_ nums: [Int], _ target: Int) -> [Int] {
16+
let m = { l, u -> Int in
17+
var (l, u) = (l, u)
18+
while true {
19+
if l >= u { return -1 }
20+
let m = mid(l, u), mnb = nums[m]
21+
if mnb == target { return m }
22+
if mnb < target { l = m + 1 }
23+
if mnb > target { u = m }
24+
}
25+
26+
}(0, nums.count)
27+
28+
if m == -1 { return [-1, -1] }
29+
30+
let l = { l, u -> Int in
31+
var (l, u) = (l, u)
32+
while true {
33+
if nums[l] == target { return l }
34+
let m = mid(l, u), mnb = nums[m]
35+
if mnb == target, nums[m - 1] != target { return m }
36+
if mnb == target { u = m - 1 }
37+
else { l = m + 1 }
38+
}
39+
40+
}(0, m - 1)
41+
42+
let u = { l, u -> Int in
43+
var (l, u) = (l, u)
44+
while true {
45+
if nums[u] == target { return u }
46+
let m = mid(l, u), mnb = nums[m]
47+
if mnb == target, nums[m + 1] != target { return m }
48+
if mnb == target { l = m + 1 }
49+
else { u = m - 1 }
50+
}
51+
52+
}(m + 1, nums.count - 1)
53+
54+
return [l, u]
55+
}
56+
}
57+
58+
func mid(_ s: Int, _ b: Int) -> Int {
59+
(b - s) / 2 + s
60+
}
61+
62+
```
63+
64+
* MEDIUM 658 Find K Closest Elements https://leetcode.com/problems/find-k-closest-elements
65+
66+
```typescript
67+
// `Search for a Range` in TypeScript by iteration and resursion mixed
68+
// Time Complexity: O(log n), Space Complexity: O(1)
69+
// by louis222220
70+
function searchRange(nums: number[], target: number): number[] {
71+
let left = 0;
72+
let right = nums.length - 1;
73+
let middle: number;
74+
while (left <= right) {
75+
middle = getMiddleIndex(left, right);
76+
if (nums[middle] === target) {
77+
const leftTargerBoundary = searchLeftTargetBoundary(left, middle);
78+
const rightTargetBoundary = searchRightTargetBoundary(middle, right);
79+
80+
const result = [leftTargerBoundary, rightTargetBoundary];
81+
return result;
82+
}
83+
else if (nums[middle] > target) right = middle - 1;
84+
else left = middle + 1;
85+
}
86+
return [-1, -1];
87+
88+
// helper functions
89+
function getMiddleIndex(left: number, right: number) {
90+
if (left > right) return -1;
91+
if (left === right) return left;
92+
return left + Math.floor((right - left) / 2);
93+
}
94+
/** Search left boundary of target by Recursion */
95+
function searchLeftTargetBoundary(left: number, right: number) {
96+
if (nums[left] === target) return left;
97+
const middle = getMiddleIndex(left, right);
98+
99+
if (nums[middle] === target && nums[middle - 1] !== target) return middle;
100+
else if (nums[middle] !== target) return searchLeftTargetBoundary(middle + 1, right);
101+
else return searchLeftTargetBoundary(left, middle - 1);
102+
}
103+
/** Search right boundary of target by Recursion */
104+
function searchRightTargetBoundary(left: number, right: number) {
105+
if (nums[right] === target) return right;
106+
const middle = getMiddleIndex(left, right);
107+
108+
if (nums[middle] === target && nums[middle + 1] !== target) return middle;
109+
else if (nums[middle] !== target) return searchRightTargetBoundary(left, middle - 1);
110+
else return searchRightTargetBoundary(middle + 1, right);
111+
}
112+
};
113+
```
114+
115+
* MEDIUM 162 Find Peak Element https://leetcode.com/problems/find-peak-element
116+
117+
* Template Analysis
118+
119+
* Article Binary Search Template Analysis
120+
121+
* 🔓 EASY 270 Closest Binary Search Tree Value https://leetcode.com/problems/closest-binary-search-tree-value
122+
123+
```typescript=
124+
/**
125+
嘗試找到 arr[m],符合 (x - arr[m]) > (arr[m + k] - x),m 即為解的第一個元素,
126+
而尋找的過程就可以使用二元搜尋法
127+
Inspired by [Clean O(logN) solution in Python](https://leetcode.com/explore/learn/card/binary-search/135/template-iii/945/discuss/133604/Clean-O(logN)-solution-in-Python)
128+
Time Complexity: O( log(n) + k ), Space Complexity: O(k)
129+
k ==> result's first element in original array's index
130+
[i ..< i+k] --> 是 result Array
131+
*/
132+
function findClosestElements(arr: number[], k: number, x: number): number[] {
133+
if (k === arr.length) return arr;
134+
let left = 0;
135+
let right = arr.length - k;
136+
let middle = left + Math.floor((right - left) / 2);
137+
while(left < right) {
138+
/** middle 與 x 的差 */
139+
const middleToX = x - arr[middle];
140+
/** x 與 middleK 的差,middleK 為 middle + k 的位置 */
141+
const xToMiddleK = arr[middle + k] - x;
142+
143+
// arr[middle] 離 x 比較遠,繼續檢查 middle 的右側
144+
if (middleToX > xToMiddleK) left = middle + 1;
145+
// arr[middle] 離 x 比較近,繼續檢查 middle 的左側
146+
else right = middle;
147+
middle = left + Math.floor((right - left) / 2);
148+
}
149+
return arr.slice(middle, middle + k);
150+
};
151+
```
152+
153+
* 🔓 MEDIUM 702 Search in a Sorted Array of Unknown Size https://leetcode.com/problems/search-in-a-sorted-array-of-unknown-size
154+
155+
* Conclusion
156+
157+
* MEDIUM 50 Pow(x, n) https://leetcode.com/problems/powx-n
158+
159+
```typescript
160+
/** Recursion in TS by Louis. It's inspired by [the discussion](https://leetcode.com/explore/learn/card/binary-search/137/conclusion/982/discuss/19546/Short-and-easy-to-understand-solution) */
161+
function myPow(x: number, n: number): number {
162+
if (n == 0) return 1;
163+
if (n < 0) return myPow(1 / x, -n);
164+
if (n % 2 == 0) return myPow(x * x, n / 2);
165+
else return x * myPow(x * x, Math.floor(n / 2));
166+
};
167+
168+
```typescript
169+
/** Iteration in TS by Louis */
170+
function myPow(x: number, n: number): number {
171+
let base = x;
172+
let exponent = n;
173+
let constant = 1;
174+
175+
if (n === 0) return 1;
176+
177+
if (n < 0) {
178+
base = 1 / x;
179+
exponent = -n;
180+
}
181+
182+
while (exponent > 1) {
183+
if (exponent % 2 == 0) {
184+
base = base * base;
185+
exponent = exponent / 2;
186+
}
187+
else {
188+
constant = constant * base;
189+
base = base * base;
190+
exponent = Math.floor(exponent / 2);
191+
}
192+
}
193+
194+
return constant * base;
195+
}
196+
197+
198+
* EASY 367 Valid Perfect Square https://leetcode.com/problems/valid-perfect-square
199+
200+
```typescript
201+
/** Iteration for `Valid Perfect Square` in TS by Louis*/
202+
function isPerfectSquare(num: number): boolean {
203+
if (num === 1) return true;
204+
205+
let lower = 2;
206+
let upper = Math.floor(num / 2);
207+
208+
while (lower <= upper) {
209+
const middle = lower + Math.floor((upper - lower) / 2);
210+
if (num === middle * middle) return true;
211+
else if (num > middle * middle) lower = middle + 1;
212+
else upper = middle - 1;
213+
}
214+
return false;
215+
};
216+
217+
* EASY 744 Find Smallest Letter Greater Than Target https://leetcode.com/problems/find-smallest-letter-greater-than-target
218+
219+
* More Practices
220+
221+
* MEDIUM 153 Find Minimum in Rotated Sorted Array https://leetcode.com/problems/find-minimum-in-rotated-sorted-array
222+
223+
* HARD 154 Find Minimum in Rotated Sorted Array II https://leetcode.com/problems/find-minimum-in-rotated-sorted-array-ii
224+
225+
* EASY 349 Intersection of Two Arrays https://leetcode.com/problems/intersection-of-two-arrays
226+
227+
* EASY 350 Intersection of Two Arrays II https://leetcode.com/problems/intersection-of-two-arrays-ii
228+
229+
* EASY 167 Two Sum II - Input array is sorted https://leetcode.com/problems/two-sum-ii-input-array-is-sorted
230+
231+
* More Practices II
232+
233+
* MEDIUM 287 Find the Duplicate Number https://leetcode.com/problems/find-the-duplicate-number
234+
235+
* HARD 4 Median of Two Sorted Arrays https://leetcode.com/problems/median-of-two-sorted-arrays
236+
237+
* HARD 719 Find K-th Smallest Pair Distance https://leetcode.com/problems/find-k-th-smallest-pair-distance
238+
239+
* HARD 410 Split Array Largest Sum https://leetcode.com/problems/split-array-largest-sum

0 commit comments

Comments
 (0)