首页 > 其他分享 >《代码随想录》-2.二分查找

《代码随想录》-2.二分查找

时间:2024-05-06 16:01:00浏览次数:28  
标签:二分 right nums int 随想录 middle while 查找 left

前提:
1.有序
2.无重复

//版本1
int left=0;
int right=nums.size()-1;
while(left<=right){
  int middle=left+(right-left)/2;//防止溢出
  if(nums[middle]>target){
    right=milddle-1;}
  else if(nums[middle]<target{
    left=middle+1;}
  else{
    return middle;
  }
}
return -1;//没找到目标值

区间:
1.[left,right]
因为left==right有意义
==> right=nums.size()-1
==>while(left<=right)要用 <=
if(nums[middle]>right) 也就是目标值在左边,此时区间变成[left,middle-1] => right=middle-1

时间复杂度:O(logn)
【while循环次数:假设共n个数,区间大小为n,n/2,n/4.....n/(2^k),
n/(2^k )>=1最坏的情况是每个区间大小为1,n/(2^k)=1,k=log2n】
空间复杂度:1

//版本2
int left=0;
int right=nums.size();
while(left<right){
  int middle=left+(right-left)>>1;//>>是右移运算符,右移一位相当于除2,右移n位相当于除以2的n次方;mid=(left+right)>>1等价于mid=(left+right)/2
  if(nums[middle]>target){
    right=milddle;}
  else if(nums[middle]<target{
    left=middle+1;}
  else{
    return middle;
  }
}
return -1;//没找到目标值

区间:
1.[left,right)
因为left==right没有意义
==> right=nums.size()
==>while(left<right)要用 <
if(nums[middle]>right) 此时区间变成[left,middle) => right=middle
left的情况不变

时间复杂度:O(logn)
空间复杂度:1

标签:二分,right,nums,int,随想录,middle,while,查找,left
From: https://www.cnblogs.com/baolanse/p/18175168

相关文章

  • 整体二分学习笔记
    最近准备学数据结构乱搞,接下来学k-dtree大致介绍可以使用整体二分解决的题目需要满足以下性质:1.询问的答案具有可二分性2.修改对判定答案的贡献互相独立,修改之间互不影响效果3.修改如果对判定答案有贡献,则贡献为一确定的与判定标准无关的值4.贡献满足交换律,结合律,具有可加......
  • 《代码随想录》-1.数组理论基础
    特点:1.内存空间-连续存放——>增删元素麻烦2.数据-相同类型3.下标从0开始注意:数组的元素采用覆盖的形式二维数组在内存的空间地址:1.C++中二维数组在地址空间上是连续的2.Java中二维数组每一行的头节点的地址是没有规则的......
  • 整体二分
    1概念在很多题目中,我们可以使用二分法来得出答案。但是如果说这一类题目有多次询问,并且多次询问分别二分会TLE时,我们就需要引入一个东西叫整体二分。整体二分的主要思路就是将多个查询一起解决,因此它是一种离线算法。整体二分的具体操作步骤如下:首先记\([l,r]\)为答案的......
  • 二叉查找树的接口设计
    /***************************************************filename:BianrySearchTree.c*author:momolyl@126.com*date:2024/05/04*brief:二叉查找树的接口设计*note:None**CopyRight(c)2024momolyl@126.comAllRight......
  • 代码随想录算法训练营第11天 | 栈与队列 20.有效的括号 1047.删除字符串中的所有相邻
    leetcode20.有效的括号题目20.有效的括号给定一个只包括'(',')','{','}','[',']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。解题思路实现代码leetcod......
  • 整体二分学习笔记
    1.简介在一些题目中,可能存在一些题目,对于每次询问直接二分可能会TLE,此时就要用到整体二分整体二分是一种离线的方法,适用于如下情况:询问答案具有可二分性修改对判定答案的贡献相互独立,修改之间互不影响效果修改如果对判定答案有贡献,则该贡献是一个确定的与判定标准无关......
  • 二分图染色
    二分图booldfs(intu,intc){ if(color[u]==c) returntrue; elseif(color[u]==3-c) returnfalse; color[u]=c; for(intv:graph[u]) if(!dfs(v,3-c))returnfalse; returntrue;}习题:P1330封锁阳光大学解题思路按照题目要求,每一条......
  • 代码随想录算法训练营第10天 | 栈和队列 232.用栈实现队列 225.用队列实现栈
    leetcode232.用栈实现队列题目232.用栈实现队列请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty):实现MyQueue类:voidpush(intx)将元素x推到队列的末尾intpop()从队列的开头移除并返回元素intpeek()返回队列开头的......
  • 整体二分
    整体二分动态排名每次二分复杂度\(O(n\logV)\),问题瓶颈在于有多次询问整体二分一种离线算法,将多个询问一起处理:条件问询可以二分修改之间互不影响修改对答案的贡献和判定次数,时间无关贡献满足结合律,交换律,可加性算法流程核心函数,处理一个区间的询问,他们的......
  • 二分的妙用
    数列分段SectionII链接:https://www.luogu.com.cn/problem/P1182题目描述对于给定的一个长度为\(N\)的正整数数列\(A_{1\simN}\),现要将其分成\(M\)(\(M\leqN\))段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列\(4\2\4\5\1\)要分成\(3\)段。将......