leecode 力扣刷题 #704 二分查找 (简单)

本文通过一道LeetCode题目#704介绍了二分查找法在有序数组中搜索目标值的高效解决方案。作者分享了二分查找的思路和代码实现,对比了一次遍历和二分查找的时间效率,并提供了详细的解题过程。文章强调了二分查找在解决此类问题上的优势,并鼓励读者尝试使用这种方法来提升算法能力。
摘要由CSDN通过智能技术生成

好久没有刷leetcode了,选一题简单的试试手(^-^)V

#704:

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。
在这里插入图片描述
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-search

在这里插入图片描述

解题思路:

一个一个找,然后发现超级无敌慢,放在最后被#起来的方法二了,没看清楚题目二分!二分!二分!还以为从list里一个一个找是常规操作。看了官方解释,自己试了一下,快好多我的妈呀!具体思路代码后面有#的备注,边看代码边看备注应该会比较好理解。简单来说就是以下规则:

1. list的头和尾分别叫left和right,对半切开叫mid。正常情况是left小于等于right,这个逻辑我们先定义清楚。
2. target在mid左边,则right=mid-1,继续对左边一半的list做砍半的动作,直到找到target。
3. target在mid右边,则left=mid+1,继续对右边一半的list做砍半的动作,直到找到target。
4. 如果2和3做到left都大于right了,说明以上逼近target的动作已经扫过了整个list,但没有扫到任何叫target的东西,它不存在,跳出回圈,直接给-1即可

写完发现我好像很啰嗦。emmm,我的脑子:简单说一下。我的手:不小心就打了4句话。

实测:

class Solution(object):
    def search(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: int
        """
        #方法一,二分法,确实比一个一个数来的快
        #left = 0
        #right = len(nums)-1
        left, right = 0, len(nums)-1#原来写一句真的比拆开两句写要快诶,一句是16ms,两句是28ms,差太多了吧!!!决定以后都这样写了

        while left <= right:#左边界小于等于右边界,逻辑正常
            mid = left + (right-left)/2#听说(left+right)/2会有问题,改成 2left/2 + (right-left)/2 比较好
            if nums[mid] == target:#很久没写python,差点忘记要==而不是=了
                return mid
            elif nums[mid] < target:#target在右,left往右移动一格,逐步逼近target
                left = mid + 1
            else:#target在左,right往左移动一格,逐步逼近target
                right = mid -1
        return -1#左边界大于右边界,逻辑不正常,逼近到走过头了都没有发现target,说不存在那个满足以上正常条的target,跳出回圈给-1即可
        
        #方法二:一个一个数,最慢的做法,5436ms,我的个老天鹅鹅鹅丫( ºΔº )
        #for i in range(len(nums)):
        #    if target in nums:
        #        if nums[i] == target:
        #            return i
        #    else:
        #        return -1

leecode实测截图:
在这里插入图片描述
在这里插入图片描述
太好了,可以去刷下一题了,我发现我真的是年纪越大越容易满足的一个人耶~ (▰˘◡˘▰)
希望看到这篇文章的小伙伴觉得有帮助,然后继续心情美美的一天~ d(`・∀・)b

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,关于力扣刷题C++常用操作,我可以给你一些常见的操作和技巧: 1. 使用 STL 容器和算法库:STL(Standard Template Library)是 C++ 标准库中的一个重要组成部,包含了许多常用的容器和算法。在力扣刷题中,使用 STL 可以大大提高代码的效率和可读性。例如,vector 可以用来存储动态数组,sort 可以用来排序等等。 2. 使用 auto 关键字:auto 关键字可以自动推导变量类型,可以减少代码量和提高可读性。例如,auto x = 1; 可以自动推导出 x 的类型为 int。 3. 使用 lambda 表达式:lambda 表达式是 C++11 中引入的一种匿名函数,可以方便地定义一些简单的函数对象。在力扣刷题中,使用 lambda 表达式可以简化代码,例如在 sort 函数中自定义比较函数。 4. 使用位运算:位运算是一种高效的运算方式,在力扣刷题中经常会用到。例如,左移运算符 << 可以用来计算 2 的幂次方,右移运算符 >> 可以用来除以 2 等等。 5. 使用递归:递归是一种常见的算法思想,在力扣刷题中也经常会用到。例如,二叉树的遍历、链表的反转等等。 6. 使用 STL 中的 priority_queue:priority_queue 是 STL 中的一个容器,可以用来实现堆。在力扣刷题中,使用 priority_queue 可以方便地实现一些需要维护最大值或最小值的算法。 7. 使用 STL 中的 unordered_map:unordered_map 是 STL 中的一个容器,可以用来实现哈希表。在力扣刷题中,使用 unordered_map 可以方便地实现一些需要快速查找和插入的算法。 8. 使用 STL 中的 string:string 是 STL 中的一个容器,可以用来存储字符串。在力扣刷题中,使用 string 可以方便地处理字符串相关的问题。 9. 注意边界条件:在力扣刷题中,边界条件往往是解决问题的关键。需要仔细析题目,考虑各种边界情况,避免出现错误。 10. 注意时间复杂度:在力扣刷题中,时间复杂度往往是评判代码优劣的重要指标。需要仔细算法的时间复杂度,并尽可能优化代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没意思不好玩我不玩了

您的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值