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 3eef026

Browse files
committed
Update binary_search.md
数组交集
1 parent 9cb5c89 commit 3eef026

File tree

1 file changed

+141
-6
lines changed

1 file changed

+141
-6
lines changed

‎basic_algorithm/binary_search.md‎

Lines changed: 141 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -155,18 +155,119 @@ class Solution:
155155
```
156156

157157

158+
### [寻找比目标字母大的最小字母](https://leetcode.cn/problems/find-smallest-letter-greater-than-target/)
159+
> 给你一个排序后的字符列表 letters ,列表中只包含小写英文字母。另给出一个目标字母 target,请你寻找在这一有序列表里比目标字母大的最小字母。
160+
>
161+
> 在比较时,字母是依序循环出现的。举个例子:
162+
> - 如果目标字母 target = 'z' 并且字符列表为 letters = ['a', 'b'],则答案返回 'a'
163+
**Python版本**
164+
```python
165+
class Solution:
166+
def nextGreatestLetter(self, letters: List[str], target: str) -> str:
167+
if letters[0] > target or target >= letters[-1]: return letters[0]
168+
left, right = 0, len(letters) - 1
169+
while left + 1 < right:
170+
mid = left + (right - left) // 2
171+
if letters[mid] <= target: left = mid #尽量往左移动
172+
else: right = mid
173+
174+
if letters[left] > target: return letters[left]
175+
return letters[right]
176+
```
177+
178+
### [两个数组的交集](https://leetcode.cn/problems/intersection-of-two-arrays/)
179+
> 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
180+
**Python版本**
181+
```python
182+
class Solution:
183+
def intersection(self, nums1: List[int], nums2: List[int]) -> List[int]:
184+
nums1, nums2 = sorted(set(nums1)), sorted(set(nums2))
185+
if len(nums1) <= len(nums2): return inter(nums1, nums2)
186+
else: return inter(nums2, nums1)
187+
188+
def inter(nums1, nums2):
189+
res = list()
190+
for i, num in enumerate(nums1):
191+
if find(num, nums2): res.append(num)
192+
return res
193+
194+
def find(num, nums):
195+
left, right = 0, len(nums) - 1
196+
while left + 1 < right:
197+
mid = left + (right - left) // 2
198+
if nums[mid] == num: return True
199+
elif nums[mid] < num: left = mid
200+
else: right = mid
201+
if nums[left] != num and nums[right] != num: return False
202+
return True
203+
```
204+
205+
### [两个数组的交集II](https://leetcode.cn/problems/intersection-of-two-arrays-ii/)
206+
> 给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。
207+
208+
// 思路:需要考虑找到的数量
209+
210+
**Python版本**
211+
```python
212+
class Solution:
213+
def intersect(self, nums1: List[int], nums2: List[int]) -> List[int]:
214+
nums1, nums2 = sorted(nums1), sorted(nums2)
215+
if len(nums1) <= len(nums2): return inter(nums1, nums2)
216+
else: return inter(nums2, nums1)
217+
218+
219+
def inter(nums1, nums2):
220+
res = list()
221+
i = 0
222+
while i < len(nums1):
223+
num = nums1[i]
224+
cnt1 = 1
225+
while i+1 < len(nums1) and nums1[i+1] == num:
226+
cnt1 += 1
227+
i += 1
228+
cnt2 = findNum(num, nums2)
229+
res.extend([num] * min(cnt1, cnt2))
230+
i += 1
231+
return res
232+
233+
def findNum(num, nums):
234+
left = find(num, nums, find_left=True)
235+
if left == -1: return 0
236+
right = find(num, nums, find_left=False)
237+
return right - left + 1
238+
239+
def find(num, nums, find_left):
240+
left, right = 0, len(nums) - 1
241+
while left + 1 < right:
242+
mid = left + (right - left) // 2
243+
if nums[mid] < num: left = mid
244+
elif nums[mid] > num: right = mid
245+
else:
246+
if find_left: right = mid
247+
else: left = mid
248+
if nums[left] != num and nums[right] != num: return -1
249+
if find_left:
250+
if nums[left] == num: return left
251+
else: return right
252+
else:
253+
if nums[right] == num: return right
254+
else: return left
255+
256+
```
257+
158258

159259
### [猜数字大小](https://leetcode.cn/problems/guess-number-higher-or-lower/)
160260
> 猜数字游戏的规则如下:
261+
>
161262
> 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。
263+
>
162264
> 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。
265+
>
163266
> 你可以通过调用一个预先定义好的接口 int guess(int num) 来获取猜测结果,返回值一共有 3 种可能的情况(-1,1 或 0):
164-
165-
> -1:我选出的数字比你猜的数字小 pick < num
166-
167-
> 1:我选出的数字比你猜的数字大 pick > num
168-
169-
> 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
267+
>
268+
> - -1:我选出的数字比你猜的数字小 pick < num
269+
> - 1:我选出的数字比你猜的数字大 pick > num
270+
> - 0:我选出的数字和你猜的数字一样。恭喜!你猜对了!pick == num
170271
171272
**Python版本**
172273
```python
@@ -451,6 +552,21 @@ class Solution:
451552
452553
return min(nums[left], nums[right])
453554
```
555+
**版本二**
556+
```python
557+
class Solution:
558+
def findMin(self, nums: List[int]) -> int:
559+
if nums[0] < nums[-1]: return nums[0] ## 说明顺序没变
560+
left, right = 0, len(nums) - 1
561+
while left + 1 < right:
562+
mid = left + (right - left) // 2
563+
if nums[mid] > nums[left]:
564+
left = mid
565+
else:
566+
right = mid
567+
568+
return min(nums[left], nums[right])
569+
```
454570

455571
**C++版本**
456572
```cpp
@@ -477,6 +593,25 @@ int findMin(vector<int>& nums) {
477593
> 请找出其中最小的元素。(包含重复元素)
478594
479595
// 思路:跳过重复元素,mid值和end值比较,分为两种情况进行处理
596+
597+
**Python版本**
598+
```python
599+
class Solution:
600+
def findMin(self, nums: List[int]) -> int:
601+
if nums[0] < nums[-1]: return nums[0]
602+
left, right = 0, len(nums) - 1
603+
while left + 1 < right:
604+
while left < right and nums[left] == nums[left+1]: left = left + 1
605+
while left < right and nums[right] == nums[right-1]: right = right - 1
606+
mid = left + (right - left) // 2
607+
if nums[mid] >= nums[right]: left = mid
608+
else: right = mid
609+
610+
return min(nums[left], nums[right])
611+
```
612+
613+
614+
**C++版本**
480615
```cpp
481616
int findMin(vector<int>& nums) {
482617
if(nums.empty()) return 0;

0 commit comments

Comments
(0)

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