摘要:
一.二分搜索 1.二分查找的本质是:二段性。要想清楚二分成哪两段。[left,mid],[mid+1,right] 或者 [left,mid-1],[mid,right] 2.关于宫水二分查找模板的写法 可以看看这个题解,和她的写法一样,更加详细 N34在排序数组中查找元素的第一个位置和最后一个位置 阅读全文
摘要:
一,算法刷题的框架思维 1.数据结构基本操作:查增删改,遍历 遍历:线性:for/while遍历(数组,链表),非线性:递归遍历(链表,二叉树) 2.二叉树是最容易培养框架思维的,而且大部分算法技巧,本质上都是树的遍历问题 所以二叉树的遍历非常重要,尤其递归遍历(回溯,动规,分治,只要涉及到递归的问 阅读全文
摘要:
二.设计数据结构 1.LFU (1)LinkedHashMap,LinkedHashSet。使得链表拥有了随机访问的功能(数组具有随机访问的特点) (2)LFU算法中可以自顶向下编程,把重要重复代码抽象出来 (3)HashMap.putIfAbsent(key,val)方法 (4)LFU的实现还是挺 阅读全文
摘要:
1.局部最优,则全局最优 2.贪心没有套路,说白了就是常识性推导加上举反例 3.先想清楚局部最优,再想清楚全局最优 4.Arrays.binarySearch(arr, begin, end, key) 前包后不包 Arrays.equals(arr1,arr2) 判断两个数组是否相等。可以判断基本 阅读全文
摘要:
四.动态规划 代码随想录内容: 1.动态规划当前状态是由前面状态推导而来的,而贪心是局部直接选最优的 存在递推关系(存在状态转移),也就是当前状态是由前面状态推导而来的。可以使用动态规划 2.动态规划的解题步骤:(dp数组,状态转移公式,初始化,遍历顺序,举例子)(动规五部曲,类似前面的递归三部曲, 阅读全文
摘要:
1.排列组合:Anm,Cnm 2.递归遍历的时候,其实就是一条路径一条路径的遍历。也就是深度优先搜索 3.组合问题 (1)共享变量可以放入参数里面,但影响可读性。所以可以放在外面,就是全局变量 (2)for循环横向遍历,递归纵向遍历 (3)ArrayList有三个构造方法,可以传入一个Collect 阅读全文
摘要:
1.二叉树的一些概念:深度,高度。。。 2.熟记基础代码 二叉树遍历,二叉堆(上浮,下沉,构建堆),优先级队列 后续非递归遍历比较特殊, 优先级队列的实现要会 3.二叉树 (1)满二叉树 这棵二叉树为满二叉树,也可以说深度为k,有2^k-1个节点的二叉树 (2)完全二叉树 (3)二叉查找树:二叉查找 阅读全文
摘要:
一.图相关 1.图本质上可以认为是多叉树的延伸。面试笔试中很少出现图问题,就算有,也是简单的遍历问题,基本上可以完全照搬多叉树的遍历 1 //基本的N叉树节点 2 class TreeNode{ 3 int val; 4 TreeNode[] children; 5 } 6 //图节点的逻辑结构 7 阅读全文
摘要:
1.replace(oldstr,newstr)和replaceAll(regex,newstr)功能一样,但前者效率更高 区别:replaceAll的第一个参数支持正则表达式 2.算法题中除了String的方法要熟悉,StringBuilder也很常用,方法也要熟悉 3.双指针法是字符串处理的常客 阅读全文
摘要:
1.哈希表是根据关键码的值直接进行存储的数据结构 其他数据结构某一位置存储的数据和位置无关,而哈希表相关:index=hash(key)=hashCode(key)%tableSize 通过哈希函数可以把key转化为index,然后里面存储value 2.哈希冲突的解决方法:拉链法,线性探测法 3. 阅读全文
摘要:
字符串 阅读全文
摘要:
1.设置虚拟头节点(dummy)的作用 链表分为:空链表和非空链表 头结点比较特殊:没有前一个指针指向头结点(没有前一个节点) 设置了虚拟头结点,那么对于头结点上的操作就比较方便了 (1)有些操作,对于只有一个节点的链表和对于有多个节点的链表是不一样的 (2)对于非空链表来说,有些操作在首节点和在其 阅读全文
摘要:
三.数组 1.二分法 (1) 二分法前提条件:有序(单调) (2)二分法要明白查找区间的定义 查找区间的定义决定了二分法的写法。写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。 (3)二分法最常用的几个场景:查找目标值,查找左右边界。 阅读全文