Cpaulyz / algorithm

算法题

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

算法题

做题记录

岛屿系列问题

,比如:

200. 岛屿数量:并查集解决

463. 岛屿的周长:遍历解决

695. 岛屿的最大面积

827. 最大人工岛

二分查找

35. 搜索插入位置

300. 最长递增子序列

难度简单837

分析题意,挖掘题目中隐含的 单调性;

  • while (left < right) 退出循环的时候有 left == right 成立,因此无需考虑返回 left 还是 right;
  • 始终思考下一轮搜索区间是什么,如果是[mid, right]就对应 left = mid ,如果是[left, mid - 1]就对应 right = mid - 1,是保留 mid 还是 +1+1、-1−1 就在这样的思考中完成;
  • 从一个元素什么时候不是解开始考虑下一轮搜索区间是什么 ,把区间分为 22 个部分(一个部分肯定不存在目标元素,另一个部分有可能存在目标元素),问题会变得简单很多,这是一条 非常有用 的经验;
  • 每一轮区间被划分成 2 部分,理解 区间划分 决定中间数取法( 无需记忆,需要练习 + 理解 ),在调试的过程中理解 区间和中间数划分的配对关系:
    • 划分 [left, mid][mid + 1, right],mid 被分到左边,对应 int mid = left + (right - left) / 2;
    • 划分[left, mid - 1] [mid, right] ,mid 被分到右边,对应 int mid = left + (right - left + 1) / 2;

模板

滑动窗口

def findSubstring(s):
    N = len(s) # 数组/字符串长度
    left, right = 0, 0 # 双指针,表示当前遍历的区间[left, right],闭区间
    counter = collections.Counter() # 用于统计 子数组/子区间 是否有效
    res = 0 # 保存最大的满足题目要求的 子数组/子串 长度
    while right < N: # 当右边的指针没有搜索到 数组/字符串 的结尾
        counter[s[right]] += 1 # 增加当前右边指针的数字/字符的计数
        while 区间[left, right]不符合题意# 此时需要一直移动左指针,直至找到一个符合题意的区间
            counter[s[left]] -= 1 # 移动左指针前需要从counter中减少left位置字符的计数
            left += 1 # 真正的移动左指针,注意不能跟上面一行代码写反
        # 到 while 结束时,我们找到了一个符合题意要求的 子数组/子串
        res = max(res, right - left + 1) # 需要更新结果
        right += 1 # 移动右指针,去探索新的区间
    return res

二分

https://leetcode-cn.com/problems/find-minimum-in-rotated-sorted-array/solution/yi-wen-dai-ni-gao-ding-er-fen-cha-zhao-j-00kj/

TODO

https://leetcode-cn.com/problems/implement-strstr/ KMP

1473. 粉刷房子 III

About

算法题


Languages

Language:C++ 95.2%Language:Java 4.8%