刷题第1天:leetcode704--数组元素查找--二分法查找算法

第一部分---数组的基础知识介绍:

**1.数组的定义:**数组是存放在连续内存空间上的相同数据类型的数据的集合;

2.数组可以通过下标索引的方式获取到下标对应的数据;

3.数组下标是从0开始的,数组的内存空间地址是连续的,正因为地址是连续的,所以在对数组进行删除或者增添相应元素的时候难免需要移动其它数组元素的位置;

4.数组的元素是不能删的,只能覆盖。

第二部分--二分查找法介绍

leetcode 704题:给定一个 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

提示:

  1. 你可以假设 nums 中的所有元素是不重复的。
  2. n 将在 [1, 10000]之间。
  3. nums 的每个元素都将在 [-9999, 9999]之间。

**题目分析:**本题的关键词为:有序数组;数组中无重复元素。这两者是使用二分法的前提条件。当然使用暴力解法进行遍历判别很容易做出来本题,但是计算复杂度比较高,所以不推荐。我们在此使用二分法,并采用左闭右闭的原则进行python代码编写。代码中共有3个需要更新的变量:left,right,middle。

python 复制代码
#二分法,左闭右闭原则.注意本代码需要在leetcode刷题环境下运行
class Sultion:
    def search(self, nums:List[int], target:int) -> int:
        left, right = 0, len(nums)-1  # 定义target在左闭右闭的区间里,[left, right]
        
        while left <= right:
            middle = left + (right -left) // 2  # 根据left和right的值计算更新middle

            if nums[middle] > target:
                right = middle -1 # target在左区间,所以[left, middle - 1]
            elif nums[middle] < target:
                left = middle + 1  # target在右区间,所以[middle + 1, right]
            else:
                return middle  # 数组中找到目标值,直接返回下标
        return -1  # 未找到目标值

时间复杂度:Olog(n)

空间复杂度:O(1)

总结:根据二分法适用的两个前提条件(有序数组,无重复元素)识别使用该方法的场景,使用左闭右闭原则书写代码。

相关推荐
宝贝儿好5 分钟前
【LLM】第三章:BERT讲解+情感分析案例
人工智能·深度学习·神经网络·算法·自然语言处理·bert
z小猫不吃鱼9 分钟前
06 权重幅值剪枝、剪枝后微调与稀疏网络训练:模型剪枝中的三个基本问题
网络·算法·剪枝
QiLinkOS19 分钟前
QiLink OS的失败数据共享平台的运作模式是否适用于所有行业?
android·开发语言·人工智能·算法·重构·开源
C++ 老炮儿的技术栈32 分钟前
MFC 自定义纯色居中文字进度条控件
c语言·数据库·c++·windows·算法·c·visual studio
researcher-Jiang33 分钟前
Manacher算法学习与应用
c++·学习·算法
码完就睡37 分钟前
数据结构——串的模式匹配算法(BF算法、KMP算法)
数据结构·算法
tachibana237 分钟前
hot100 排序链表(148)
java·数据结构·算法·leetcode·链表
林泽毅44 分钟前
Qwen3.5 DPO 模型对齐实战(pytrio训练版)
人工智能·python·算法
imuliuliang1 小时前
算法中的随机化思想及其复杂度收益评估的技术7
算法
不能跑的代码不是好代码1 小时前
二叉树从基础概念到LeetCode实战
算法·leetcode