随笔分类 - algorithms
摘要:题解 使用两根指针(下标),一个指针(下标)遍历数组,另一个指针(下标)只取不重复的数置于原数组中。 C++: JAVA: 源码分析 注意最后需要返回的是索引值加1。 复杂度分析 遍历一次数组,时间复杂度 O(n), 空间复杂度 O(1).
阅读全文
摘要:题解1 - 排序 + 2 Sum + 两根指针 + 优化过滤 和 3 Sum 的思路接近,首先对原数组排序,随后将3 Sum 的题拆解为『1 Sum + 2 Sum』的题,对于 Closest 的题使用两根指针而不是哈希表的方法较为方便。对于有序数组来说,在查找 Cloest 的值时其实是有较大的优
阅读全文
摘要:题解1 - 排序 + 哈希表 + 2 Sum 相比之前的 2 Sum, 3 Sum 又多加了一个数,按照之前 2 Sum 的分解为『1 Sum + 1 Sum』的思路,我们同样可以将 3 Sum 分解为『1 Sum + 2 Sum』的问题,具体就是首先对原数组排序,排序后选出第一个元素,随后在剩下的
阅读全文
摘要:题解1 - 哈希表 找两数之和是否为target, 如果是找数组中一个值为target该多好啊!遍历一次就知道了,我只想说,too naive... 难道要将数组中所有元素的两两组合都求出来与target比较吗?时间复杂度显然为 O(n2), 显然不符题目要求。找一个数时直接遍历即可,那么可不可以将
阅读全文
摘要:题解 容易想到的方案是先排序,然后遍历求得缺的最小整数。排序算法中常用的基于比较的方法时间复杂度的理论下界为 O(nlogn), 不符题目要求。常见的能达到线性时间复杂度的排序算法有 基数排序,计数排序 和 桶排序。 基数排序显然不太适合这道题,计数排序对元素落在一定区间且重复值较多的情况十分有效,
阅读全文
摘要:题解1 - 自左向右 容易想到的一个办法是自左向右遍历,使用right保存大于等于 k 的索引,i则为当前遍历元素的索引,总是保持i >= right, 那么最后返回的right即为所求。 C++: 源码分析 自左向右遍历,遇到小于 k 的元素时即和right索引处元素交换,并自增right指向下一
阅读全文
摘要:A:为什么MySQL数据库要用B+树存储索引? Hash的查找速度为O(1),而树的查找速度为O(log2n),为什么不用Hash作为数据库的存储索引呢? 树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树。 【红黑树】 红黑树也是平衡树中的一种,它复杂
阅读全文
摘要:题解1 - 左右分治 根据题意,有 result[i]=left[i]⋅right[i], 其中 left[i]=∏j(从左到右累乘), right[i]=∏j(从右到左累乘). 即将最后的乘积分为两部分求解,首先求得左半部分的值,然后求得右半部分的值。最后将左右两半部分乘起来即为解。 C++: 源
阅读全文
摘要:首先可以想到逐步移位,但是这种方法显然太浪费时间,不可取。下面介绍利器『三步翻转法』,以[4, 5, 1, 2, 3]为例。 由以上3个步骤可知其核心为『翻转』的in-place实现。使用两个指针,一个指头,一个指尾,使用for循环移位交换即可 JAVA: C++: 源码分析 首先找到分割点,随后分
阅读全文
摘要:题 Zero Sum Subarray | Data Structure and Algorithm 的变形题,由于要求的子串和不一定,故哈希表的方法不再适用,使用解法4 - 排序即可在 O(nlogn) 内解决。具体步骤如下: C++: 源码分析 为避免对单个子串和是否为最小情形的单独考虑,我们可
阅读全文
摘要:题解1 - 哈希表 题 Zero Sum Subarray | Data Structure and Algorithm 的升级版,这道题求子串和为 K 的索引。首先我们可以考虑使用时间复杂度相对较低的哈希表解决。前一道题的核心约束条件为 f(i1)−f(i2)=0,这道题则变为 f(i1)−f(i
阅读全文
摘要:题解1 - 两重 for 循环 题目中仅要求返回一个子串(连续)中和为0的索引,而不必返回所有可能满足题意的解。最简单的想法是遍历所有子串,判断其和是否为0,使用两重循环即可搞定,最坏情况下时间复杂度为 O(n^2), 这种方法显然是极其低效的,极有可能会出现 TLE. 下面就不浪费篇幅贴代码了。
阅读全文
摘要:题解 题目大意是找第 n 个数(字符串表示),规则则是对于连续字符串,表示为重复次数+数本身。 后一个数等于前一个数的计数(字符串表示),有点类似斐波那契数列 JAVA: 源码分析 字符串是动态生成的,故使用 StringBuilder 更为合适。注意s 初始化为"1", 第一重 for循环中注意循
阅读全文
摘要:题解 关键点在于确定最后一个字符串之前的空格,此外还需要考虑末尾空格这一特殊情况,故首先除掉右边的空白字符比较好。 JAVA: 源码分析 两根指针。 复杂度分析 遍历一次,时间复杂度 O(n).
阅读全文
摘要:题解 字符串的通配实现。'?'表示匹配单一字符,'*'可匹配任意多字符串(包含零个)。要匹配的字符串设为s, 模式匹配用的字符串设为p,那么如果是普通字符,两个字符串索引向前推进一位即可,如果p中的字符是?也好办,同上处理,向前推进一位。所以现在的关键就在于如何处理'*', 因为*可匹配0, 1,
阅读全文
摘要:题解 根据题意,给定的输入数组长度足够长,将空格替换为%20 后也不会溢出。通常的思维为从前向后遍历,遇到空格即将%20 插入到新数组中,这种方法在生成新数组时很直观,但要求原地替换时就不方便了,这时可联想到插入排序的做法——从后往前遍历,空格处标记下就好了。由于不知道新数组的长度,故首先需要遍历一
阅读全文
摘要:最简单的方案,穷举所有可能的子串,判断子串是否为回文,使用一变量记录最大回文长度,若新的回文超过之前的最大回文长度则更新标记变量并记录当前回文的起止索引,最后返回最长回文子串。 C++: JAVA: 源码分析 使用left, right作为子串的起止索引,用于最后构造返回结果,避免中间构造字符串以减
阅读全文
摘要:字符串的回文判断问题,由于字符串可随机访问,故逐个比较首尾字符是否相等最为便利,即常见的『两根指针』技法。此题忽略大小写,并只考虑字母和数字字符。 C++: JAVA: 源码分析 两步走: 字符的判断尽量使用语言提供的 API 复杂度分析 两根指针遍历一次,时间复杂度 O(n), 空间复杂度 O(1
阅读全文
摘要:题目:给定N个人物和M组朋友关系,计算出他们之间形成多少个朋友圈 举个例子,比如现在有5个宠物,分别是小猫1,小猫2,小猫3,小狗1,小狗2。再告诉你小猫1和小狗1是好朋友,小猫2和小狗1是好朋友,小猫3和小狗2是好朋友。这样它们之间就形成了2个朋友圈。如下图: 分析:典型的图结构的数据结构,也可用
阅读全文
摘要:给定一个整数,从整数当中去掉k个数字,要求剩下数字形成的新整数尽可能小。 什么意思呢?让我们举几个栗子: 给定整数1593212,删去3个数字,新整数的最小情况是1212 给定整数30200,删去1个数字,新整数的最小情况是200 给定整数10,删去2个数字,新整数的最小情况是0 需要注意的是,给定
阅读全文

浙公网安备 33010602011771号