首页 > 其他分享 >leetcode代码记录(二分查找

leetcode代码记录(二分查找

时间:2024-03-18 16:00:31浏览次数:21  
标签:二分 right target nums int middle 查找 leetcode left

目录

1. 题目:

在这里插入图片描述

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

示例 1:

输入: nums = [-1,0,3,5,9,12], target = 9
输出: 4
解释: 9 出现在 nums 中并且下标为 4

示例 2:

输入: nums = [-1,0,3,5,9,12], target = 2
输出: -1
解释: 2 不存在 nums 中因此返回 -1

2. 我的代码:

左闭右闭法

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left_i = 0
        right_i = len(nums) - 1

        while left_i <= right_i:
            middle_i = (left_i + right_i) // 2
            if nums[middle_i] > target:
                right_i = middle_i - 1
            elif nums[middle_i] < target:
                left_i = middle_i + 1
            else:
                return middle_i
        
        return -1

左闭右开法:

class Solution:
    def search(self, nums: List[int], target: int) -> int:
        left_i = 0
        right_i = len(nums)

        while left_i < right_i:
            middle_i = (left_i + right_i) // 2
            if nums[middle_i] > target:
                right_i = middle_i
            elif nums[middle_i] < target:
                left_i = middle_i + 1
            else:
                return middle_i
        
        return -1

二分法还是比较好理解的,就相当于左右指针,并且用中间值去检查是否符合目标值。如果大于目标值,则说明右指针可以向左边靠拢;如果小于目标值,则说明左指针可以向右边靠拢。

对于左闭右闭法,即[left_i, right_i],while里放的应当是left_i <= right_i,因为left_i == right_i时这个值也需要检查,也就是还剩下一个值需要检查。

对于左闭右开法,即[left_i, right_i),while里放的应当是left_i < right_i,因为left_i == right_i时这个值不需要检查,左闭右开时这个区间是空。还有一个细节就是,nums[middle_i] > target时right_i = middle_i而不是middle_i - 1,不能把这个点包含进去。

小结:

关注我给大家分享更多有趣的知识,以下是个人公众号,提供 ||代码兼职|| ||代码问题求解||
添加我的公众号即可:

标签:二分,right,target,nums,int,middle,查找,leetcode,left
From: https://blog.csdn.net/m0_72249799/article/details/136791650

相关文章

  • Python 查找PDF中的指定文本并高亮显示
    在处理大量PDF文档时,有时我们需要快速找到特定的文本信息。本文将提供以下三个Python示例来帮助你在PDF文件中快速查找并高亮指定的文本。查找并高亮PDF中所有的指定文本查找并高亮PDF某个区域内的指定文本使用正则表达式搜索指定文本并高亮 本文将用到国产第三方库-Spi......
  • 【LeetCode 310】最小高度树
    题目描述原题链接:LeetCode.310最小高度树解题思路最小高度树的叶子节点肯定是初始只有一条边的节点;广度优先遍历,逐批将当前叶子节点移除,再将移除后新的叶子节点入队;所有节点全部入队时,当前队列中剩余的最后一批"叶子节点"就是答案;坦白说这题的严格思路证明没想过,第......
  • [Java·算法·中等] LeetCode21. 合并两个有序链表
    人不走空                                          ......
  • 【LeetCode 2684】矩阵中移动的最大次数
    题目描述原题链接:2684矩阵中移动的最大次数解题思路每次只能向右侧的下一列紧挨着的三行严格大的格子移动;能移动到i列代表能移动i次,这取决于i-1列可到达的矩阵位置的状态,即可以整列递推相邻列是否可移动到达;两个方向递推的思路:三个(col+1)位置的状态可以逆推出一个(c......
  • 代码随想录算法训练营第十天|LeetCode 20.有效的括号、1047.删除字符串中的所有相邻重
    20.有效的括号题目链接:https://leetcode.cn/problems/valid-parentheses/description/解题思路:题目转化:三种类型的括号,需要做匹配匹配规则是:左右括号的类型要匹配、数量要一致,而且要按照顺序匹配例子是:“()”、“(){}[]”、“(([]))”条件转化:按照顺序匹配:......
  • 如何查找访问 Nginx 的前 10 个 IP?
    在管理和维护Web服务器时,了解谁正在访问您的网站是非常重要的。Nginx是一个流行的Web服务器,通过分析其访问日志,您可以了解访问者的来源、频率以及他们的行为。有时候,您可能希望查找访问量最高的IP地址,以便进一步分析或采取措施,比如加强安全性或优化性能。本文将详细......
  • 字符串匹配/查找字符串中子串存在次数/出现位置下标 问题----- {1.[find] 2.[substr]
    下文将介绍三种方法,求解问题类型:1.子串在主串中出现次数2.子串在主串中每次出现的下标位置以此题为例:题目链接:https://www.luogu.com.cn/problem/P8195解法一:kmp#include<iostream>#include<string>usingnamespacestd;constintN=1e6+10;intne[N];......
  • 3.二分搜索
    定义Step1:计算数据的中点索引值m=(i+j)/2向下取整。i为首元素索引,j为尾元素索引。Step2:判断nums[m]和target的大小关系,分为以下三种情况。当nums[m]<target时,说明target在区间中:i=m+1当nums[m]>target时,说明target在区间中:j=m-1当nums[m]......
  • 【c语言练习之二分查找】
    二分查找二分查找的前提二分查找必须是在一个整形的有序数组中实现二分查找的思想对于一个整形的有序数组,输入一个你想要查找的数key,将key与数组的中间元素mid作比较,使得数组被分成2部分,要查找的数key肯定在某一部分,这样就可以舍弃另一部分,在另一部分中继续用这种思......
  • Excel查找两列数据相同的元素
    =IF(ISERROR(MATCH(A1,$C$1:$C$5,0)),"",A1)//没找到返回空值,否则返回本身A1---单个数据$C$1:$C$5---数据堆在数据堆中查找是否有单个数据""---没有返回空白,此处可以修改为A1,A1---有返回本身,此处可以修改为空白----------------------------------------------------------......