随笔分类 - c++
摘要:Search in Rotated Sorted Array Problem Follow up for "Search in Rotated Sorted Array":What if duplicates are allowed? Would this affect the run-time c
阅读全文
摘要:Problem Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2). You are given a t
阅读全文
摘要:Problem A peak element is an element that is greater than its neighbors. Given an input array where num[i] ≠ num[i+1], find a peak element and returni
阅读全文
摘要: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
阅读全文
摘要:问题: 奇偶判断 思路: 使用 & 进行奇偶判断,比直接使用 % 高效很多 实现: C++: 输出: 分析: 先了解下位运算符 & ,两个数用 & 进行位运算,本质上就是两个数的2进制运算,在运算过程中,只有 1 & 1 的结果是1,其他结果都是 0,如图: 1的2进制是 0000 0001,任何数
阅读全文
摘要:问题: 找出字符串中的最长回文子串 思路: 举例分析下,例如 ”abadaba“ 这个字符串的计算 1、从左往右遍历,整个字符串,把每个字符和字符间的空隙当作回文的中心,然后向两边扩展来找到最长回文串,这种情况下默认得对每一个字符进行计算,计算量比较大,而且有部分计算其实能通过之前的计算得到答案,后
阅读全文
摘要:简介: Sunday算法是Daniel M.Sunday于1990年提出的一种字符串模式匹配算法。其核心思想是:在匹配过程中,模式串并不被要求一定要按从左向右进行比较还是从右向左进行比较,它在发现不匹配时,算法能跳过尽可能多的字符以进行下一步的匹配,从而提高了匹配效率。 思路: Sunday 算法
阅读全文
摘要:寻找未排序数组的中位数,简单粗暴的方法是先排序后输出中位数索引处的数,但是基于比较的排序算法的时间复杂度为 O(nlogn), 不符合题目要求。线性时间复杂度的排序算法常见有计数排序、桶排序和基数排序,这三种排序方法的空间复杂度均较高,且依赖于输入数据特征(数据分布在有限的区间内),用在这里并不是比
阅读全文
摘要:此题要求返回新数组。由于可以生成新数组,故使用常规思路按顺序遍历即可。 C++: JAVA: 源码分析 分三步走,后面分别单独处理剩余的元素。 复杂度分析 遍历 A, B 数组各一次,时间复杂度 O(n), 空间复杂度 O(1). Challenge 两个倒排列表,一个特别大,一个特别小,如何 Me
阅读全文
摘要:因为本题有 in-place 的限制,故必须从数组末尾的两个元素开始比较;否则就会产生挪动,一旦挪动就会是 O(n^2) 的。自尾部向首部逐个比较两个数组内的元素,取较大的置于数组 A 中。由于 A 的容量较 B 大,故最后 m == 0 或者 n == 0 时仅需处理 B 中的元素,因为 A 中的
阅读全文
摘要:在上题基础上加了限制条件元素最多可重复出现两次。~~因此可以在原题的基础上添加一变量跟踪元素重复出现的次数,小于指定值时执行赋值操作。但是需要注意的是重复出现次数occurence的初始值(从1开始,而不是0)和reset的时机。~~这种方法比较复杂,核心思想仍然是两根指针,只不过此时新索引自增的条
阅读全文
摘要:题解 使用两根指针(下标),一个指针(下标)遍历数组,另一个指针(下标)只取不重复的数置于原数组中。 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指向下一
阅读全文
摘要:题解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++: 源码分析 为避免对单个子串和是否为最小情形的单独考虑,我们可
阅读全文

浙公网安备 33010602011771号