荒野老男人

愿你永远年轻,永远热泪盈眶

原文

进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。

这题本身不难,O(1)复杂度要想想。

这题学到一个

摩尔投票法:

核心就是对拼消耗。

玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。

那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。

最后能剩下的必定是自己人。

原文

给你一个整数数组nums,请你找出数组中乘积最大的非空连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。测试用例的答案是一个32-位整数。子数组是数组的连续子序列。

这个题还挺有意思的,跟之前的题不太一样。

  • 如果0在子数组中,这个子数组一定乘积为0
  • 所以可以把数组用0分割为若干个数组,再单独从这些数组中寻找子数组
  • 因为是乘法,当数值都是正数时,肯定是子数组元素个数越多乘积越大
  • 负数个数为偶数可以直接当正数
  • 这个题的测试用例数组长度最大2w,肯定不能用O(n^2)的算法
  • 所以一个序列,其中的负数,相当于只有1个或...

突发奇想想到了这个问题,看了看网上的讨论,底层还是看movcmp两个汇编指令更快(需要更多时钟周期)

链接

原文

这个似乎比较经典。只是实现功能比较简单,还要注意这个规则:

函数getput必须以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...

这题是简单难度,原文

用一个map记录出现过的数字,再次出现就删除,最后只会剩下一个。

var singleNumber = function(nums) {
    const has = {};
    for (let i = 0; i < nums.length; i++) {
        let num = nums[i];
        if (has[num] === undefined) {
            has[num] = num;
        } else {
            delete has[num];
        }...