自定义 Std::sort 对比函数时的陷阱

前言:记录这个案例的目的,是为了说明: 堆内存溢出这样的错误,可能是由于错误地自定义了一个 compare 函数而引起的。 这两者之间似乎没什么直接联系,若不是碰巧有 Address Sanitizer 的帮助,基于之前的认知,可能发现问题和定位原因都很困难。 之前在 LeetCode 上做【179. 最大数 】这道题时写了如下代码: 1bool comp3(const int a, const int b) { 2 if (a == b) { 3 return true; 4 } 5 string sa = to_string(a); 6 string sb = to_string(b); 7 return sa + sb …

并查集与搜索的联系

在 LeetCode 上练习时了解到,并查集 这一数据结构比较常用于解决图论方面的问题,其应用场景与搜索有很多重叠。例如,两者都可用于求无向图中连通分量 (connected component or just component)的个数。下图1中就有三个连通分量,分别以不同颜色标出: LeetCode 例题:547. 省份数量 并查集 鉴于 STL 没有实现并查集(已知 Boost 有),我们需要自己动手实现:以 vector<int> 为本体,辅以 get_root() 和 merge_set() 两个函数,即可完成。注意,此实现舍弃了性能的完整性2,追求的目标是代码量小、功能够用,适用于做题和笔试场景。 值得注意的 …

从一段 Android 源码说开去

总结 在成员函数内声明的 static 变量,其生命周期依旧是整个程序,与类对象的数量、构造和销毁无关; 对一般函数及静态成员函数而言,函数名等同于函数指针;而对非静态成员函数而言,上述不成立; 构造 std::thread 的背后是 std::invoke() 一、成员函数中的 static 变量 这些天在工作中接触到了这样一段 Android 源码(可通过此处 查看): 1// android-10.0.0_r30, frameworks/native/libs/gui/Surface.cpp 2class FenceMonitor { 3public: 4 explicit FenceMonitor(const char* …

【前缀+Hash】与【双指针】的区别

注:双指针法俗称“滑动窗口”,但我不喜欢这个名称,因为这给人感觉是一个固定长度的窗口在(数组上)滑动,而实际上该方法中的“窗口”长度不是固定的,更像个手风琴或弹簧。 例题 前缀+Hash:560. 和为K的子数组 给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。 示例 1 : 1输入:nums = [1,1,1], k = 2 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。 题解: 1class Solution { 2public: 3 int subarraySum(vector<int>& nums, int k) { 4 …

差分数列

概念 数列 $a$,$b$ 满足以下条件: $$ \begin{align*} b_1 &= a_1\\ b_2 &= a_2 - a_1\\ &\vdots\\ b_n &= a_n - a_{n-1} \end{align*} $$ 故有: $$ \begin{align*} a_1 &= b_1\\ a_2 &= b_1 + b_2\\ &\vdots\\ a_n &= b_1 + b_2 + \cdots + b_n \end{align*} $$ 其中称 $b$ 为 $a$ 的差分(Difference Array),$a$ 为 $b$ 的前缀和(Prefix Sum Array)。两者为一组逆运算。 用法 差分数列的一个 …