范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

字节面试居然倒在这道算法基础二分算法上,现在才搞懂,哭了

  一、定义
  二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。二、查找过程
  在一个有序序列中,取中间值把序列分成两边,先看中间值,如果中间值小于要查找的值,那么说明目标值一定在
  右边;如果中间值大于目标值,那么目标值一定在左边;如果中间值等于目标值,那么查找完成。
  以猜数字游戏为例,小明想一个0-1000的数,小红来猜。
  小明选的是623为例:
  小红:大于500吗?
  小明:yes
  小红:那么一定在[501,1000]之间,大于750吗?
  小明:no
  小红:那么一定在[501,750]之间,大于625吗?
  小明:no
  小红:那么一定在[501,625]之间,大于563吗?
  小明:yes
  小红:那么一定在[564,625]之间,大于594吗?
  小明:yes
  小红:那么一定在[595,625]之间,大于610吗?
  小明:yes
  小红:那么一定在[611,625]之间,大于618吗?
  小明:yes
  小红:那么一定在[619,625]之间,大于622吗?
  小明:yes
  小红:那么一定在[623,625]之间,大于624吗?
  小明:no
  小红:那么一定在[623,623]之间,你想的数字是623
  小明:yes。
  对于1-1000之间的猜数字游戏,最多只需要10次就能找到。
  二分查找算法的时间复杂度是O(logN)三、框架
  二分查找的框架大致如下:public int searchInsert(int[] nums, int target) {         int l = 0;         int r = nums.length-1;         int mid = l + (r-l)/2;         while(l < r){             //能找到,直接返回元素下标             if(nums[mid] == target)                  return mid;             else if(nums[mid] < target){                 l = mid + 1;                 mid = l + (r-l)/2;             }             else{                 r = mid-1;                 mid = l + (r-l)/2;             }         }     	//未找到     	return -1;     }
  注意:
  1、中间值mid取法
  应该用 mid = l + (r-l)/ 2 ,而不是 mid = (l + r) / 2,因为如果 l 和 r都很大,那么(l + r)将会溢出整数范围。
  2、偶数个数的中间值
  如果数字的总数是偶数,那么中间值有两个,按照 mid = l + (r-l)/ 2 算的话,中间值应该是左边那个。例如对于1、2、3、4,l = 0,r = 3,
  mid = 0 + (0+3)/ 2
  =0 + 1
  ​ = 1。
  因为mid、l、r都是int类型,如果有小数部分,会自动舍弃。四、例题1、搜索插入位置
  给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。
  你可以假设数组中无重复元素。
  示例 1:
  输入: [1,3,5,6], 5
  输出: 2
  示例 2:
  输入: [1,3,5,6], 2
  输出: 1
  示例 3:
  输入: [1,3,5,6], 7
  输出: 4
  示例 4:
  输入: [1,3,5,6], 0
  输出: 0
  题目来源:力扣(LeetCode)
  解题思路:先使用二分查找,如果能找到,直接返回元素下标;
  接下来讨论不能找到的情况:
  第一种情况,二分查找结束后,目标值大于mid
  以[1,3,5,6,9] 和目标值 4为例
  初始状态:
  第一遍二分查找结束:
  第二遍二分查找结束:
  两遍查找结束之后,发现mid小于目标值4,此时,4应该插入在3后面,所以返回 mid+1。
  第二种情况,二分查找结束后,目标值小于mid
  以[1,3,5,6,9] 和目标值 7为例,
  初始状态:
  第一遍二分查找后:
  第二遍二分查找后:
  两遍查找结束之后,发现mid大于目标值7,此时,7应该插入在9前面,所以返回 mid。
  题解代码:public int searchInsert(int[] nums, int target) {         int l = 0;         int r = nums.length-1;         int mid = l + (r-l)/2;         while(l < r){             //能找到,直接返回元素下标             if(nums[mid] == target)                  return mid;             else if(nums[mid] < target){                 l = mid + 1;                 mid = l + (r-l)/2;             }             else{                 r = mid-1;                 mid = l + (r-l)/2;             }         }     	//第一种情况,二分查找结束后,目标值大于mid         if(nums[mid] < target)             return mid+1;     	//第二种情况,二分查找结束后,目标值小于mid         else             return mid;     } 2、搜索二维矩阵
  题目来源:力扣(LeetCode)
  解题思路:
  既然题目提到了要编写一个高效的算法,那么用两个for循环暴力枚举肯定是不行的。
  再看一遍题目,该矩阵具有以下特性:同一行,右边的数要大,同一列,下面的数要大。由此我们可以发现,如果我们取一个数作为右上角,那么比该数小的一定在其左边的列之中,比该数大的一定在该数的下面的行之中。
  例如:
  对于下面矩阵,我们取7作为右上角的数,那么比7小的一定在第0、1、2列,比7大的一定在第1、2、3行。
  假设我们要找11,那么首先取右上角7,发现7比11小,因为7是第一行最大的,所以第一行不可能再找到11,剔除第0行;从第1行开始找,同样,从右上角20开始看,20大于11,所以第3列一定不可能找到11,因此我们剔除第3列;之后,16作为右上角,16大于11,剔除第2列;11作为右上角,找到目标数。
  简单来说就是:从右上角开始找,
  右上角的数 = 目标,结束查找,返回true;
  右上角的数 < 目标,剔除该行;
  右上角数 > 目标,剔除该列。
  程序结束也未找到,返回false。
  题解代码:public boolean searchMatrix(int[][] matrix, int target) {         for(int i = 0;i < matrix.length;i++){             for(int j = matrix[0].length-1;j >=0;j--){                 //从右上角开始搜索                 //如果右上角数字为目标数字,返回true                 if(matrix[i][j] == target)                     return true;                 //如果右上角数字小于目标数字                 //说明该行都小于目标数字,剔除该行                 else if(matrix[i][j] < target)                     break;                 //如果右上角数字大于目标数字                 //说明该列都大于目标数字,剔除该列                 else                     continue;             }         }         //没有找到         return false;     }

戴森推出DysonZone耳机,戴在头上的空气净化器IT之家3月30日消息,戴森今日宣布推出一款耳机,名为DysonZone,你可以理解为头戴式耳机空气净化器的二合一产品,官方给它的定义则是空气净化耳机。这款耳机支持主动降噪,内置戴启奥科技进北交所上市辅导期输血信息化企业拥有242项软件著作权挖贝网3月30日,新三板创新层公司启奥科技(831287)进入北交所上市辅导期,辅导机构为财达证券。3月22日,启奥科技与财达证券签订了北交所上市辅导协议,同日向河北证监局报送了辅爆款HiFi监听耳机飞利浦SHP9500特价419元如果你的预算有限,又想体验一下HiFi音质的话,那这款飞利浦(PHILIPS)SHP9500绝对是你进入HiFi世界的不二之选。SHP9500以极高的性价比一直在烧友们心中享有盛名等等党终究还是赢了!小米11Ultra限时降1500相机再次进化近期又有不少新机发布了,诸如RedmiK50系列,当然还有一个K40S突然冒出来有点让人措手不及,当然其他手机厂商也有很多好的手机,一些已经发布了,还有一些还在路上,总体来说,今年新能源物流车或迎爆发前夜2025年将突破200万辆?21世纪经济报道记者彭苏平上海报道新能源汽车开始在各个细分市场落地开花。来自电车资源的数据显示,2021年中国新能源物流车销量为13。12万辆,是2020年总销量58045辆的2。中国电信推出星卡随心版用户可随需订购新海南客户端南海网南国都市报3月30日消息(记者任桐)近期,中国电信推出满足个性化需求的星卡随心版,让用户可以在不同需求场景下,打破套餐思维,自由选择组合,随需订购。每个月总有流量对话零跑汽车当下仍需聚焦单车智能车路协同是一个锦上添花的过程,有这个东西可以大大改进单车智能上的一些容错能力,错误概率会大大降低,零跑汽车智能驾驶产品线总监王耀农在谈到智能驾驶路线时这样说道。经过长期的发展,智能阿里腾讯支付互联互通再进一步淘宝小范围开启微信支付内测(马秋月文)3月30日消息,继阿里旗下饿了么优酷等应用接入微信支付后,近日淘宝正针对小范围内开启对微信支付功能的内测,并在支付选项中新增了与微信支付相关的两种支付模式,分别是微信扫数据结构与算法手撕平衡二叉树平衡二叉树定义动机二叉查找树的操作实践复杂度由树高度决定,所以希望控制树高,左右子树尽可能平衡。平衡二叉树(AVL树)称一棵二叉查找树为高度平衡树,当且仅当或由单一外结点组成,或由比缺芯还严重!超90大陆市场被美企垄断,该警惕了当今电子产业的高速发展让人们的视线都集中在半导体产业上,尤其是自从华为的芯片由于芯片规则被修改而断供后,芯片问题更是国内热烈讨论的问题,引起了国家以及相关企业的重视。这一次华为的事神州控股2021年营收205。39亿港元,大数据产品收入增长1023月30日晚间,神州数码控股有限公司(简称神州控股股票代码00861。HK)发布了2021年度报告。报告显示,公司2021年营收205。39亿港元,归母净利润(扣除股份支付费用及少
在苹果手机上玩转三星OneUI?你有没有想过在苹果手机上使用三星OneUI3。1系统?并且还能流畅地操作各种安卓软件?最近三星为了满足用户这种不同寻常的脑洞,推出了名叫iTest的WebApp系统模拟网页。你没看三星或将明年推出新机Note22,真安卓机皇?三星在整个智能手机领域中算是头部品牌了,它的产品不仅性能强劲还有别具一格的设计风格,但是近些年来三星在国内的销量并不高,一是它的定价普遍高于国产手机,二是爆炸门事件劝退了一大批国内七夕必须花大钱?拒绝俗套,这对情侣款无线耳机好看又实用距离2021年的七夕节还有最后一天,难得的情人佳节,一份寄托着自己心意的礼物是必不可少的。不过对许多忙于工作生活的男性朋友来说,给女友送礼是一道不小的难题。鲜花虽浪漫,但对方收到后半年跳水700元,骁龙8882K屏50W无线充,8256G售价亲民众所周知安卓手机的竞争十分激烈,特别是国内市场更加犀利,往往半年时间就是产品的周期,如今来到八月份,接下来各大厂商都要推出自己的年度旗舰,那么上半年的那些产品自然而然也要降价让路,南海之声C系列有源音箱登场我们将在九月份发布一款9991199元的C4有源音箱,有两个配置。999基础款配置自主设计的进口丝膜的一寸高音单元和凯夫拉4寸低音单元,高低音二阶分频器。75Wucd功放。尺寸为1你是多久换一次手机是卡到爆还是不差钱随着科技的发展手机的功能越来越多,更新的频率也是越来越快。一般一部手机的使用寿命是23年就会出现顿,电池不耐用等一系列的情况。当然每个人的使用习惯不同则手机的使用寿命不同。所以多久周报精选顺丰收购嘉里关键进展韵达定调下一步发展策略08。0908。15,第279期物流行业事件速递这一周物流行业消息频出,现在,就来小编一起看看这一周都发生了哪些大事吧顺丰控股要约收购嘉里物流部分股权的全部先决条件均已获达成或豁免科技不让老年人掉队中国信通院颁发首张移动操作系统适老化能力专项测评证书2021年8月4日,中国信息通信研究院(以下简称中国信通院)泰尔终端实验室向上海卓易科技股份有限公司的卓易操作系统关爱版颁发了移动操作系统适老化能力专项测评证书。移动操作系统适老化学会这个方法,苹果手机续航能力明显提升从智能机兴起以来,苹果手机一直都是走在前列。处理器及系统的特殊强大,用户体验感都普遍很多,现在苹果12也发布了,不过不带充电器和耳机还是让很多人诟病。苹果手机性能确实好,但是电池问首日预约量超过86万!荣耀Magic3系列挑战苹果,到底有啥硬实力?8月12日,荣耀CEO赵明宣布,荣耀推出Magic3系列手机,其高端旗舰版本MagicPro定价5999元起,荣耀Magic3至臻版(12GB512GB)7999元起。8月13日,华为手机超级大字体日前,孩子给我买了一个华为7。2寸大屏幕手机。华为手机啊,对于字体和第三方软件要求比较特殊。我连续摆弄了4天。才把这一块弄好。关于手机字体,一般有两个方面要求一是字的形状,二是字体