数组理论基础


数组理论

  1. 数组是存放在连续内存空间上的相同类型数据集合
  2. 数组可以方便的通过下标索引的方式获取到下标下对应的数据
  3. 二维数组在内存的空间地址是连续

二分查找


LeetCode 704.二分查找

二分法使用前提:

  • 有序元素 + 无重复元素

区间的定义

区间的定义就是不变量。要在二分查找的过程中,保持不变量,就是在while寻找中每一次边界的处理都要坚持根据区间的定义来操作,这就是循环不变量规则

二分法的区间定义分为两种

  • 左闭右闭, [left,right]

1)while(left <= right) 要使用 <=,因为left==right是有意义的
2) if(nums[middle] > target)时,right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
class Solution {public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size() - 1; // 定义target在左闭右闭的区间里,[left, right]while (left <= right) { // 当left==right,区间[left, right]依然有效,所以用 <=int middle = left + ((right - left) / 2);// 防止溢出 等同于(left + right)/2if (nums[middle] > target) {right = middle - 1; // target 在左区间,所以[left, middle - 1]} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,所以[middle + 1, right]} else { // nums[middle] == targetreturn middle; // 数组中找到目标值,直接返回下标}}// 未找到目标值return -1;}
};
  • 左闭右开, [left,right)

1) while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
2) if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
class Solution {public:int search(vector<int>& nums, int target) {int left = 0;int right = nums.size(); // 定义target在左闭右开的区间里,即:[left, right)while (left < right) { // 因为left == right的时候,在[left, right)是无效的空间,所以使用 <int middle = left + ((right - left) >> 1);if (nums[middle] > target) {right = middle; // target 在左区间,在[left, middle)中} else if (nums[middle] < target) {left = middle + 1; // target 在右区间,在[middle + 1, right)中} else { // nums[middle] == targetreturn middle; // 数组中找到目标值,直接返回下标}}// 未找到目标值return -1;}
};

时间复杂度

在n个元素的数组中查找一个数,情况最遭时,需要(log2 n)步,所以二分查找的时间复杂度是O(log2 n)


相关题目:LeetCode二分查找

[LeetCode]704.二分查找及相关题目相关推荐

  1. Leetcode 704.二分查找 27.移除元素 代码随想录day1

    本系列目的在于跟练代码随想录,以及记录自己在数据结构与算法方面的一些学习 704.二分查找 其实之前自己在随便刷题的时候看过这道题目,就是一个纯新手的大状态,第一次听到二分查找这样的东西,然后跟着题解 ...

  2. Leetcode 704.二分查找

    传送门:力扣二分查找 #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> #include<vector> #includ ...

  3. [leetcode] 704.二分查找

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

  4. 代码随想录算法训练营第一天 | 数组理论基础,704. 二分查找,27. 移除元素

    今日学习的文章链接如下: 代码随想录 (programmercarl.com) 代码随想录 (programmercarl.com) 704. 二分查找 自己看到题目的第一想法 拿到题目首先想办法,一 ...

  5. LeetCode No.704 二分查找 No.27移除元素

    LeetCode No.704 二分查找 题目描述: 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target  ,写一个函数搜索 nums 中的 target,如果目标值存在 ...

  6. LeetCode题解:704.二分查找

    二分查找(easy) 更好的阅读体验应该是: 审题-思考 答题 整理-归纳 一.题目 LeetCode:704.二分查找 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 targe ...

  7. 代码随想录算法训练营第一天 | 704.二分查找、27.移除元素题目

    704.二分查找 题目链接:二分查找 思路: 1.从头开始遍历,首先如果不用二分查找法,最容易想到的就是直接暴力查找,时间复杂度为O(n)直接从头开始遍历一便就行.这样如果数据量庞大会运行时间较长. ...

  8. LeetCode Algorithm 704. 二分查找

    704. 二分查找 Ideas 这题想考察二分查找的来着. 对不起,真的对不起,作为Python爱好者,实在没忍住,就一行代码解决了. Code Python from typing import L ...

  9. Suzy找到实习了吗 Day 1 | 704. 二分查找、27. 移除元素

    Suzy找到实习了吗 | 704. 二分查找.27. 移除元素 Leetcode 704:二分搜索 收获 Divide and conquer Recursive relation Python 3 ...

最新文章

  1. 玩转python字体
  2. 整合swagger2生成Restful Api接口文档
  3. Mysql学习笔记【一、环境安装配置】
  4. 这些令人仰望的C++大咖,都是怎样炼成的?
  5. linux winrar 安装目录,WinRAR 5.61发布,提供Linux版本下载,附安装方法
  6. java在什么环境变量_Java-环境变量
  7. 探求数据仓库关键环节ETL的本质
  8. 计算机重启是什么原因,电脑自动重启是什么原因
  9. LeetCode刷题(29)
  10. python成长之路【第七篇】:面向对象
  11. python爬取高德poi数据_高德地图之python爬取POI数据及其边界经纬度
  12. 为什么是深度神经网络而不是宽度神经网络?增加神经网络的深度相比于增加宽度有哪些优点?
  13. U盘启动 WinPE系统维护工具 任意安装GHO/WIM/ESD系统映像 无广告专业版
  14. java oracle sqlldr,oracle sqlldr
  15. (贪心)洛谷P2887 [USACO07NOV]防晒霜Sunscreen
  16. Python实现机器学习二(实现多元线性回归)
  17. 总结蛋糕店如何制定产品策略
  18. 如何查看淘宝同款商品最低价?怎么查看最低成交价?
  19. 管理学入门书籍,德鲁克并不是最好的选择!
  20. 笔记本电流声解决方法

热门文章

  1. MySQL中的表锁行锁共享锁很难吗?看了本文就清楚了哦
  2. 数组--冒泡排序原理
  3. 对不起,我给大家丢人了!开发三年只拿到美团、京东、阿里三个大厂offer
  4. C++11新特性之 std::forward(完美转发)
  5. php计算十二星座的函数代码,php计算十二星座、十二生肖、天干地支的函数
  6. VueX的mutations、actions
  7. java高并发秒杀活动的各种简单实现
  8. 卷积码译码:硬判决维特比(Viterbi)译码
  9. 发动机逆模型 逆发动机模型 根据发动机模型MAP图数据,得到发动机逆模型
  10. sphider+scws