代码随想录算法训练营第一天| 704. 二分查找、27. 移除元素

Leetcode 704 二分查找

思考过程:因为题名是二分查找,所以不必再思考解题方法,直接着手于代码实现

如下:

left, right = -1, len(nums)
while left < right-1:
    mid = (left+right)//2
    if nums[mid] > target:
        right = mid
    elif nums[mid] < target:
        left = mid
    else:
        return mid
return -1

 这种实现方法是我比较推荐的也是我个人常用的方法,因为它处理一些细节问题都是基于一个简单法则, 即“始终使左指针的左侧(包括它)皆为小于目标值的元素, 使右指针的右侧(包括它)皆为大于目标值的元素”, 所以让一些抽象的问题有了具体的解决逻辑

让我们试试用这种思想来解决问题:

nums = [-1, 0, 3, 5, 9, 2]  target = -1

1.  left, right 这两个指针应该初始化为多少

答: 假设left初始化为0, 此时他的左侧(包括它)就囊括了数组的第一个元素,依照我们上述的法则就意味着我们默认了第一个元素一定比target小,而事实是并不一定,所以不可取。稍作分析可知left应为-1, 同理可知right应为len(nums)

2.   while循环判断条件应取什么

答: 根据上述的法则可知,left的左侧(包括left)与right的右侧(包括right)不应有交集,否则我们便定义了既比target小又比target大的元素,所以left最大应为right-1,所以条件取为“left < right -1”

3.  left, right指针的赋值中,究竟是mid还是mid-1或mid+1

答: 还是基于上述的法则进行推理, left和right应分别始终指向小于target的元素, 和大于target的元素,而我们对于mid+1的元素和mid-1的元素大小并不了解,所以取mid

LeetCode 27 移除元素

思考过程: 理清题目逻辑后,可将要求抽象为将一个合适的元素放到一个合适的位置, 所以需要两个指针,一个指向合适的元素,一个指向合适的位置。回到本题来,合适的位置应定义为列表的末尾,即新列表不包含的区域,合适的元素应定义为,将要被删除的元素。让我们着手代码实现

如下:

left, right = 0, len(nums)
while left < right:
    if nums[left] == val:
        nums[left], nums[right-1] = nums[right-1], nums[left-1]
        right -= 1
    else:
        left += 1
return right

其中right初始化为len(nums)是为了兼容nums = [1], val = 1的特例

我的第一篇博客, 感谢阅读,与君共勉

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值