LeetCode刷题系列(二)二分查找、二叉排序树 的应用
文章目录
- 二分搜索的应用和考察点
- 二分搜索常见的应用场景
- 二分搜索考察点一
- 二分搜索考察点二
- 二分搜索考察点三
- 布隆过滤器
- 不用额外变量交换两个整数的值
- 不用比较判断,比较大小
- 案例三
- 参考
二分搜索的应用和考察点
二分搜索常见的应用场景
- 在有序序列中查找一个数,整个算法的时间复杂度为O(logN)O(logN)O(logN);
- 并不一定非要在有序序列中才能得到应用,只要在二分之后能够淘汰掉一半,这种情况都能够使用二分搜索;
二分搜索考察点一
首先,二分搜索的思想并不是难点,难点在于如何快速地写出正确的代码,尤其是:
对于边界条件的考察以及代码实现的能力;边界条件的重点是,在循环中,因为每次都会被剪一半,如果处理不当会发生死循环,或者漏掉某个数的情况,总之就是一定要仔细设计对中间划分点的逻辑判断,以及设计循环的终止条件,防止出现范围永远不能减小到循环终止的情况。
二分搜索考察点二
二分搜索的第二个考察点是二分搜索的题目变化很多:
- 给定处理或查找的对象不同:比如给定一个无重复值的数组完成某一个具体的功能,和给定一个有重复值的数组完成同样的功能,二者在二分的细节上存在差异;
- 判断条件不同:比如在有序数组中查找等于目标值
target
存在的位置,同样可以考察大于等于target
存在的位置; - 要求返回的内容不同:比如任意一个等于
target
元素的位置,或者等于target
最左的位置或者最右的位置,或者是两者的个数等等;
这三种变化可以相互组合衍生出大量的题目。
二分搜索考察点三
在有序循环数组中进行二分搜索:所谓的有序循环数组是指,左边任意长度的数组拿到右边去,右边任意长度的数组拿到左边来。比如数组[1,2,3,4,5]
,循环之后可以是[4,5,1,2,3]
。
二分搜索的重要提醒:一般我们取得中的位置的常规写法是mid=(left+right)/2
,这种写法非常经典,但是当下标值非常大的时候,left+right
是可能会产生溢出的。所以更安全的写法是:
mid=left+(right−left)/2mid = left+(right-left)/2 mid=left+(right−left)/2
布隆过滤器
布隆过滤器可精确(不是准确)的代表一个集合,可精确判断某一元素是否在此集合中,精确程序由用户的具体设计决定。做到100%的精确是不可能的。
布隆过滤器的优势在于:利用很少的空间可以做到精确率较高的程度。
不用额外变量交换两个整数的值
给定整数a
和b
,想要交换它们的值的常规做法是先申请一个额外的变量,用于保存其中的某个值,之后再进行交换。如果不使用零食变量,使用如下三行代码也可以交换a
和b
的值:
a = a ^ b;
b = a ^ b;
a = a ^ b;
上述代码的理解:假设a=a0a=a_{0}a=a0,b=b0b=b_{0}b=b0;
- 第一行代码运行完之后:a=a0a=a_{0}a=a0 ^ b0b_{0}b0,b=b0b=b_{0}b=b0;
- 第二行代码运行完之后:a=a0a = a_{0}a=a0 ^ b0b_{0}b0,b=a0b=a_{0}b=a0^b0b_{0}b0 ^ b0b_{0}b0 = a0a_{0}a0;
- 第三行代码运行完之后:a=a0a=a_{0}a=a0 ^ b0b_{0}b0 ^ a0a_{0}a0 = b0b_{0}b0, b=a0b=a_{0}b=a0;
不用比较判断,比较大小
给定两个32
位整数a
和b
,返回a
和b
中较大的。但是不能用任何比较判断。
第一种方法:得到a−ba-ba−b的符号,根据该符号决定返回a或b;
这种方法可能会导致溢出的问题。
第二种做法:
案例三
给定一个整型数组arr
,其中只有一个数出现了奇数次,其他人的数都出现了偶数次,请打印这个数。要求时间复杂度为O(N)
,额外空间复杂度为O(1)
。
任意一个整数n与0异或的结果为n;n与n异或的结果为0。
参考
第六课:二分查找、二叉排序树、位运算的应用
1. 二分查找、二叉排序树的知识要点2. 数组的二分查找(LeetCode 33,81 Search in Rotated Sorted Array 1,2)3. 区间二分查找(LeetCode 34. Search for a Range)4. 排序链表转换为二叉排序树(LeetCode 109. Convert Sorted List to B- Search Tree)5. 二叉排序树的遍历与改造(LeetCode 538 Convert BST to Greater Tree)6. 二叉排序树中的第K大的数(LeetCode 230. Kth Smallest Element in a BST)7. 位运算的知识要点8. 使用位运算表示集合(LeetCode 78. Subsets)9. 位运算应用题目(LeetCode 136,137,260. Single Number1,2,3)
LeetCode刷题系列(二)二分查找、二叉排序树 的应用相关推荐
- 卷进大厂系列之LeetCode刷题笔记:二分查找(简单)
LeetCode刷题笔记:二分查找(简单) 学算法,刷力扣,加油卷,进大厂! 题目描述 涉及算法 题目解答 学算法,刷力扣,加油卷,进大厂! 题目描述 力扣题目链接 给定一个 n 个元素有序的(升序) ...
- LeetCode LCP 12. 小张刷题计划(二分查找)
1. 题目 为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0 到 n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注 ...
- LeetCode算法题4:二分查找及扩展应用
文章目录 前言 一.二分查找 二.第一个错误的版本 三.搜索插入位置 总结 前言 Leetcode算法系列:https://leetcode-cn.com/study-plan/algorithms/ ...
- 第1天-代码随想录刷题训练| 704二分查找、26移除元素
文章目录 1. 二分查找704 扩展 2.移除元素 2.1数组理论基础 2.2 暴力解法 2.3双指针解法 2.4 扩展题 1. 二分查找704 原题链接 给定一个 n 个元素有序的(升序)整型数组 ...
- Leetcode刷题系列汇总
文章目录 一.前言 二.分治 && 归并 三.BFS 四.DFS & 回溯 五.动态规划 六.贪心算法 七.二叉树 7.1 中序遍历 SQL 一.前言 ~~~~~~ ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- Leetcode刷题系列(一)——巧解数学问题
文章目录 1.引言 2.最大公约数与最小公倍数 2.1最大公约数 2.2最小公倍数 3.筛法和打表 4.进制转换 5.角度问题(1rad=180°/π) 6.同余定理 7.容斥原理 8.距离度量公式 ...
- LeetCode刷题系列-- 174. 地下城游戏
一些恶魔抓住了公主(P)并将她关在了地下城的右下角.地下城是由 M x N 个房间组成的二维网格.我们英勇的骑士(K)最初被安置在左上角的房间里,他必须穿过地下城并通过对抗恶魔来拯救公主. 骑士的初始 ...
- LeetCode 刷题系列(前缀和题目)之 974. 和可被 K 整除的子数组
题目: 给定一个整数数组 nums 和一个整数 k ,返回其中元素之和可被 k 整除的(连续.非空) 子数组 的数目. 子数组 是数组的 连续 部分. 示例 1: 输入:nums = [4,5,0,- ...
- LeetCode 刷题系列 -- 1110. 删点成林
给出二叉树的根节点 root,树上每个节点都有一个不同的值. 如果节点值在 to_delete 中出现,我们就把该节点从树上删去,最后得到一个森林(一些不相交的树构成的集合). 返回森林中的每棵树.你 ...
最新文章
- 互联网协议 — 动态路由协议类型
- stone/reverse/string/digit(完美消除)
- 二 查看oracle归档日志路径
- 用神经网络分类连续与离散
- C++字符串和数字转换完全攻略
- effective C++ 读书笔记(0-2)
- C/C++添加设置任务计划
- C++之private虚函数
- linux课堂笔记(5)
- hdu3265一种错误的做法
- 行为模型:客户行为智能分析模型
- c语言程序输出一个桌子图案,几道程序题,请高手帮帮忙吧
- HighNewTech:19.04.22今天GitHub后无来者大事件之【B站后端代码不小心被开源】
- labview 上位机报警提示,报警记录,txt文档存储
- java毕业设计_基于java的毕业设计
- linux发挥显卡性能,Sandy Bridge集成显卡总算支持Linux 开源性能实测
- 【C语言程序设计】基本算术运算
- 八卦는 生命의 運動 (韓長庚 易學原理總論)
- 计算机考研院校排名2015,2015年计算机考研学校排名
- react-native报错-Unable to resolve module ‘react’
热门文章
- “形象代言人”与“抽风式管理”
- web安全day22:linux系统最基本知识最常用操作和命令
- ELK详解(七)——Kibana部署
- MySQL使用注意事项(一)
- git submodule时fatal: Not a git repository (or any parent up to mount point /home)
- 华三H3c 交换机 vlan Hybird端口配置
- 分时操作系统和多道程序操作系统的区别
- saltstack计划任务工具和其他命令
- 比特币 的 正统 ——BCH
- Javascript图像处理之平滑处理