ch1_2 二分查找 C++
知识点
- 命名空间
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。
因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。
所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都放在名字空间std中。
namespace允许像类,对象,函数聚集在一个名字下。本质上讲namespace是对全局作用域的细分。
但这有会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的,所以就有了 < i o s t r e a m > <iostream> <iostream>和<iostream.h>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。
命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般都不加".h"。
using namespace std;
- 类对象的实例化
声明类的对象
Class1 Obj1; Obj1: 是类Class1的对象 , 类
- vector 数组的 初始化;
vector<int> data = {1,2, 3, 4, 5};
1. 二分查找的前提
leetcode 704 二分查找
- 给定数组是有序数组
- 数组中无重复元素(有重复元素时, 返回的下标不唯一)
- 根据右区间的开闭,写出两种不同的二分查找;
1.1 右区间关闭
根据右区间关闭这个特点 , [left, right ];
所以有如下两点:
- 因为右区间值,可以取到,所以有 while(left <= right): left == right 是有意义的;
- if (nums[middle] > target ): right = middle -1, 因为此时 nums[middle] 一定不是 target, 所有将右区间的下标位置移动到 middle -1;
#include <vector>
#include <iostream>
using namespace std;class Solution{public:int search(vector<int>& nums, int target ){int left = 0;int right = nums.size() - 1; //这里使用右区间关闭, 故右区间值取得到;while ( left <= right){ // 因为右区间取得到, 所以 <= 是有意义的;int middle = left + (right - left )/2 ;if (nums[middle] > target){ // 中间值大于目标值, 说明目标值在左侧, 则应该将 右区间往左移动;right = middle - 1 ; // 因为此时, nums[middle] 一定不是 target;} else if(nums[middle] < target){left = middle + 1;} else {return middle;}}return -1;}};int main(){// int arr[6] = {-1,0,3,5,9,12};vector<int> nums1 ={-1,0,3,5,9,12};int target = 12;Solution obj1;int middle = obj1.search(nums1, target);cout << middle << endl;
}
1.2 右区间开, 右端点取不到
根据右区间关闭这个特点 , [left, right );
有如下两点:
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- 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() ; // 注意,因为是右开区间, 右侧端点取不到;while (left < right){ // 因为右侧端点取不到, 所以是 取不到等号int middle = (left + right ) / 2;if (nums[middle] > target){right = middle; // 中间值 大于target, 说明区间往左移动, right 取值middle, 因为此时右端点是开区间;}else if (nums[middle] < target){left = middle + 1 ; // 因为 此时 nums[middle] 不是target, 且 left端点值可以取到, 所以 left = middle + 1}else{return middle;}}return -1;}};
ch1_2 二分查找 C++相关推荐
- 算法图解/二分查找/简单查找/选择排序/递归算法/快速排序算法/
大 O 表示法 大 O 表示法在讨论运行时间时,log 指的都是 log2 大 O 表示法指出了算法有多快,让你能够比较操作数,它指出了算法运行时间的增速,而并非以秒为单位的速度. 大 O 表示法指出 ...
- LeetCode简单题之二分查找
题目 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1. 示例 1: 输入: n ...
- 二分查找模板全面总结
二分查找 二分法的引入 情形1 1.X的平方根 2.搜索旋转排序数组 情形2 1.第一个错误的版本 2.寻找峰值 3.寻找旋转排序数组中的最小值 情形3 在排序数组中查找第一个和最后一个位置 当遇到查 ...
- 数据结构与算法(8-2)有序表查找(折半查找(二分查找)、插值查找)
目录 一.折半查找(二分查找) 二.插值查找 总代码 一.折半查找(二分查找) 原理:一次次折半,不断向着查找值的位置靠近 . 适用场景:有序(必须) 流程:开始时,min标志首,max标志尾,med ...
- 二分查找算法的一点改进
在计算机科学中,二分查找,是一种在有序数组中查找某一特定元素的搜索算法.这种搜索算法每一次比较都使搜索范围减半.第一篇二分查找的论文发表于1946年,然而第一个没有bug的二分查找算法却是在1962年 ...
- 二分法:二分查找(递归+非递归)实现
二分查找又称折半查找,首先,假设表中元素是按升序排列,将 表中间位置的关键字与查找关键字比较: 如果两者相等,则查找成功; 否则利用中间位置将表分成前.后两个子表: 1)如果中间位置的关键字大于查找关 ...
- python数据结构与算法:二分查找
二分查找:python 实现 def binary_seaech(alist,item):"""二分查找 递归实现"""n = len(al ...
- 【C++】C++11 STL算法(四):二分查找法(Binary search operations)、合并操作
目录 一.lower_bound 1.原型: 2.说明: 3.官方demo 二.upper_bound 1.原型: 2.说明: 3.官方demo 三.binary_search 1.原型: 2.说明: ...
- 二分查找的循环实现和递归实现
自己实现了二分查找的循环实现和递归实现 说明:二分查找适用于顺序存储结构,不适于链式存储结构,是一个高效的查找方法.虽然折半查找效率高,但是要排序,排序本身是一种很费时的运算. 要求传入的表是 ...
最新文章
- leetcode -day23 Construct Binary Tree from Inorder and Postorder Traversal Construct Binary Tree f
- STM32’s I2C 硬件BUG引发的血案
- TMD 这个写笔记的号,盗了有意思吗
- IT Monitor
- 泛微协同“风暴”席卷高端市场
- 什么时候使用路由再分配?
- Anaconda自带Python编译器Jupyter Notebook显示代码行数
- nginx能访问html静态文件但无法访问php文件
- vue Cli 环境删除与重装 - 版本文档
- java for循环效率优化_java 优雅代码for循环 之性能调优
- 脑袋决定口袋,思维决定未来!
- WPS格式文件转图片格式如何进行操作
- 安装好maya后运行不了并弹出如图的错误
- 分布式架构项目的衡量指标及其目标
- 运用区块链溯源有什么意义呢?
- 电信短信网关ISAG-SMS二次开发
- ios开发之autolayout 第三方框架Masonry
- Android开机阶段log分析
- redis-第一节作业
- Delphi 判断一个对象是否存在(赋值)的三种办法