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

目录

一、题目介绍

二、朴素二分

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;
}

相关推荐
Yolanda941 天前
【编程学习】复盘经典 VB OOP 示例:推翻旧认知,重学面向对象
java·面向对象
Y敲键盘的地方1 天前
第9章 工具调用循环——Agent的行动闭环
java·服务器·前端
x_xbx1 天前
LeetCode:739. 每日温度
算法·leetcode·职场和发展
专注写bug1 天前
Java线程池——ThreadLocal上下文污染问题
java
武子康1 天前
Java-09 深入浅出 MyBatis 注解开发详解:从 CRUD 到复杂关系映射
java·后端·spring
Amctwd1 天前
【后端】多个后端系统,如何共用一套登录状态?单点登录详解
java
库奇噜啦呼1 天前
【iOS】源码学习-类的加载
学习·ios·cocoa
Engineer邓祥浩1 天前
宏观认知(1):AI 是什么——吴恩达《AI for Everyone》Week1 学习笔记
人工智能·笔记·学习
用户298698530141 天前
Java 进阶:在 Word 文档中动态增删页面
java·后端
likerhood1 天前
Java 集合框架入门:List、Set、Queue 与 Map
java·开发语言·list