【Java+LeetCode训练】binarySearch源码解析
创始人
2024-03-01 00:58:21

二分搜索

  • Arrays.binarySearch(int[] a,int key)源码分析
  • 【LeetCode】209. 长度最小的子数组
    • 解法1:前缀和 + 暴力解法
    • 解法2:前缀和 + 二分搜索

序:使用Arrays工具类中的binarySearch方法进行二分搜索时,我们知道搜索成功会返回其下标,那么搜索失败它会返回什么呢?分析分析源码。

Arrays.binarySearch(int[] a,int key)源码分析

二分搜索可以针对于任何类型,但大差不差,都是几乎一致的,这里为了方便,说的是整型数据类型的二分方法。

下面聊聊源码:
在这里插入图片描述
在这里插入图片描述
图中可以看出如果没找到返回的是-(low+1)
这里我们还可以看到low出循环是指向首个大于key的下标的,那么low+1就是大于key的第二个了(假设在数组范围内),不是我们一般想要的。

那么没找到如何通过该返回获得low呢?

  1. 知道是返回-(low+1)了,通过数学运算把结果取反-1;
  2. 直接用位运算中的~取反,我们知道没返回的是个负数,负数补码取反是先-1再取反,也就是-(low+1-1),一样的效果。

【LeetCode】209. 长度最小的子数组

题目:
在这里插入图片描述

解法1:前缀和 + 暴力解法

class Solution {public int minSubArrayLen(int target, int[] nums) {int cnt = 0;int[] pre = new int[nums.length+1];//前缀和Arrays.fill(pre,0);for(int i=0;ipre[i+1] = pre[i] + nums[i];}int minLen = 0;for(int i=1;i<=nums.length;++i){int sum = minLen==0?pre[i]:pre[i] - pre[i-minLen+1];//看看是否有更小的且符合条件的minLenint left = 1;while(sum>=target){minLen = minLen==0?i-left+1:Math.min(minLen,i-left+1);//更新长度sum = pre[i] - pre[left];left++;}}return minLen;}
}

解法2:前缀和 + 二分搜索

  1. 求出的前缀和是升序的,满足二分有序搜索条件;
  2. 所求的是大于target的最小长度==》pre[i] - pre[left]>=target==>pre[i]>=target + pre[left],也就是求满足该条件下的,i - left + 1的最小值。
class Solution {public int minSubArrayLen(int target, int[] nums) {int cnt = 0;int[] pre = new int[nums.length+1];//前缀和Arrays.fill(pre,0);for(int i=0;ipre[i+1] = pre[i] + nums[i];}int minLen = Integer.MAX_VALUE;for(int i=0;i<=nums.length;++i){int endTarget = target + pre[i];int index = Arrays.binarySearch(pre,endTarget);// 如果index小于零,转换一下,找到首个大于目标的第一个下标if(index<0){index = ~index;}// 判断下标是否过界,如果超过了数组范围,表示数组内全部小于endTargetif(index<=nums.length){minLen = Math.min(minLen,index-i);}}return minLen==Integer.MAX_VALUE?0:minLen;}
}

解法1代码进行了我进行了优化,所以运行时间未必比下面的慢,看情况各有各好处。

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...