找回密码
 立即注册
查看: 445|回复: 0

深入解析二分查找法之基础篇

[复制链接]
发表于 2022-2-20 08:35 | 显示全部楼层 |阅读模式
#算法篇

我们的女朋友都读得懂系列开新专栏啦,就是我们的算法专栏!!!
新专栏新学习宗旨,算法专栏呢也有一条我们学习算法路上的重要原则。
学习任何知识,我们都要尝试去寻找这个知识最底层的逻辑,哪怕一时间寻找不出来,我们也要在挖掘这最底层的过程中,一步步总结,我们要做知识的明白人。会和明白是有距离的。

记住算法逻辑就两个点:
1.        解决问题,先把问题解决了
2.        优化,优化什么?把没必要做的操作删除掉
第一节呢,小伙伴们要学习一个相对比较好理解的算法。

#二分查找法基础篇()

1.        1,2,3,4,5,6?里面有5吗?
a)        让计算机解决这个问题?
伪代码:
int[] nums = 1,2,3,4,5,6 ;
for num nums{
if(num == 5) return true;
}
上述伪代码的逻辑就是,遍历数组,查找目标值。
设数组长度为n,那么该算法的时间复杂度为O(n)。
OK啦!很好,问题就解决啦

2.        优化思想???
重复一遍优化算法的原则:删除不必要的操作
观察发现,数组元素可比且数组有序。
思考,有必要把数组里的每个元素都遍历一遍吗???
进一步讲假设我们先比较nums[3] = 4  <  5,我们还用遍历nums[0]、nums[1]、nums[2]吗???
3.        二分查找法?
二分查找法思想:
比较数组中间元素,通过判断,来决定舍弃数组前半部分还是后半部分。此时,算法的时间复杂度为O(logn)
伪代码:
int[] nums = 1,2,3,4,5,6 ;
int target = 5;
int length = nums.length;
int l = length - 1;//左索引
int r = 0;
while (l > r){//结束条件
    int mid = (l + r) / 2; //中间索引
    if (nums[mid] == target){
        return true;//找到目标元素
    }
    if (target > nums[mid]){//比中间数大,则舍弃前半段
        l = mid + 1;
    }else {//比中间数小
        r = mid - 1;//比中间数小,则舍弃后半段
    }
}
return false;//没找到
#二分查找基础例题
        给算法真刀真枪的干一场吧!!!
        例题:leetcode34 !!!
最重要的事情,例题可以不会做,但是看完答案你要体会上面讲的二分查找法的思想所在!!!
如果这条没做到,那就违背了我们学习的初衷,学一个小时,我们就会一个小时的东西!

好啦,我们算法之二分查找法基础篇就先到这啦,真的为女朋友都读得懂系列。
下一节呢,就为二分查找法进阶篇,干货多多,贼有意思!!!
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-9-22 19:28 , Processed in 0.065520 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表