代码随想录训练营第一天Leetcode704.二分查找,27移除元素

本文介绍了如何使用Python解决LeetCode上的二分查找(704题)和移除元素(27题)问题,包括二分查找的思路调整、时间复杂度分析以及采用快慢指针的原地移除元素方法。
摘要由CSDN通过智能技术生成
本人所学习的语言为Python 下面所展示的代码也为Python 
第一题:704.二分查找 

题目链接704. 二分查找 - 力扣(LeetCode)

做题时的参考:手把手带你撕出正确的二分法 | 二分查找法 | 二分搜索法 | LeetCode:704. 二分查找_哔哩哔哩_bilibiliz

做题时的思路:首先我们设置一个left与一个right 将下标0为left 下标为len(nums)-1 即数组的最右端为right 形成一个两边都是闭区间 即[left,right] 既然是二分法 那么就要取中间值  我最开始直接将middle等于(right-left)//2 但是我发现当left大于0时 取到的middle不对 于是将其改成(right-left)//2+left 这样即使left大于0(即target在middle的右边)再一次取值的时候也能正确的取到middle 

遇到的困难:在通过上述思路写出代码后 在力扣上运行 发现代码超出时间限制 我意识到代码出现了一些问题 于是参考了视频中的思路 修改了代码 即如果middle不等于target的时候 left或者right会等于middle-1或者middle+1 因为middle不等于target 所以下标为middle的元素不会等于target 要让left或者right比middle左/右移动一个下标 便可以解决问题  但是遇到了一些target不在nums数组里面的情况 这时候就需要在while循环之前检测target是不是在nums里面 如果不是则返回-1

时间复杂度O(logn)空间复杂度O(1)

下面为实现的代码

left=0
right=len(nums)-1
middle=(right-left)//2+left
if target not in nums:
    return -1
while(left<=right):
    if nums[middle]==target:
        return middle
    if nums[middle]<target
        left=middle+1
    if nums[middle]>target:
        right=middle-1

第二题:27移除元素

题目链接:27. 移除元素 - 力扣(LeetCode)

参考资料:数组中移除元素并不容易! | LeetCode:27. 移除元素_哔哩哔哩_bilibili

做题思路:这道题需要原地移除元素 让数组中等于val的元素原地移除 于是我们采用快慢双指针

让一个指针来遍历数组 另外一个指针来交换元素 让数组中等于val的元素都排到不等于val元素的后面就可以解决问题

以下是代码的实现:

p=0#这个为慢指针
for i in range(len(nums)):#i为遍历数组的快指针
    if nums[i]!=val:
        nums[p]=nums[i]
        p+=1
    return p

举个例子 比如val为2 nums为1,3,2,2,3

i=0 遍历到1的时候 p也为0 相同 i+=1 p+=1 

i=1的时候 一样

i等于2的时候 2=val 所以p不动 i+=1 

到了i等于4的时候 3!=val p这时候为2 与i不同 对应的元素交换位置

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值