算法基础思维——附带题单
双指针、滑动窗口、二分、位运算、前缀和(下划线内是例题的链接
)
双指针
注意处理边界情况
解决数组中复写数字 复写0
- 先考虑异地操作。
- 然后尝试原地操作来进行优化。
简单的数组区间维护 移动0
- 两个指针分别指向区间的开始和末尾 。
判断是否有循环的问题 环状链表Ⅱ
- 快慢指针,如果有循环,由于两个指针有速度差异,那么两个指针迟早会相遇
利用双指针移动的变化规律处理区间极值问题 盛最多水的容器
三个数之间的判断 四数之和
- 一般都是先排序,然后利用单调性来解决。
滑动窗口 —— 同向双指针
求解的过程就是更新窗口的过程
连续子数组的值问题。 无重复的最长子串
二分
查找区间首未问题
口诀:
- 谁的区间内可能存在正确答案,谁的更新策略就带等号。
- 左端左中点,右端右中点
- 左加右减
求中点
left + (right -left)/ 2
最后剩余偶数(两个)元素的时候,取左边的那一个元素。left + (right - left +1)/2
最后剩余偶数(两个)的时候,取右边的那一个元素。
求区间左端点
- 使用条件:
left < right
- 计算公式:
mid = left + (right - left) / 2
- 更新策略:
- 如果
mid < tar
,则left = mid + 1
- 如果
mid >= tar
,则right = mid
- 如果
求区间右端点
- 使用条件:
left < right
- 计算公式:
mid = left + (right - left + 1) / 2
- 更新策略:
- 如果
mid <= tar
,则left = mid
- 如果
mid > tar
,则right = mid - 1
- 如果
例题
反证
位运算
^
异或运算符(无进位相加)。~
取反运算符
常见情况
- 确定某一位(n)是
0
还是1
- (num>>n)&1
- 将一个数的第n位的二进制修改为
1
- num|(1<<n)
- 将一个数的第n位的二进制修改为
0
- num&(~(1<<n))
- 提取一个数,二进制表示中最右侧的
1
- num&(-num)
(-num)
的操作,会将最右侧的1
的左边区域全部变为相反数。
- 将一个数,二进制表示中最右侧的
1
变为0
- num & (num-1)
位图思想
利用一个数的二进制位来记录信息
异或运算规律
- num^0 = num
- num^num = 0(偶数消消乐)
- a^b^c = a^(c^b)
前缀和(常常需要多添加一行一列来解决边界问题)
一维前缀和:dp[i] = dp [i-1] + nums
矩阵前缀和:画图计算即可(下图中ret为右下角矩阵的大小),其中坐标的计算为了防止越界,可以采用例如
算法基础思维——附带题单
https://weihehe.top/2024/10/02/算法基础/