2020 leetcode 刷题记录

刷题

  • 杂题
  • 链表
  • 位运算
  • 双指针
  • 单调栈
  • 二叉树
  • 字符串
  • 动态规划
  • 二分

杂题

二叉树的三种迭代遍历: code
十种排序
leetcode 347. 前 K 个高频元素巧妙使用快排的思想
leetcode 399. 除法求值 带权并查集
leetcode 621. 任务调度器 设计题
leetcode 152. 乘积最大子数组 空间O(1) 时间O(N) dp 优化空间
leetcode 41. 缺失的第一个正数: 找出数组中未出现的最小正整数,空间O(1) 时间O(N) 。两种方法:1、原地hash做标记 2、原地置换
leetcode 面试题 10.10. 数字流的秩: 树状数组模板题
leetcode 164. 最大间距: 在O(n)时间内找到数组内任意两个元素之间的最大间距。 利用桶排序的思想,将数组分成k个桶维护每个桶的最大值和最小值。 桶的容量为数组(max-min)/(n-1)即平均间距, 最大间距一定大于这个平均间距即能保证最大间距一定出现在桶之间。
leetcode 220. 存在重复元素 III: 判断是否存在两个元素相距不大于k,且差的绝对值小于t。同样利用桶排序的思想,桶大小为t+1,每个桶只需要存放一个元素即可 + 滑动窗口。

sort(box.begin(),box.end(),[](const vector<int>& a,const vector<int>& b){return a[2] < b[2];});

链表

快慢指针的妙用:找中间值,找第n个节点,找环,找交点

leetcode 面试题 02.03. 删除中间节点 链表简单题。。
leetcode 面试题 02.04. 分割链表 不使用额外的空间,原地修改。

位运算

最后一位1: n&(-n)、 (n&(n-1))^n
while(n) n&=(n-1); 计算二进制1的个数
leetcode 137. 只出现一次的数字 II 数组中除一个数字出现一次,其余都出现三次。 按位模3求解。或设计类似自动机(较难)

leetcode 260. 只出现一次的数字 III 数组中有两个数字只出现一次,其余都出现两次。 根据两个数字不同,按照他们的异或结果为1的那一位分成两组,转换成简单问题。

leetcode 421. 数组中两个数的最大异或值 数组中任意两个数字的最大异或值。 字典树+位运算 或 前缀和哈希
leetcode 面试题 17.19. 消失的两个数字 寻找n个数字中消失的两个数字。参考 leetcode 260 的思路,按照整体异或结果分组,才通过分组异或求解。

双指针

leetcode 16. 最接近的三数之和 数组中任意三个数字的和与目标值最接近。 排序+枚举+双指针
leetcode 面试题 16.16. 部分排序 双指针,找出乱序的最大区间,右边界为 左边存在数大于边界

单调栈

二叉树

最近公共祖先问题
leetcode 面试题 04.09. 二叉搜索树序列 deque+递归

字符串

leetcode 面试题 01.09. 字符串轮转 只扫描一次,s1+s1, 找s2 KMP
leetcode 394. 字符串解码 递归解码
leetcode 647. 回文子串 manacher模板

动态规划

leetcode 面试题 17.24. 最大子矩阵 将一维数组的最大子数组和应用至二维
leetcode 面试题 17.06. 2出现的次数 数位dp
leetcode 32. 最长有效括号 掌握dp和栈两种做法
leetcode 188. 买卖股票的最佳时机 IV 股票类型问题通解dp[n][k][0|1]

二分

leetcode 410. 分割数组的最大值 将数组分成m段求,每段和的最小值是多少。 dp O(n^2m), 二分 O(nlogSum)均可解
leetcode 面试题 10.03. 搜索旋转数组
leetcode 546. 移除盒子 类似于消消乐,给一行数字,连续相同的k个数字可以消除获得效益K*K。dfs+dp 考虑最右边的数字怎么消除,单独消除或者配合左边中间某个相同的数字消除。

dp[i][j][k] 表示区间[i,j]左边有k个与num[j]相同时获得最大收益

你可能感兴趣的:(刷题)