[leetcode] Python(25)--找到 K 个最接近的元素(658)、Pow(x, n)(50)、有效的完全平方数(367)、寻找比目标字母大的最小字母(744)

从零开始的力扣(第二十五天)~

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]

以上就是今日经验!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值