进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
这题本身不难,O(1)
复杂度要想想。
这题学到一个
摩尔投票法:
核心就是对拼消耗。
玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。
那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。
最后能剩下的必定是自己人。
给你一个整数数组nums
,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个32-位整数。子数组是数组的连续子序列。
这个题还挺有意思的,跟之前的题不太一样。
0
在子数组中,这个子数组一定乘积为0
O(n^2)
的算法这个似乎比较经典。只是实现功能比较简单,还要注意这个规则:
函数
get
和put
必须以O(1)
的平均时间复杂度运行。
关键就是如何用O(1)
时间维护最久未使用的key,JS的数组移动元素不是O(1)
的,应该用链表
思考了一下还得是双向链表。自己实现了一下。
/**
* @param {number} capacity
*/
var LRUCache = function (capacity) {
this.capacity = capacity;
this.kv = new Map();
this.head = {...
给你一个字符串 s 和一个字符串列表 wordDict 作为字典。请你判断是否可以利用字典中出现的单词拼接出 s 。
注意:不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。
这个题应该就是递归回溯,解法代码如下,但是有一种场景会超时
这个方法会超时,最主要的问题是 最后一个用例,其实wordDict里面 a aa aaa ... 都可以简化为a,就不会超时,打log分析了一下如果只有a,递归的数量级差距非常大
/**
* @param {string} s
* @param {string[]} wordDict
* @return {boole...