首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏mathor

    二分查找与二分答案(3

    例1  关于从长方形的巧克力中切出正方形的小巧克力,可以看下面的示意图:  上图是一块5x6的巧克力分别切出1x1、2x2和3x3的示意图。 切成3x3一共可以切出2块。 虽然我们现在面对的a数组是递减的,不是递增的,但是一样可以用二分查找求解。 显然是可以二分查找的。 第40~50行就是在二分查找,t是范围[l, r]的中点。

    95640发布于 2018-06-19
  • 来自专栏Initial programming

    初识算法 · 二分查找(3)

    前言: ​本文的主题是二分查找,通过两道题目讲解,一道是x的平方根,一道是山脉数组的封顶索引。 链接分别为: 69. x 的平方根 - 力扣(LeetCode) 852. 因为有了二分(2)的基础,所以我们直接进入算法编写部分。 肯定是一个O(N)就能够解决的事儿,但是题目要求我们必须找到对应logN的解决方案,那么看都不用看,直接就是二分查找。 由题目解析我们可以知道left和right的取值,并且因为我们见数组分成了这样,那么答案是在左边,所以我们使用的二分模板肯定是非朴素的求左边的二分模板了。 还是那句话,因为有了二分查找(2)的基础,所以我们可以直接套用模板了,就不会重新讲解一下原理了。

    32210编辑于 2024-10-24
  • 来自专栏golang算法架构leetcode技术php

    golang刷leetcode 技巧(3)判断二分

    给定一个无向图graph,当这个图为二分图时返回true。 如果我们能将一个图的节点集合分割成两个独立的子集A和B,并使图中的每一条边的两个节点一个来自A集合,一个来自B集合,我们就将这个图称为二分图。 示例 1: 输入: [[1,3], [0,2], [1,3], [0,2]] 输出: true 解释: 无向图如下: 0----1 | | | | 3----2 我们可以将节点分成两组: {0, 2} 和 {1, 3}。 2,只有在二分图的情况下,可以使用贪心思想给图着色:一个节点为蓝色,说明它的所有邻接点为红色,它的邻接点的所有邻接点为蓝色,依此类推。

    28510编辑于 2022-08-02
  • 来自专栏Java

    【C语言必刷题】3.二分查找

    前言 二分查找又称为折半查找,是分治算法基础上设计出来的查找算法。 二分查找算法仅适用于有序序列,它只能用升序序列或者降序序列中查找目标元素。 算法描述 二分查找的核心思想:不断地缩小搜索的区域,降低查找目标元素的难度。 前提:有已排序的数组arr。 定义左边界(Left),定义右边界(Right),确定搜索范围,循环执行二分查找. printf("找到了,下标为:%d\n", Middle); else printf("没有找到\n"); } 测试代码 int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 include<stdio.h> void binarysearch(int arr[], int Length, int t); int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10

    45910编辑于 2024-05-07
  • 来自专栏python3

    python3--递归函数,二分查找算法的实现

    ,[4,5,6,7],[11,],[3,3,3,3,3,3,3,3]],key=lambda x:len(x))) 执行结果 [3, 3, 3, 3, 3, 3, 3, 3] 递归函数 普通程序员理解函数 4-1-1-1)函数,n = 4-1-1-1,走if,此时返回18给调用者 # 也就是age(4-1-1-1) = 18,加上之前的 +2 +2 +2,最终结果18+2+2+2=24 执行结果 24 二分查找法         break     count += 1 执行结果 17 如果列表很大,上面那两种方法查找就会慢很多,它的执行顺序是从前往后,如果要找的数在最后面,就需要把列表全部遍历一遍 第三种:二分查找 (每次从中间取值,比较大小,如果要找的数字比中间值大(如果比中间值小,就取前面那一半),就直接找中间值后面的那一半,继续对半切片查找,在比较,直到找到为止) 二分查找条件(有序且唯一的数字数列) 错误方法示例 : #二分查找,li表示列表,aim是目标数,比如要找10     mid_index = len(li) //2 #取列表中间的索引     if li[mid_index] < aim: #判断列表中间的数小于目标数

    1.1K20发布于 2018-08-02
  • 来自专栏OI算法学习笔记

    贪心与二分-二分答案

    目标 学会二分答案的基本模板,并能进行简单应用。 重点 二分答案模板的熟悉及对最优性问题转可行性问题的处理。 导图大纲 图片 回顾 复习二分查找。 回顾下二分查找的思想,若序列呈升序,我们求出中间值mid,并判断是否满足条件。 二分查找的时间复杂度为 O(logn)O(logn)O(logn)。而对题目做修改,修改成,查找某个符合某个条件的值的最大或最小的值。此时,套用之前的二分查找的模板就不能够方便地去查找它的位置了。 此时,我们引入二分答案,来解决此类问题。 二分答案类问题抽象 形如这样的问题“求在有序的对象中,满足某个条件C(x)的最小的x”。 小结 稍微回顾下本小结的内容,讲解了二分答案中对于最优性问题转换成可行性问题的处理,以及介绍了另一种二分答案模板,注意两种模板的区别,不要用混。练习了砍树问题,注意数据范围的问题。

    60720编辑于 2022-08-31
  • 来自专栏Zaqdt_ACM

    Codeforces Round #540 (Div. 3) D. Coffee and Coursework(二分)

    那么D2就不能1-n枚举了,但是也不难想到二分天数,然后也是根据这个条件去判断就好了。下面只贴D2的呆码。

    57240发布于 2019-03-14
  • 来自专栏mathor

    二分查找与二分答案(1)

    这样对于长度为n的数组,平均查找长度是n/2  如果数组是有序的,比如是递增的,就像上图[1, 2, 3, 4, 5, 7, 8, 10, 11, 13]一样的话。 我们就有效率更高的查找算法,叫做二分查找。 假如我们这时发现a[6]不是8,则说明8没有在这个数组里  二分查找又叫“折半查找”。 因为我们每进行一步,也就是查看一个元素的数值,都会使得后面需要检查的范围缩小一半  二分查找的时间复杂度是O(logN)的,换句话说,在长度为N的有序数组中查找一个数,查看元素的次数最多是logN+1 当N很大时,二分查找的速度比顺序查找快非常多倍 #include<iostream> using namespace std; int n,x,a[1000000]; int binary_search

    91451发布于 2018-06-13
  • 来自专栏全栈程序员必看

    L3-002 特殊堆栈(树状数组+二分)「建议收藏」

    随后 N 行,每行给出一句指令,为以下 3 种之一: Push key Pop PeekMedian 其中 key 是不超过 10 ​5 ​​ 的正整数;Push 表示“入栈”;Pop 表示“ Pop Pop Pop Pop 输出样例: Invalid Invalid 3 2 2 1 2 4 4 5 3 Invalid 题解 注意如果取中间数要是开一个数组的话时间复杂度O(n2),数据集大小 1e5,会超时,所以需要用到树状数组+二分 #include<bits/stdc++.h> #define x first #define y second #define send string::nops using namespace std; typedef long long ll; const int N = 1e5 + 10; const int M = 3 * N; const int V = 1e2 + 10; const int INF = 0x3f3f3f3f; typedef pair<int,int> PII; typedef struct Node * pnode; int tree

    41620编辑于 2022-09-22
  • 来自专栏Zaqdt_ACM

    Codeforces Round #521 (Div. 3) D. Cutting Out(二分)

    二分出现的最大次数,然后去判断是否可行,因为有些数出现次数可能是k的倍数,所以要有一个除法的操作,不难理解... ---- AC代码: #include <bits/stdc++.h> #define

    69120发布于 2019-01-10
  • 来自专栏mathor

    二分查找与二分答案(4)

    我们看样例,一共有2,3,5三个质数。以2、3、5为分母,真分数有:1/2, 1/3, 2/3, 1/5, 2/5, 3/5, 4/5。 ,不过这个二分的思路不容易想到。 既然cnt(x)是递增函数,我们就可以用二分查找的算法,找到一个x满足cnt(x) 等于K。这里的K就是题目里我们求第K小分数的K。 ,这样到底要二分多少次?   所以在我们二分的过程中,误差(也就是r-l差)在缩小到1/(P1×P2)之前就一定找到满足条件的m了。

    869100发布于 2018-06-19
  • 来自专栏mathor

    二分查找与二分答案(2)

    溢出风险  我们首先回顾一下上一次二分算法的代码 #include<iostream> using namespace std; int n,x,a[1000000]; int binary_search 都没有超出int的范围,但是计算m时,l+r就超过int范围了,导致m计算错误,整个算法挂掉  解决办法很简单,改成m=l+(r-l)/2,这样就不会有溢出的风险了 其他问题  我们解决了最简单的二分查找问题 的用法 #include <iostream> #include <algorithm> using namespace std; int main() { int a[10] = {1,2,2,3,3,3,4,4,4,4 : #include <iostream> #include <algorithm> using namespace std; int main() { int a[10] = {1,2,2,3,3,3,4,4,4,4 n,int x)的参数分别是数组a,数组a的长度,带查找的元素x,而这个函数的实现,其实稍微改一下我们之前的二分查找代码即可 #include<iostream> using namespace std

    93040发布于 2018-06-19
  • 来自专栏博客迁移同步

    关于二分查找和二分搜索

    首先是二分查找,举个有序的整数数组例子(二分查找和搜索都是针对有序数组) public int rank(int key, int n) { int lo = 0, hi = n - 0,所以lo=mid+1=3,lo=3  <=  hi=3继续循环,mid=(lo+hi)/2=3  3     2               cmp = 6-a[3] < 假如lo=5,我查找一遍,就知道他前面有5个元素,即我这次要插入的元素下标就为5(从0开始计算) 下面讲一下二分搜索 比如从有序数组中查找某个数值 lower_bound 给定长度为n的单调不下降数列 ≤an-1<109    0≤k≤109    输入    n = 5    a = {2, 3, 3, 5, 6}    k = 3   输出     1(其中a0<3, a1>=3)   这里不仅仅是二分查找了 3, 5, 6} a[2]=33进行比较,可以知道解不大于2 a[1]=33比较,可以知道解不大于1 a[0]=2和3比较,可以知道解不小于0 所以解为1 二分搜索法是通过不断缩小解的可能存在的范围

    41720编辑于 2023-05-06
  • 来自专栏X

    Leetcode|基本二分搜索+左侧边界二分+右侧边界二分

    文章目录 1 基本二分搜索 2 左侧边界二分 3 右侧边界二分 4 总结 致谢 1 基本二分搜索 【区间】:[left, right] 【终止条件】:left = right + 1 int binarySearch + 1; else if (nums[mid] > target) right = mid - 1; } return -1; } 2 左侧边界二分 【区间】:[left, right) 【终止条件】:left = right /**寻找左侧边界的二分搜索**/ int leftBound(vector<int>& nums, int target left : -1; } 3 右侧边界二分 【区间】:[left, right) 【注意】:最后是mid = left - 1 【终止条件】:left = right /**寻找右侧边界的二分搜索**/

    2.1K20发布于 2021-09-18
  • 【51Nod】1090 - 3个数和为0(二分

    从中找出所有和 = 0的3个数的组合。如果没有这样的组合,输出No Solution。如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则按照第二小的数排序。 如果有多个,按照3个数中最小的数从小到大排序,如果最小的数相等则继续按照第二小的数排序。每行3个数,中间用空格分隔,并且这3个数按照从小到大的顺序排列。 Input示例 7 -3 -2 -1 0 1 2 3 Output示例 -3 0 3 -3 1 2 -2 -1 3 -2 0 2 -1 0 1 直接枚举两个数,二分查找第三个数就行了 cstring> #include <algorithm> using namespace std; #define CLR(a,b) memset(a,b,sizeof(a)) #define INF 0x3f3f3f3f for (int i = 1 ; i <= n ; i++) scanf ("%d",&num[i]); sort(num+1,num+1+n); num[n+1] = INF; //如果二分搜索溢出防止其取

    31110编辑于 2025-08-27
  • 来自专栏爱撸猫的杰

    二分查找

    description: * @author: Jay * @create: 2020-09-21 19:17 **/ public class TwoSearch { /** * 不使用递归的二分查找 //最后仍然没有找到,则返回-1 } public static void main(String[] args) { int[] arr = {1, 3,

    51720发布于 2020-09-22
  • 来自专栏开源优测

    二分查找

    概述 在上文《二分查找》中,我们了解了二分查找基本实现原理和具体的实现算法。 但大家有没有发现,如果目标查找值,如果在查找序列中存在多个,则查找返回的索引值,会有所变化。 那下面我们试着利用二分查找实现以下功能: 查找目标值在序列中第一次出现时的索引 查找目标值在序列中最后一次出现时的索引 例如,有序列如下: seq = [1, 2, 3, 4, 5, 5, 5, 5, 6, 7, 8] 我们查找目标值: 5 第一次出现在索引为:4 的位置 最后一次出现在索引为:7 的位置 下面我们对二分查找算法进行策略改造升级为: # 用于实现二分查找第一次出现的算法 first_binary_search first示例") print("二分查找只适合有序的序列") seq = [1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 10 last示例") print("二分查找只适合有序的序列") seq = [1, 2, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6, 7, 7, 8, 10

    87050发布于 2018-04-09
  • 来自专栏赵俊的Java专栏

    二分查找

    样例 在数组 [1, 2, 3, 3, 4, 5, 10] 中二分查找 3,返回 2。 ] == target) { return end; } return -1; } } 原题地址 LintCode:二分查找

    46310发布于 2018-06-04
  • 来自专栏程序员阿杰

    二分查找

    本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名,转载请标明出处 最后编辑时间为: 2021/12/05 12:11

    21310编辑于 2022-01-10
  • 来自专栏趣谈编程

    二分查找

    面试官:写个二分热热身 我心想:不用热身,热的手已经出汗了 二分查找有着查找速度快,平均性能好等优点,但必须要求待查表为有序表,且插入删除困难,面试比较常考,今天我们具体看一下二分 二分查找思想 前情回顾 ,弟子不才,还请老师指点 克 要分析时间复杂度,其实也不难,只要算出while循环了几次就行了 你这样想一下,你要查找的数据规模如果是n,那二分一次后规模就变为n/2^1,二分两次后规模为n/2^2, ,二分m次后规模为n/2^m,若二分m次后跳出循环,则m就是循环的次数(不管查找是否成功) ? ,查找不到,跳出循环,所以说最多有 m+1 次循环(二分m次未跳出循环,还要二分一次),也就是查找一个元素最多需要m+1次,即lg(n)+1次比较,故二分的最坏时间复杂度为O(n) = lg(n) “ 克 你看,查找25我们二分了两次后查找区间变为一个元素了,这时7/2^m=1;m=lg7=2(向下取整),再循环一次跳出循环,循环次数为3 哦,我懂了 慧子 x向下取整表示小于或等于x的最大整数 ”

    87560发布于 2018-01-31
领券