Re: [闲聊] 每日LeetCode

楼主: pandix (面包屌)   2022-09-29 10:45:51
※ 引述《Rushia (みけねこ的鼻屎)》之铭言:
: 658. Find K Closest Elements
: 说明:
: 给定一个排序好的阵列arr、一个数字k和一个数字x,我们需返回一个大小为k的列表,
: 其中的数字要是最接近x的数字,若数字一样接近则数字小的优先,返回的列表必须也是
: 排序好的。
: Example 1:
: Input: arr = [1,2,3,4,5], k = 4, x = 3
: Output: [1,2,3,4]
思路:
1.看到题目给 sorted array 直觉就是 binary search
可以O(log(n))搜到 x 能插入的位置 也就是 a[i] <= x <= a[i+1]
python 的 bisect.left 可以插到 a[i] < x <= a[i+1]
2.之后就比较 a[i] 和 a[i+1] 哪个离 x 比较近 然后后面就老招了
维护左界右界 左边离 x 比较近就往左推 反之往右推
3.不停比较直到右界-左界>k
Python code:
class Solution:
def findClosestElements(self, arr: List[int], k: int, x: int) ->
List[int]:
n = len(arr)
right = bisect_left(arr, x)
left = right - 1
while right-left <= k:
if right >= n:
left -= 1
elif left < 0:
right += 1
elif arr[right]-x >= x-arr[left]:
left -= 1
else:
right += 1
return arr[left+1:right]
时间复杂度O(log(n)+k)
作者: Ericz7000 (Ericz7000nolan)   2022-09-29 10:46:00
大师
作者: Rushia (みけねこ的鼻屎)   2022-09-29 10:48:00
大师
作者: soulgem (あたしって、ほんとバカ)   2022-09-29 10:56:00
那么如果停在框出来的区域比 k 小再往外看会有风险吗?
作者: wwndbk (黑人问号)   2022-09-29 10:57:00
大师
作者: Rushia (みけねこ的鼻屎)   2022-09-29 10:57:00
他有边界检查阿第一行和第二行
作者: JerryChungYC (JerryChung)   2022-09-29 12:24:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com