leetcode 二分查找day2

658. 找到 K 个最接近的元素658. 找到 K 个最接近的元素

思路:

1.已经排序好了,可以直接用双指针比较两端和要找的值的差距大小然后删除到只有k个元素为止,但是这题要二分查找,这样写很不给他面子,所以试试二分查找

2.二分法。
658. 找到 K 个最接近的元素

代码:

思路1

class Solution:
    def findClosestElements(self, arr: List[int], k: int, x: int) -> List[int]:
        n = len(arr)
        l, r = 0, n - 1
        while r - l + 1 > k:
            a, b = x - arr[l], arr[r] - x
            if a > b:
                l += 1
            else:
                r -= 1
        return arr[l:r + 1]

思路2

class Solution(object):
    def findClosestElements(self, arr, k, x):
        left = 0
        right = len(arr) - k
        while (left < right) :
            mid = left + (right - left) // 2
            if (x - arr[mid] > arr[mid + k] - x) :
                left = mid + 1
            else :
                right = mid
        return arr[left : left + k]

1894. 找到需要补充粉笔的学生编号

1894. 找到需要补充粉笔的学生编号 - 力扣(LeetCode) (leetcode-cn.com)

思路:

1.先找到最后一次循环的粉笔数量

2.然后按要求找最后一轮到谁截止

代码: 

class Solution:
    def chalkReplacer(self, chalk: List[int], k: int) -> int:
        k %= sum(chalk)
        # 得到最后一轮的情况
        for x, i in enumerate(chalk):
            if k >= i:
                k -= i
            else:
                return x

以上

坚持 共勉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值