荒野老男人

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

原文

这个题自己想的解法:

  • 先找到所有1
  • 从第一个1开始拓展(搜索上下左右),拓展的同时做标记避免重复搜索
  • 对所有1执行拓展(有些1直接通过标记即可略过)

我觉得我这个实现方法应该性能很好,不知道为啥在leetcode上提交性能在后6%

var numIslands = function (grid) {
    let ones = [];
    const all = Array(grid.length + 2)
        .fill(0)
        .map(() => Array(grid[0].length + 2).fill(0));...

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/house-robber 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这题一看就是动态规划,需要做的就是找出规律,有点类似于数学归纳。

简单验算一下

    //...

原文

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

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

这题学到一个

摩尔投票法:

核心就是对拼消耗。

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

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

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

原文

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

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

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

原文

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

函数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...