算法思路速查 & Tips

整理中

算法分类

1.贪心算法

2.回溯 & 递归

3.双指针法(排序)(n)

4.滑动窗口(n)

5.前缀和(n)

  • 求数组的连续子数组和类的问题,可以用到前缀和或滑动窗口、双指针,具体看复杂度要求。前缀和+二分法复杂度O(nlog(n))。

leetcode 325. 和等于 k 的最长子数组长度

6.二分法-复杂度O(log(n))

  • 第k小数
  • 复杂度要求log(n)或nlog(n),想到结合二分法、树、堆等结构

7. 单调栈

8. Trie树

  使用字典树的目的是查找某一个串 s 是否在一个串的集合 SS当中,并且当我们知道 s 是否在 S 中之后,可以快速的知道在 s 后添加某一个新的字母得到的新串 s’是否在 S 中,这个转移的过程是 O(1) 的。这是我们采用字典树而放弃使用 HashMap 类容器的一个理由,这些容器不能实现 s到 s’的 O(1)转移,但字典树可以。

9. 字符串哈希

题目类型

一、数组类

Ⅰ 数组中重复值

  1. 二进制
  • 数组范围1~n,可以通过比较数组所有数某位的1 的总个数和1~n的差别
    在这里插入图片描述
  • 异或,相同数异或为0
  1. 置换到与下标一致的位置

  2. 抽屉原理
    在这里插入图片描述

  3. 环形链表+快慢指针(奇葩)

  • 对 nums[] 数组建图,每个位置 i 连一条i→nums[i] 的边。由于存在的重复的数字 target,因此 target 这个位置一定有起码两条指向它的边,因此整张图一定存在环,且我们要找到的 target 就是这个环的入口,那么整个问题就等价于环形链表的入口,用快慢指针。

Ⅱ 缺失的值

给定数组范围1~n首先可以确定:
   对于一个长度为 NN的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。这是因为如果 [[1,N] 都出现了,那么答案是 N+1,否则答案是 [1, N] 中没有出现的最小正整数

  1. 用下标 i 标记数字i是否出现
  2. 置换到对应位置

二、二叉树类

Ⅰ遍历

  • 在一些题目中需要转换为前序、中序或后序遍历来解决,根据不同题目场景,需要调整遍历的顺序,如114.二叉树展开为链表,思路是每次将左字数挂到右子树上,但是会丢失原本右子树的信息,因此使用右-左-中的后序顺序遍历,结合栈,保存根节点,保证了先把右子树保存,避免丢失。
    (

三、图

深度优先遍历 & 广度优先遍历

Ⅰ环

  1. leetcode 210 课程表
    有先修课程,判断是否能顺序修完所有课程。判断是否有环,无环则可以成功。使用三个标记判断在遍历的过程中是否有环:
  • 【已完成】-- 所有邻居节点都已遍历;
  • 【遍历中】– 遍历了部分邻居,说明当前节点就是在此【遍历中】的节点递归遍历到的,一旦遇到遍历中的节点就说明成环;
  • 【未遍历】-- 继续递归遍历此节点。

Tips

  1. 比较长度不同的字符串时,短的可以赋值为0 (在非负数的情况下)leetcode 165 比较版本号
//这个技巧经常用到,当一个已经遍历结束的话,我们将其赋值为 0
        String num1 = i < nums1.length ? nums1[i] : "0";
        String num2 = j < nums2.length ? nums2[j] : "0";


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值