【算法】二分查找(一)朴素二分

目录

一、题目介绍

二、朴素二分

1.原理

二段性

时间复杂度(logn](https://blog.csdn.net/2401_86112610/article/details/152011659?spm=1011.2124.3001.6209 ")")

2.模板

四、提交代码


一、题目介绍

704. 二分查找 - 力扣(LeetCode)

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

你必须编写一个具有 O(log n) 时间复杂度的算法。

示例 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]之间。

二、朴素二分

1.原理

二段性

二段性 一次算可排一边 每次在中间 固定算排二分之一

  • 暴力 是 纯用算来排 ,一次算 就只排此个
  • 优化 是 增有判来排 ,一次算 有额外多个
时间复杂度(logn)

算x次剩 未算排 最差直到最后剩1个后算排完


2.模板

int left = 0, right = nums.length - 1;

while(left <= right)

int mid = left + (right + left) / 2;

if(二段性排掉左边) left = mid + 1;

else if(二段性排掉右边) right = mid - 1;

else return;

}


四、提交代码

java 复制代码
public int search(int[] nums, int target) {
    int left = 0, right = nums.length - 1;
    while(left <= right) {
        //int mid = (left + right) / 2; 如果两个大数相加 就会和溢出算数范围,所以相加时得一方是确保小数
        int mid = left + (right - left) / 2; // 一方小数求中点(算术和为mid 比right小 都没有溢出)
        if(nums[mid] > target) right = mid - 1;
        else if(nums[mid] < target) left = mid + 1;
        else return mid;
    }
    return -1;
}

相关推荐
寻星探路11 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
你撅嘴真丑13 小时前
第九章-数字三角形
算法
曹牧13 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
uesowys13 小时前
Apache Spark算法开发指导-One-vs-Rest classifier
人工智能·算法·spark
ValhallaCoder13 小时前
hot100-二叉树I
数据结构·python·算法·二叉树
执笔论英雄13 小时前
【大模型学习cuda】入们第一个例子-向量和
学习
董董灿是个攻城狮13 小时前
AI 视觉连载1:像素
算法
wdfk_prog13 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
爬山算法14 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate