面试算法专栏
文章平均质量分 60
总结梳理面试中的数据结构和算法,包括数组、10大排序,链表、字符串、栈、队列、二叉树、图、递归算法、动态规划、回溯算法,贪心算法、分治算法、深度优先遍历和广度优先遍历、并查集、二分查找、双指针、滑动窗口等核心数据结构和算法。
HuFeiHu-Blog
知无涯者,虚心若愚,求知若饥,勇者天佑!
展开
-
面试算法大全-滑动窗口总结
17、 滑动窗口滑动窗口算法leetcode经典例题无重复字符的最长子串滑动窗口class Solution { public int lengthOfLongestSubstring(String s) { if(s.length()==0){ return 0; } int max=0; int start=0;//记录子字符串开始的位置 HashMap<Character,I原创 2021-06-14 09:51:47 · 347 阅读 · 0 评论 -
面试算法大全-双指针技巧总结
16、 双指针技巧 双指针具体就是用两个变量动态存储两个或多个结点,来方便我们进行一些操作。通常用在线性的数据结构中,比如链表和数组。常用的双指针思想有:快慢指针、碰撞指针、滑动窗口等。15.2.1 左右指针 //nums 数组中查找target的位置public int searchInsert(int[] nums, int target) { int left = 0, right = nums.length - 1; while(left <= ri原创 2021-06-14 09:50:41 · 286 阅读 · 0 评论 -
面试算法大全-二分查找总结
15、 二分查找public class BinarySearch { /** *第一种:递归 */ public static int recursionBinarySearch(int[]arr,int key,int low,int high){ if(key<arr[low]||key>arr[high]||low>high){ return-1; } int middle原创 2021-06-14 09:49:00 · 180 阅读 · 0 评论 -
面试算法大全-并查集总结
14 、并查集 并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。有一个联合-查找算法(Union-find Algorithm)定义了两个用于此数据结构的操作: Find:确定元素属于哪一个子集。它可以被用来确定两个元素是否属于同一子集。 Union:将两个子集合并成同一个集合。14.1 并查集总结并查集的实现public class QuickUnionUF { //存储若干棵树 private int[] parent原创 2021-06-14 09:47:51 · 174 阅读 · 0 评论 -
面试算法大全-深度优先遍历和广度优先遍历
13.1 深度优先遍历和广度优先遍历算法总结 广度优先搜索算法(Breadth-First-Search,缩写为 BFS),是一种利用队列实现的搜索算法。简单来说,其搜索过程和 “湖面丢进一块石头激起层层涟漪” 类似。 深度优先搜索算法(Depth-First-Search,缩写为 DFS),是一种利用递归实现的搜索算法。简单来说,其搜索过程和 “不撞南墙不回头” 类似。 BFS 的重点在于队列,而 DFS 的重点在于递归。这是它们的本质区别。原创 2021-06-14 09:46:07 · 472 阅读 · 2 评论 -
面试算法大全-分治算法总结
12、分治12.1 分治算法总结分治法在每一层递归上都有三个步骤: (1)分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题。 (2)求解:若子问题规模较小而容易被解决则直接解,否则递归地解各个子问题。 (3)合并:将各个子问题的解合并为原问题的解。//伪代码Divide-and-Conquer(P) if |P| ≤ n0 then return(ADHOC(P)) 将P分解为较小的子问题 P1 ,P2 ,...,Pk原创 2021-06-14 09:39:32 · 160 阅读 · 0 评论 -
面试算法大全-贪心算法总结
11、贪心11.1 贪心算法总结 贪心算法是指在每个阶段做选择的时候都做出当前阶段(或状态)最好的选择,并且期望这样做到的结果是全局最优解(但未必是全局最优解)。基本步骤步骤1:从某个初始解出发;步骤2:采用迭代的过程,当可以向目标前进一步时,就根据局部最优策略,得到一部分解,缩小问题规模;步骤3:将所有解综合起来。贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。11.2原创 2021-06-03 16:28:09 · 189 阅读 · 0 评论 -
面试算法大全-动态规划总结
动态规划三要素:(1)重叠子问题,(2)最优子结构,(3)状态转移方程。思考状态转移方程:明确[状态]—>定义dp数组/函数的含义—>明确选择—>明确base case动态规划解题范例:斐波那契数列的定义是 f(n + 1) = f(n) + f(n - 1),生成第 n 项的做法有以下几种:递归法:原理: 把 f(n)问题的计算拆分成 f(n-1和 f(n-2)两个子问题的计算,并递归,以 f(0)和 f(1)为终止条件。缺点: 大量重复的递归计算,例如 f(n)和 f(n原创 2021-06-03 16:26:17 · 234 阅读 · 0 评论 -
面试算法大全-回溯算法总结
9、回溯9.1 回溯算法总结(DFS)回溯算法和DFS一个样子void backtracking(参数) { if (终止条件) { 存放结果; return; } for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) { 处理节点; backtracking(路径,选择列表); // 递归 回溯,撤销处理结果 }}代码方面,回溯算法的框架:result = []d原创 2021-06-03 16:21:26 · 150 阅读 · 0 评论 -
面试算法大全-递归总结
8.递归8.1 递归算法总结构成递归需具备的条件:1 . 子问题须与原始问题为同样的事, 且更为简单;2 . 不能无限制地调用本身, 须有个出口, 化简为非递归状况处理。直接或者间接调用自身的算法叫做递归算法。8.2 经典题目源码总结二叉搜索树的范围和方法一:深度优先搜索class Solution { int ans; public int rangeSumBST(TreeNode root, int L, int R) { ans = 0;原创 2021-06-03 16:19:38 · 159 阅读 · 0 评论 -
面试算法大全-树与二叉树总结
6、树结构6.1 树数据结构体系6.1.1 二叉树和基本实现二叉树数据结构定义:public class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode() { } public TreeNode(int val) { this.val = val; } public TreeNode(int val, TreeNode lef原创 2021-06-03 16:17:33 · 187 阅读 · 0 评论 -
面试算法大全-队列总结
5.1 队列的定义和特点5.2 队列的实现5.2.1 用数组实现队列// 使用数组模拟队列-编写一个ArrayQueue类class ArrayQueue { private int maxSize; // 表示数组的最大容量 private int front; // 队列头 private int rear; // 队列尾 private int[] arr; // 该数据用于存放数据, 模拟队列 // 创建队列的构造器 public ArrayQueue(int arrMaxSi原创 2021-06-03 16:14:28 · 156 阅读 · 0 评论 -
面试算法大全-栈总结
4、栈4.1 栈的定义和特点[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hbNpVdLE-1622707812799)(C:\Users\HuFeiHu\AppData\Roaming\Typora\typora-user-images\image-20201112140549673.png)](1)栈的存储结构栈既然是一种线性结构,就能够以数组或链表(单向链表、双向链表或循环链表)作为底层数据结构。(2)栈的操作栈的常用操作为:弹栈,通常命名为pop压栈,原创 2021-06-03 16:10:33 · 151 阅读 · 0 评论 -
算法面试大全-字符串总结
3、字符串3.1 基本概念(1)回文(2)字串(连续)(3)子序列(不连续)(4)前缀树(trie树)(5)后缀树和后缀数组(6)匹配(7)字典序3.2 题目类型[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XanudyZV-1622707400090)(C:\Users\HuFeiHu\AppData\Roaming\Typora\typora-user-images\image-20201110073052624.png)][外链图片转存失败,源站可原创 2021-06-03 16:05:36 · 185 阅读 · 0 评论 -
面试算法大全-链表总结
2、链表链表常用的有 3 类: 单链表、双向链表、循环链表。2.1 链表的概念和实现2.1.1 单项链表节点定义private static class Node<E> { E item; Node<E> next; Node(E element, Node<E> next) { this.item = element; this.next = next; }}单链表实现public原创 2021-06-03 16:00:42 · 242 阅读 · 0 评论 -
面试算法大全-数组总结
1、数组1.1 一维数组1.1.1遍历public class Arraytest { public static void main(String[] args) { int[] arr={1,3,4,5,6,8,9}; //顺序遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i]); }原创 2021-06-03 15:55:46 · 157 阅读 · 0 评论