随笔分类 -  java

摘要:Problem Write an efficient algorithm that searches for a value in an m x n matrix, return the occurrence of it. This matrix has the following properti 阅读全文
posted @ 2020-02-16 20:37 凌雨尘 阅读(133) 评论(0) 推荐(0)
摘要:Problem Write an efficient algorithm that searches for a value in an m x n matrix. This matrix has the following properties: Integers in each row are 阅读全文
posted @ 2020-02-16 20:25 凌雨尘 阅读(136) 评论(0) 推荐(0)
摘要:Problem Given a sorted array of n integers, find the starting and ending position ofa given target value. If the target is not found in the array, ret 阅读全文
posted @ 2020-01-12 15:47 凌雨尘 阅读(143) 评论(0) 推荐(0)
摘要:最小生成树 所谓最小生成树,就是一个图的极小连通子图,它包含原图的所有顶点,并且所有边的权值之和尽可能的小。 首先看看第一个例子,有下面这样一个带权图: 它的最小生成树是什么样子呢?下图绿色加粗的边可以把所有顶点连接起来,又保证了边的权值之和最小: 去掉那些多余的边,该图的最小生成树如下: 下面我们 阅读全文
posted @ 2019-07-11 18:20 凌雨尘 阅读(2871) 评论(3) 推荐(1)
摘要:找第 K 大数,基于比较的排序的方法时间复杂度为 O(n), 数组元素无区间限定,故无法使用线性排序。由于只是需要找第 K 大数,这种类型的题通常需要使用快排的思想解决。Quick Sort 总结了一些经典模板。这里比较基准值最后的位置的索引值和 K 的大小关系即可递归求解。 JAVA: 源码分析 阅读全文
posted @ 2019-05-22 14:22 凌雨尘 阅读(397) 评论(0) 推荐(0)
摘要:将数组中的奇数和偶数分开,使用『两根指针』的方法最为自然,奇数在前,偶数在后,若不然则交换之。 JAVA: 源码分析 注意处理好边界即循环时保证left < right. 复杂度分析 遍历一次数组,时间复杂度为 O(n), 使用了两根指针,空间复杂度 O(1). 阅读全文
posted @ 2019-04-16 17:15 凌雨尘 阅读(181) 评论(0) 推荐(0)
摘要:寻找未排序数组的中位数,简单粗暴的方法是先排序后输出中位数索引处的数,但是基于比较的排序算法的时间复杂度为 O(nlogn), 不符合题目要求。线性时间复杂度的排序算法常见有计数排序、桶排序和基数排序,这三种排序方法的空间复杂度均较高,且依赖于输入数据特征(数据分布在有限的区间内),用在这里并不是比 阅读全文
posted @ 2019-04-09 10:05 凌雨尘 阅读(644) 评论(0) 推荐(0)
摘要:此题要求返回新数组。由于可以生成新数组,故使用常规思路按顺序遍历即可。 C++: JAVA: 源码分析 分三步走,后面分别单独处理剩余的元素。 复杂度分析 遍历 A, B 数组各一次,时间复杂度 O(n), 空间复杂度 O(1). Challenge 两个倒排列表,一个特别大,一个特别小,如何 Me 阅读全文
posted @ 2019-04-02 11:12 凌雨尘 阅读(200) 评论(0) 推荐(0)
摘要:因为本题有 in-place 的限制,故必须从数组末尾的两个元素开始比较;否则就会产生挪动,一旦挪动就会是 O(n^2) 的。自尾部向首部逐个比较两个数组内的元素,取较大的置于数组 A 中。由于 A 的容量较 B 大,故最后 m == 0 或者 n == 0 时仅需处理 B 中的元素,因为 A 中的 阅读全文
posted @ 2019-03-25 10:42 凌雨尘 阅读(161) 评论(0) 推荐(0)
摘要:在上题基础上加了限制条件元素最多可重复出现两次。~~因此可以在原题的基础上添加一变量跟踪元素重复出现的次数,小于指定值时执行赋值操作。但是需要注意的是重复出现次数occurence的初始值(从1开始,而不是0)和reset的时机。~~这种方法比较复杂,核心思想仍然是两根指针,只不过此时新索引自增的条 阅读全文
posted @ 2019-03-14 10:41 凌雨尘 阅读(131) 评论(0) 推荐(0)
摘要:题解 使用两根指针(下标),一个指针(下标)遍历数组,另一个指针(下标)只取不重复的数置于原数组中。 C++: JAVA: 源码分析 注意最后需要返回的是索引值加1。 复杂度分析 遍历一次数组,时间复杂度 O(n), 空间复杂度 O(1). 阅读全文
posted @ 2019-02-18 14:38 凌雨尘 阅读(120) 评论(0) 推荐(0)
摘要:题解1 - 哈希表 找两数之和是否为target, 如果是找数组中一个值为target该多好啊!遍历一次就知道了,我只想说,too naive... 难道要将数组中所有元素的两两组合都求出来与target比较吗?时间复杂度显然为 O(n2), 显然不符题目要求。找一个数时直接遍历即可,那么可不可以将 阅读全文
posted @ 2019-01-21 15:12 凌雨尘 阅读(205) 评论(0) 推荐(0)
摘要:A:为什么MySQL数据库要用B+树存储索引? Hash的查找速度为O(1),而树的查找速度为O(log2n),为什么不用Hash作为数据库的存储索引呢? 树的话,无非就是前中后序遍历、二叉树、二叉搜索树、平衡二叉树,更高级一点的有红黑树、B树、B+树。 【红黑树】 红黑树也是平衡树中的一种,它复杂 阅读全文
posted @ 2018-12-26 15:52 凌雨尘 阅读(1013) 评论(0) 推荐(0)
摘要:首先可以想到逐步移位,但是这种方法显然太浪费时间,不可取。下面介绍利器『三步翻转法』,以[4, 5, 1, 2, 3]为例。 由以上3个步骤可知其核心为『翻转』的in-place实现。使用两个指针,一个指头,一个指尾,使用for循环移位交换即可 JAVA: C++: 源码分析 首先找到分割点,随后分 阅读全文
posted @ 2018-12-20 11:39 凌雨尘 阅读(236) 评论(0) 推荐(0)
摘要:题解 题目大意是找第 n 个数(字符串表示),规则则是对于连续字符串,表示为重复次数+数本身。 后一个数等于前一个数的计数(字符串表示),有点类似斐波那契数列 JAVA: 源码分析 字符串是动态生成的,故使用 StringBuilder 更为合适。注意s 初始化为"1", 第一重 for循环中注意循 阅读全文
posted @ 2018-12-06 16:01 凌雨尘 阅读(245) 评论(0) 推荐(0)
摘要:题解 关键点在于确定最后一个字符串之前的空格,此外还需要考虑末尾空格这一特殊情况,故首先除掉右边的空白字符比较好。 JAVA: 源码分析 两根指针。 复杂度分析 遍历一次,时间复杂度 O(n). 阅读全文
posted @ 2018-12-06 15:51 凌雨尘 阅读(157) 评论(0) 推荐(0)
摘要:题解 字符串的通配实现。'?'表示匹配单一字符,'*'可匹配任意多字符串(包含零个)。要匹配的字符串设为s, 模式匹配用的字符串设为p,那么如果是普通字符,两个字符串索引向前推进一位即可,如果p中的字符是?也好办,同上处理,向前推进一位。所以现在的关键就在于如何处理'*', 因为*可匹配0, 1, 阅读全文
posted @ 2018-12-05 16:27 凌雨尘 阅读(154) 评论(0) 推荐(0)
摘要:题解 根据题意,给定的输入数组长度足够长,将空格替换为%20 后也不会溢出。通常的思维为从前向后遍历,遇到空格即将%20 插入到新数组中,这种方法在生成新数组时很直观,但要求原地替换时就不方便了,这时可联想到插入排序的做法——从后往前遍历,空格处标记下就好了。由于不知道新数组的长度,故首先需要遍历一 阅读全文
posted @ 2018-12-04 14:49 凌雨尘 阅读(159) 评论(0) 推荐(0)
摘要:最简单的方案,穷举所有可能的子串,判断子串是否为回文,使用一变量记录最大回文长度,若新的回文超过之前的最大回文长度则更新标记变量并记录当前回文的起止索引,最后返回最长回文子串。 C++: JAVA: 源码分析 使用left, right作为子串的起止索引,用于最后构造返回结果,避免中间构造字符串以减 阅读全文
posted @ 2018-12-04 14:45 凌雨尘 阅读(114) 评论(0) 推荐(0)
摘要:字符串的回文判断问题,由于字符串可随机访问,故逐个比较首尾字符是否相等最为便利,即常见的『两根指针』技法。此题忽略大小写,并只考虑字母和数字字符。 C++: JAVA: 源码分析 两步走: 字符的判断尽量使用语言提供的 API 复杂度分析 两根指针遍历一次,时间复杂度 O(n), 空间复杂度 O(1 阅读全文
posted @ 2018-12-03 14:06 凌雨尘 阅读(118) 评论(0) 推荐(0)