从零开始的力扣(第二十五天)~
1.找到 K 个最接近的元素
给定一个排序好的数组,两个整数 k 和 x,从数组中找到最靠近 x(两数之差最小)的 k 个数。返回的结果必须要是按升序排好的。如果有两个数与 x 的差值一样,优先选择数值较小的那个数。
示例 1:
输入: [1,2,3,4,5], k=4, x=3
输出: [1,2,3,4]
示例 2:
输入: [1,2,3,4,5], k=4, x=-1
输出: [1,2,3,4]
说明:
k 的值为正数,且总是小于给定排序数组的长度。
数组不为空,且长度不超过 104
数组里的每个元素与 x 的绝对值不超过 104
更新(2017/9/19):
这个参数 arr 已经被改变为一个整数数组(而不是整数列表)。 请重新加载代码定义以获取最新更改。
—————————————————————————————————————————
此题着实没有看懂题目,后来才弄懂;先二分找到x在数组中对应位置,或者如果没有的话,找到应该插入的那个位置 l, 然后定义两个指针start=l-1,end=l,依次看arr[start] 和 arr[end]哪个与x接近就把其加入到结果列表,然后k =k-1 , 当k为0表示结束
class Solution(object):
def findClosestElements(self, arr, k, x):
"""
:type arr: List[int]
:type k: int
:type x: int
:rtype: List[int]
"""
n = len(arr)
first = 0
last = n - 1
while first <= last:
mid = (first + last) // 2
if arr[mid] >= x:
last = mid - 1
else:
first = mid + 1
start = first - 1
end = first
res = []
while k > 0:
if start >= 0 and end <= n - 1:
if abs(arr[start] - x) <= abs(arr[end] - x):
res.insert(0, arr[start])
start -= 1
else:
res.append(arr[end])
end += 1
elif start >= 0:
res.insert(0, arr[start])
start -= 1
elif end <= n - 1:
res.append(arr[end])
end += 1
k -= 1
return res
另一种解法先限定长度,再在内部限定绝对值
class Solution(object):
def findClosestElements(self, arr, k, x):
"""
:type arr: List[int]
:type k: int
:type x: int
:rtype: List[int]
"""
n = len(arr)
first = 0
last = n - 1
while last - first + 1 > k:
q = abs(arr[first] - x)
w = abs(arr[last] - x)
if w >= q:
last -= 1
elif w < q:
first += 1
return arr[first:last + 1]
2.Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。
示例 1:
输入: 2.00000, 10
输出: 1024.00000
示例 2:
输入: 2.10000, 3
输出: 9.26100
示例 3:
输入: 2.00000, -2
输出: 0.25000
解释: 2-2 = 1/22 = 1/4 = 0.25
说明:
-100.0 < x < 100.0
n 是 32 位有符号整数,其数值范围是 [−231, 231 − 1] 。
—————————————————————————————————————————
不使用pow函数与**方法,使用二分递归法
class Solution:
def myPow(self, x: float, n: int) -> float:
if n == 0:
return 1
if n == 1:
return x
t = self.myPow(x, abs(n) // 2)
if n % 2 == 0:
t = t * t
else:
t = t * t * x
return t if n > 0 else 1.0 / t
ps.击败了这么少是因为我后来尝试了一下直接用 ** 直接击败99%?
3.有效的完全平方数
给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 False。
说明:不要使用任何内置的库函数,如 sqrt。
示例 1:
输入:16
输出:True
示例 2:
输入:14
输出:False
—————————————————————————————————————————
直接二分法
class Solution:
def isPerfectSquare(self, num: int) -> bool:
first = 0
last = num
while first <= last:
mid = (first + last) // 2
if mid ** 2 == num:
return True
elif mid ** 2 > num:
last = mid - 1
else:
first = mid + 1
return False
4.寻找比目标字母大的最小字母
给定一个只包含小写字母的有序数组letters 和一个目标字母 target,寻找有序数组里面比目标字母大的最小字母。
数组里字母的顺序是循环的。举个例子,如果目标字母target = ‘z’ 并且有序数组为 letters = [‘a’, ‘b’],则答案返回 ‘a’。
示例:
输入:
letters = [“c”, “f”, “j”]
target = “a”
输出: “c”
输入:
letters = [“c”, “f”, “j”]
target = “c”
输出: “f”
输入:
letters = [“c”, “f”, “j”]
target = “d”
输出: “f”
输入:
letters = [“c”, “f”, “j”]
target = “g”
输出: “j”
输入:
letters = [“c”, “f”, “j”]
target = “j”
输出: “c”
输入:
letters = [“c”, “f”, “j”]
target = “k”
输出: “c”
注:
letters长度范围在[2, 10000]区间内。
letters 仅由小写字母组成,最少包含两个不同的字母。
目标字母target 是一个小写字母。
—————————————————————————————————————————
找到与target相等或第一个大于target的字母,再进行筛选
class Solution:
def nextGreatestLetter(self, letters: List[str], target: str) -> str:
n = len(letters)
first = 0
last = n - 1
while first <= last:
mid = (first + last) // 2
if letters[mid] == target:
while mid + 1 < n:
if letters[mid + 1] == letters[mid]:
mid += 1
else:
return letters[mid + 1]
return letters[0]
elif letters[mid] < target:
first = mid + 1
else:
last = mid - 1
return letters[first] if first < n else letters[0]
以上就是今日经验!