分类目录归档:算法基础

【置顶】基础理论目录


基础理论

刷题方法
资源推荐
算法数据结构
时间/空间复杂度
数组 array
链表 linked list
队列


哈希表
排序
LRU Cache
递归

trie 树
并查集
深度优先搜索 & 广度优先搜索
启发式搜索
分治 回溯
贪心算法 Greedy
bloomfilter
二分查找

动态规划
高级搜索
位运算
字符串
加密算法

Read more

刷题方法


一般方法

记忆细节,反复练习
打破惯性,机器思维

练习重点

分治、回溯、递归、动态规划

核心思维

升维
空间换时间

刷题技巧

outliers

  • Chunk it up 切碎知识点
  • Deiliberate practicing 刻意练习
过遍数(五) 
刷题第一遍 5~15分钟思考
直接看解法,多解法的比较解法优劣
刷题第四遍/第五遍 的时候一定要上英文站 discuss board 中 查看 Most Votes 中最高票的前三个回答
练习缺陷,弱点的地方  
不舒服,不爽,枯燥  
生活中的例子: 乒乓球,台球,玩游戏等
  • Feed back 获得反馈

    主动型反馈 (自己去找)

Read more

资源推荐


附件

https://github.com/wangxiuwen/data_structures_and_algorithms.git

labuladong

labuladong
labuladong 的整理

花花酱

花花酱 YouTube
花花酱LeetCode B
花花酱代码
花花酱题目分类

Back To Back SWE

Back To Back SWE

绵羊教授

绵羊教授

小Q刷题

nat8023

公瑾

个人主页 源码

王争

王争的 数据结构和算法必知必会的50个代码实现

参考资料

数据结构和算法动态可视化

算法数据结构脑图

数据结构脑图
算法脑图

练习网站

learnGitBran

Read more

字符串


字符串

两个字符串变换问题,一般要转成一个二维数组,两个字符串分别为字符串的行和列

定义及常见操作

string immutable

python:

x = 'abbc'
for ch in x: 
    print(ch)

Java:

String x = "abbc";
String y = "abbc";

for (int i = 0; i < x.length(); ++i) {
    char ch = x.charAt(i);
}
for (char ch : x.toCharArray()) {
    Sys

Read more

位运算


原码反码补码

  • 补码(twos complement) 在计算机系统中,数值一律用补码来表示(存储)。 主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。另外,两个用补 码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
  • 正数的原码补码反码相同
  • 负数的反码是对其原码逐位取反(符号位除外)
  • 负数的补码是对其原码逐位取反(符号位除外),然后整个数加1

XOR - 异或

异或: 相同为 0,不同为 1。也可用“不进位加法”来理解。 异或操作的一些特点:

  • x ^ 0 =x
  • x ^ 1s = ~x // 注意 1s = ~0
  • x ^ (~x) = 1s (1s

Read more

搜索


搜索

剪枝 双向 BFS 启发式搜索(A*)

初级搜索

  1. 朴素搜索
  2. 优化方式: 不重复(fibnacci)、剪枝(生成括号问题)
  3. 搜索方向:

    DFS: depth first search 深度优先搜索
    BFS: breadth first search 广度优先搜索

    双向搜索、启发式搜索

Read more

动态规划 dynamic programming


定义

https://en.wikipedia.org/wiki/Dynamic_programming
https://zh.wikipedia.org/wiki/动态规划

  • "Simplifying a complicated problem by breaking it down into simpler subproblems"(in a recursive manager)
  • Divide & Conquer + Optimal substructure (分治+最优子结构)

DP 顺推模板

function DP():
dp = [][] # 二维情况
for i = 0 

Read more

二分查找


二分查找

  • 目标函数单调性(单调递增或者递减)
  • 存在上下界(bounded)
  • 能够通过索引访问(index accessible)

代码模版

循环

left, right = 0, len(array) -1
while left <= right:
  mid = (left+right)/2
  if array[mid] == target:
    # find the target
    break or return result
  elif array[mid] < target:
    left = mid + 1 # 左右下界为整型需要加一减一,左右下界如

Read more