算法通关 16 - 滑动窗口
通关进度
题目
说明
子数组最大平均数
通关
最长连续递增序列
通关
参考资料
滑动窗口思想简介
滑动窗口入门题固定窗口 643. 子数组最大平均数 I
问题
给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。
请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。
滑动窗口
123456789101112131415161718// 固定窗口大小public double findMaxAverage(int[] nums, int k) { int sum = 0; int n = nums.length; // 计算初始窗口的值,窗口大小 k for (int i = 0; i < k; i++) { sum += nums[i]; } int maxSum = sum; // 窗口右移动:end++ for (int end = k; end < n; end++) { su ...
算法通关 15 - 超大规模数据场景题
大数据类型题目技巧
哈希函数可以把数据按照种类均匀分流
布隆过滤器用于集合的建立与查询,并可以节省大量空间
一致性哈希解决数据服务器的负载管理问题
利用并查集结构做岛问题的并行计算
位图解决某一范围上数字的出现情况,并可以节省大量空间
利用分段统计思想、并进一步节省大量空间
利用堆、外排序来做多个处理单元的结果合并
用 4 KB 内存寻找重复元素
通关进度
题目
说明
用 4 KB 内存寻找重复元素
通关
参考资料
算法面试-海量场景下的经典问题
[算法入门笔记] 16. 大数据
海量场景思路
位存储
文件分块,时间换空间
堆,第 K 大/小, K 个最大/最小(查小用大堆,查大用小堆)
问题
给定 1~N 的数组,N 最大 32000,其中存在重复值,在内存 4KB 的情况下找出所有重复元素
位运算
使用 Bitmap,对于 4kb 空间寻址范围为 $8\times{4}\times2^{10}$,完全满足题目所需。
【仅供参考】123456789101112131415161718192021222324252627282930 ...
算法通关 14 - 堆结构
堆结构
通关进度
题目
说明
构造堆
通关
添加堆元素
通关
删除堆元素
通关
参考资料
应该是全网最详细的解释算法里堆的课时
堆
堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值
最大堆:堆中的每一个节点的值都大于等于子树中所有节点的值
最小堆:堆中的每一个节点的值都小于等于子树中所有节点的值
堆的存储
堆的插入1.将要插入的元素放到最后
2.从底向上,如果父结点比该元素小,则该节点和父结点交换,直到无法交换
堆的删除根据堆的性质可知,最大堆的堆顶元素为所有元素中最大的,最小堆的堆顶元素是所有元素中最小的。当我们需要多次查找最大元素或者最小元素的时候,可以利用堆来实现。
删除堆顶元素后,为保持堆的性质,需要对堆的结构进行调整,我们将这个过程称之为”堆化”,堆化的方法分为两种:
一种是自底向上的堆化,上述的插入元素所使用的就是自底向上的堆化,元素从最底部向上移动。
另一种是自顶向下堆化,元素由最顶部向下移动
自底向上堆化
首先删除堆顶元素,使得数组中下标为 ...
算法通关 13 - 数字与数学
数字与数学基础问题
通关进度
题目
说明
数字统计
通关
数字溢出
通关
进制处理
通关
数字统计专题数组元素积的符号 1822. 数组元素积的符号
问题
【LeetCode 1822】:已知函数 signFunc(x) 将会根据 x 的正负返回特定值:
如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。
返回 signFunc(product) 。
遍历
如果数组中有一个元素 0,那么所有元素值的乘积肯定为 0,我们直接返回 0
使用 sign 记录元素值乘积的符号,1 为表示正,−1 表示为负,初始时 sign=1
遍历整个数组,如果元素为正,那么 sign 不变,否则令 sign=−sign,最后返回 sign
123456789101112public int arraySign(int[] nums) { int sign = 1; for (int num : ...
算法通关 12 - 字符串
字符串基础题
通关进度
题目
说明
转换成小写字母
通关
字符串转换整数
通关
参考资料
字符串与常见面试题
转换成小写字母 709. 转换成小写字母
问题
【LeetCode 709】:给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。
ASCII
大写字母 A - Z 的 ASCII 码范围为 $[65,90]$
小写字母 a - z 的 ASCII 码范围为 $[97,122]$
如果 ch 的 ASCII 码在 $[65,90]$ 的范围内,那么将它的 ASCII 码增加 $32$,即可得到对应的小写字母。
由于 $[65,90]$ 对应的二进制表示为 $[(01000001)_2,(01011010)_2]$, $32$ 对应的二进制表示为 $(00100000)_2$,而对于 $[(01000001)_2,(01011010)_2]$ 内的所有数,表示 $32$ 的那个二进制位都是 0,因此可以对 ch 的 ASCII 码与 $32$ 做按位或运算,替代与 $32$ 的加法运算。
12345 ...
算法通关 11 - 位运算
位运算规则
通关进度
题目
说明
位运算的基本规则
通关
移位原理与乘除关系
通关
位运算的常用技巧
通关
参考资料
位运算与相关算法技巧
位运算规则
&:与运算
12340 & 0 = 00 & 1 = 01 & 0 = 01 & 1 = 1
|:或运算
12340 | 0 = 00 | 1 = 11 | 0 = 11 | 1 = 1
~:取反运算
12~0 = 1~1 = 0
⊕:异或运算
1230 ⊕ 0 = 01 ⊕ 0 = 10 ⊕ 1 = 1
<<:左移运算
将全部二进制位向左移动若干位,高位丢弃,低位补 0
>>:右移运算
将全部二进制位向右移动若干位,低位丢弃,高位的补位由算术移位或逻辑移位决定:
算术右移,高位补最高位
逻辑右移,高位补 0
Java 运算符
说明
<<
左移运算符,num << 1,相当于 num 乘以 2
>>
右移运算符,num >> 1,相当于 num ...