AI/CV大厂笔试LeetCode高频考题之基础核心知识点
AI/CV互联网大厂笔试LeetCode高频考题之基础核心知识点
- 算法复习
- 1、二叉树的遍历
- 2、回溯算法
- 3、二分搜索
- 4、滑动窗口算法题
- 5、经典动态规划
- 6、动态规划答疑篇
- 6.1、总结一下如何找到动态规划的状态转移关系
- 7、编辑距离
- 8、戳气球问题
- 9、最长公共子序列 Longest Common Subsequence
- 10、子序列的相关问题。最长,回文,编辑距离。
- 11、动态规划,博弈问题
- 12、贪心算法
- 13、二叉堆,实现优先级队列
- 14、LRU缓存淘汰策略
- 15、完全二叉树 满二叉树
本人参加了一些互联网大公司(N个公司)的笔试,机试以及后续的面试过程。主要总结一下在笔试和面试中的高频考点。主要是要掌握以下几类算法的核心思想。在笔试和面试的过程中,遇到这些问题,想清楚思路,然后套用下面的解法,将会非常有用。我没有刷500道LeetCode题,所以整体的刷题量和对事情的复杂程度还没有到位。但是下面的浅见,供大家参考一下。互相学习。祝福找工作的同学们,一切顺利。
算法复习
1、二叉树的遍历
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
前序遍历,中序遍历能够重构出后序遍历;
后序遍历,中序遍历能够重构出前序遍历;
前序遍历,后序遍历无法重构出中序遍历。
void traverse(TreeNode root){//前序遍历traverse(root.left);//中序遍历traverse(root.right);//后序遍历
}
2、回溯算法
def backtrack(...):for 选择 in 选择列表:做选择backtrack()撤销选择
路径,选择列表,结束条件
动态规划:状态,选择,base case 重叠子问题,可以用dp table或者备忘录 优化。
queue 先进先出。 stack 先进后出.
3、二分搜索
因为我们初始化 right = nums.length - 1
所以决定了我们的「搜索区」是 [left, right]
所以决定了 while (left <= right)
同时也决定了 left = mid+1 和 right = mid-1
因为我们只找到⼀个target 的索引即可
所以当 nums[mid] == target 时可以⽴即回
-
寻找左侧边界的二分查找
在nums[mid] == target时,
right=mid-1.
-
寻找右侧边界的二分查找
在nums[mid] == target时,
left=mid+1.
返回逻辑记得防止越界,边界检查。
4、滑动窗口算法题
/* 滑动窗口算法框架 */
void slidingWindow(string s, string t) {unordered_map<char, int> need, window;for (char c : t) need[c]++;int left = 0, right = 0;int valid = 0; while (right < s.size()) {// c 是将移入窗口的字符char c = s[right];// 右移窗口right++;// 进行窗口内数据的一系列更新.../*** debug 输出的位置 ***/printf("window: [%d, %d)\n", left, right);/********************/// 判断左侧窗口是否要收缩while (window needs shrink) {// d 是将移出窗口的字符char d = s[left];// 左移窗口left++;// 进行窗口内数据的一系列更新...}}
}
5、经典动态规划
这个问题有什么「状态」,有什么「选择」,然后穷举。
对于高楼扔鸡蛋问题,状态:鸡蛋的个数。楼层的层数;随着测试的进行,K减少,楼层N减少。
选择:去哪层楼扔鸡蛋;线性扫描?二分法?等等。策略问题。
穷举加DP table。就可以解决动态规划的特性。 稍微处理一下 base case。
def dp(K, N):for 1 <= i <= N:# 最坏情况下的最少扔鸡蛋次数res = min(res, max( dp(K - 1, i - 1), # 碎了,就去低一层楼找;dp(K, N - i) # 没碎,就去高一层楼找。) + 1 # 在第 i 楼扔了一次)return res
对于动态规划的标准步骤:
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for …
dp[状态1] [状态2] […] = 择优(选择1,选择2…)
stack堆栈,先进后出。stack.top( )获取栈顶元素; stack.pop( ),删除栈顶元素; stack.push(5),推入元素到栈顶。
6、动态规划答疑篇
-
找最优子结构的过程:
其实就是证明状态转移方程正确性的过程,方程符合最优子结构就可以写暴力解了,写出暴力解就可以看出有没有重叠子问题了,有则优化,无则 OK。
最优子结构性质作为动态规划问题的必要条件,一定是让你求最值的。 从最简单的 base case 往后推导。
-
dp数组的遍历方向:
1、遍历的过程中,所需的状态必须是已经计算出来的。
2、遍历的终点必须是存储结果的那个位置。
6.1、总结一下如何找到动态规划的状态转移关系
1、明确 dp
数组所存数据的含义。这一步对于任何动态规划问题都很重要,如果不得当或者不够清晰,会阻碍之后的步骤。
2、根据 dp
数组的定义,运用数学归纳法的思想,假设 dp[0...i-1]
都已知,想办法求出 dp[i]
,一旦这一步完成,整个题目基本就解决了。
但如果无法完成这一步,很可能就是 dp
数组的定义不够恰当,需要重新定义 dp
数组的含义;或者可能是 dp
数组存储的信息还不够,不足以推出下一步的答案,需要把 dp
数组扩大成二维数组甚至三维数组。
7、编辑距离
编辑距离的dp状态转移矩阵,比较巧妙。如何设计这个函数。左上,左边,上边。三个方向选最小的。跳转到[i+1] [j+1].
if s1[i] == s2[j]:
啥都别做(skip)
i, j 同时向前移动
else:
三选一:
插入(insert)
删除(delete)
替换(replace)
状态转移所依赖的状态必须被提前计算出来。
8、戳气球问题
这个问题中我们每戳破一个气球nums[i]
,得到的分数和该气球相邻的气球nums[i-1]
和nums[i+1]
是有相关性的。
这里面比较巧妙的是,如何转移矩阵。将气球🎈划分成不被破坏的,相互独立的3个子块。
dp[i] [k] + dp[k] [j] + points[i] * points[k] * points[j]
你不是要最后戳破气球k
吗?那得先把开区间(i, k)
的气球都戳破,再把开区间(k, j)
的气球都戳破;最后剩下的气球k
,相邻的就是气球i
和气球j
,这时候戳破k
的话得到的分数就是points[i]*points[k]*points[j]
。
9、最长公共子序列 Longest Common Subsequence
大部分比较困难的字符串问题,比如编辑距离,都是用二维动态规划来做。涉及到子序列问题,用动态规划来做。
子序列问题的核心。 dp 的转移。
从dp(i, j)
转移到dp(i+1, j+1)。 字符串相同的时候,应该如何跳转,不同的时候,应该如何跳转。
关于状态转移,当s1[i]
和s2[j]
相同时不需要删除,不同时需要删除,所以可以利用dp
函数计算两种情况,得出最优的结果。
dp[i-1] [j-1] | dp[i-1] [j] |
---|---|
dp[i] [j-1] | dp[i] [j] |
10、子序列的相关问题。最长,回文,编辑距离。
涉及到子序列和最值,那几乎可以肯定,考察的是动态规划技巧,时间复杂度一般都是 O(n^2)。
然后根据实际问题看看哪种思路容易找到状态转移关系。
另外,找到状态转移和 base case 之后,一定要观察 DP table,看看怎么遍历才能保证通过已计算出来的结果解决新的问题
子序列问题,一共两种动态规划思路。二维的 dp 数组
-
涉及两个字符串/数组时(比如最长公共子序列),dp 数组的含义如下:
在子数组
arr1[0..i]
和子数组arr2[0..j]
中,我们要求的子序列(最长公共子序列)长度为dp[i][j]
。第一种情况可以参考这两篇旧文:详解编辑距离和最长公共子序列 -
只涉及一个字符串/数组时(比如本文要讲的最长回文子序列),dp 数组的含义如下:
在子数组
array[i..j]
中,我们要求的子序列(最长回文子序列)的长度为dp[i][j]
。
if (s[i] == s[j])
// 它俩一定在最长回文子序列中
dp[i][j] = dp [ i + 1 ] [j - 1] + 2;
else
// s[i+1…j] 和 s[i…j-1] 谁的回文子序列更长?
dp[i][j] = max(dp [i + 1] [j], dp[i] [j - 1]);
另外,看看刚才写的状态转移方程,想求dp[i][j]
需要知道dp[i+1][j-1]
,dp[i+1][j]
,dp[i][j-1]
这三个位置;再看看我们确定的 base case,填入 dp 数组之后是这样。为了保证每次计算dp[i][j]
,左、下、左下三个方向的位置已经被计算出来,只能斜着遍历或者反着遍历。
11、动态规划,博弈问题
博弈问题的前提一般都是在两个聪明人之间进行,编程描述这种游戏的一般方法是二维 dp 数组,数组中通过元组分别表示两人的最优决策。
之所以这样设计,是因为先手在做出选择之后,就成了后手,后手在对方做完选择后,就变成了先手。这种角色转换使得我们可以重用之前的结果,典型的动态规划标志。
12、贪心算法
对于区间问题的处理,一般来说第一步都是排序,相当于预处理降低后续操作难度。
13、二叉堆,实现优先级队列
Priority queue.
优先级队列,插入或者删除元素的时候,元素会自动排序,这底层的原理就是二叉堆的操作。
数据结构的功能无非增删查改,优先级队列有两个主要 API,分别是insert
插入一个元素和delMax
删除最大元素(如果底层用最小堆,那么就是delMin
)。
insert
方法先把要插入的元素添加到堆底的最后,然后让其上浮到正确位置。
delMax
方法先把堆顶元素 A 和堆底最后的元素 B 对调,然后删除 A,最后让 B 下沉到正确位置。
优先级队列是基于⼆叉堆实现的,主要操作是插⼊和删除。插⼊是先插到最后,然后上浮到正确位置。删除操作是删除最大元素,先是交换位置到队尾,后再删除,然后将队列顶部的元素下沉到正确位置。核⼼代码也就⼗⾏。
删除是把第一个元素 pq[1](最值)调换到最后再删除,然后把新的 pq[1] 下沉到正确位置。
14、LRU缓存淘汰策略
LRU 缓存淘汰算法就是⼀种常⽤策略。LRU 的全称是 Least Recently Used,也就是 我们认为最近使⽤的数据应是「有⽤的」, 很久都没⽤过的数据应该是⽆⽤的,内存满了就优先删除很久没⽤的数据。
LRU 按访问时序淘汰缓存。还有LFU,按照访问频率淘汰。优先淘汰较少使用的应用/缓存。
LRU capacity作为容量,put(key,val)存入键值队,get(key)返回val。没有则-1。
注意
LRU缓存算法的核心是哈希链表,采用双向链表和哈希表结合。借助哈希表赋予了链表快速查找的特性。可以快速查找某个 key 是否存在缓存(链表)中,同时可以快速删除、添加节点。
为什么必须要⽤双向链表,因为我们需要删除操作。删除⼀个节点不光要得到该节点本⾝的指针,也需要操作其前驱节点的指针,⽽双向链表才能⽀持直接查找前驱,保证操作的时间复杂度O(1) 。
“为什么要在链表中同时存储 key 和 val,⽽不是只存储 val”,注意这段代码:
if (cap == cache.size()) {
// 删除链表最后⼀个数据
Node last = cache.removeLast();
map.remove(last.key);
}
当缓存容量已满,我们不仅仅要删除最后⼀个 Node 节点,还要把 map 中映射到该节点的 key 同时删除,⽽这个 key 只能由 Node 得到。如果 Node 结构中只存储 val,那么我们就⽆法得知 key 是什么,就⽆法删除 map 中的键,造成错误。
处理链表节点的同时不要忘了更新哈希表中对节点的映射。
链表操作,只需要处理指针。比较方便。
在二叉树框架上,扩展出一套BST遍历框架。
void BST(TreeNode root, int target)
{if (root.val == target)// 找到⽬标 做点什么if (root.val < target)BST(root.right, target);if (root.val > target)BST(root.left, target);
}
15、完全二叉树 满二叉树
完全二叉树如下图,每一层都是紧凑靠左排列的:
满二叉树如下图,是一种特殊的完全二叉树,每层都是是满的,像一个稳定的三角形。
\quad 完全二叉树 \quad \quad\quad\quad\quad\quad 满二叉树
一棵完全二叉树的两棵子树,至少有一棵是满二叉
算法的递归深度就是树的高度 O(logN),每次递归所花费的时间就是 while 循环,需要 O(logN),所以总体的时间复杂度是 O(logN*logN)。
相关文章:
AI/CV大厂笔试LeetCode高频考题之基础核心知识点
AI/CV互联网大厂笔试LeetCode高频考题之基础核心知识点算法复习1、二叉树的遍历2、回溯算法3、二分搜索4、滑动窗口算法题5、经典动态规划6、动态规划答疑篇6.1、总结一下如何找到动态规划的状态转移关系7、编辑距离8、戳气球问题9、最长公共子序列 Longest Common Subsequence…...
华为OD机试题,用 Java 解【静态扫描最优成本】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
常见无线技术方案介绍
无线技术 无线网络大体有两种:WAN(广域网)、PAN(个人区域网)。 对于LoRa,NB-IoT,2G / 3G / 4G等无线技术,通常传输距离超过1 km,因此它们主要用于广域网(WA…...
收获满满的2022年
收到csdn官方的证书,感谢官方的认可!...
react的生命周期
目录 一、初始化阶段 constructor() static getDerivedStateFromProps() componentWillMount() / UNSAFE_componentWillMount() render(): componentDidMount() 二、运行阶段 componentWillUpdate() / UNSAFE_componentWillUpdate() render() getSnapsh…...
scanpy 单细胞分析API接口使用案例
参考:https://zhuanlan.zhihu.com/p/537206999 https://scanpy.readthedocs.io/en/stable/api.html scanpy python包主要分四个模块: 1)read 读写模块、 https://scanpy.readthedocs.io/en/stable/api.html#reading 2)pp Prepr…...
【Vue3 第二十一章】Teleport组件传送
一、基本使用场景 有时我们可能会遇到这样的场景:一个组件模板的一部分在逻辑上从属于该组件,但从整个应用视图的角度来看,它在 DOM 中应该被渲染在整个 Vue 应用外部的其他地方。 这类场景最常见的例子就是全屏的模态框。理想情况下&#…...
在 Windows Subsystem for Linux (WSL2) 的 Ubuntu 系统上配置 Vulkan 开发环境
在 Windows Subsystem for Linux (WSL2) 的 Ubuntu 系统上配置 Vulkan 开发环境Vulkan Tutorial https://vulkan-tutorial.com/ Development environment - Linux https://vulkan-tutorial.com/Development_environment 1. Vulkan - Cross platform 3D Graphics https://www…...
放苹果HJ61
入门题目 把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?注意:如果有7个苹果和3个盘子,(5,1,1)和(1,5&#…...
Windows下,OPC UA移植,open62541移植
OPC通信标准的核心是互通性 (Interoperability) 和标准化 (Standardization) 问题。传统的OPC技术在控制级别很好地解决了硬件设备间的互通性问题,在企业层面的通信标准化是同样需要的。OPC UA之前的访问规范都是基于微软的COM/DCOM技术, 这会给新增层面的通信带来不可根除的…...
【Tomcat与Servlet篇1】认识Tomcat与Maven
目录 一、什么是Tomcat 二、Tomcat的几个重要目录 conf文件编辑 Server.xml logs文件 Webapps目录 三、如何使用Tomcat 但是,如果出现了点击之后进行闪退的情况,那又是怎么回事呢? 原因1:环境变量没有配置 原因2&#…...
C++类和对象:拷贝构造函数和运算符重载
目录 一. 拷贝构造函数 1.1 什么是拷贝构造函数 1.2 编译器默认生成的拷贝构造函数 1.3 拷贝构造函数特性总结 二. 运算符重载 2.1 运算符重载概述 2.2 比较运算符重载(> > < <) 2.2.1 >运算符的重载 2.2.2 运算符的重载 2.…...
【IntelliJ IDEA】idea plugins搜索不出来,如何找到插件的解决方案
一、背景描述安装好IDEA后,想下载一些插件来使用,因为IDEA非常方便的一点就是插件使用非常的方便,但是经常会发现进入到插件市场无法搜索到插件的情况,这个时候就有点烦人了。那么怎么解决这个问题呢?以下会把我能想到…...
移动端自动化测试(一)appium环境搭建
自动化测试有主要有两个分类,接口自动化和ui自动化,ui自动化呢又分移动端的和web端的,当然还有c/s架构的,这种桌面程序应用的自动化,使用QTP,只不过现在没人做了。 web自动化呢,现在基本上都是…...
5 逻辑回归及Python实现
1 主要思想 分类就是分割数据: 两个条件属性:直线;三个条件属性:平面;更多条件属性:超平面。 使用数据: 5.1,3.5,0 4.9,3,0 4.7,3.2,0 4.6,3.1,0 5,3.6,0 5.4,3.9,0 . . . 6.2,2.9,1 5.1,2.5…...
技术干货 | Modelica建模秘籍之状态变量
在很多领域都有“系统”这个概念,它描述的往往是一些复杂关系的总和。假如我们将系统看做一个黑箱,那么,在系统的作用下,外界的输入有时会产生令人意想不到的输出,“蝴蝶效应”就是其中的典型案例。图1 一只南美洲亚马…...
LeetCode 2574. 左右元素和的差值
给你一个下标从 0 开始的整数数组 nums ,请你找出一个下标从 0 开始的整数数组 answer ,其中: answer.length nums.length answer[i] |leftSum[i] - rightSum[i]| 其中: leftSum[i] 是数组 nums 中下标 i 左侧元素之和。如果不…...
rollup环境配置
VUE2.x源码学习笔记 1. rollup环境配置 首先在VScode中新建文件夹vue_sc,然后终端打开定位到打开的文件夹,输入“npm init -y”初始化配置项,运行成功之后文件夹新增package.json文件 继续在终端运行"npm install babel/preset-env ba…...
二分查找与二分答案、递推与递归、双指针、并查集和单调队列
二分查找与二分答案 文章目录二分查找与二分答案应用总结例题木材加工题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示数据规模与约定思路代码递归与递推应用总结[NOIP2003 普及组] 栈题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示思…...
如何进行域名购买,获取免费ssl证书,使用springboot绑定ssl证书
前言 小编我将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习&#…...
LabVIEW网络服务安全2
LabVIEW网络服务安全2在客户端应用程序中创建签名对请求进行签名要求您具有能够从客户端的编程语言调用的MD5摘要算法以及SHA256加密摘要算法的实现。这两种算法通常都可用于大多数平台。还需要:1. 要使用的HTTP方法的字符串(“GET”、“POST”、“PUT”…...
java动态代理
目录儿一、代理模式的作用二、实现代理的方式三、动态代理的实现3.1 jdk动态代理3.2 cglib动态代理一、代理模式的作用 功能增强: 基于某个功能,再增加一些功能。 (比如目标类只负责核心功能,其他附属功能通过代理类完成。代理类的方法名与目…...
Python 简单可变、复杂可变、简单不可变、复杂不可变类型的copy、deepcopy的行为
copy模块:copy:浅拷贝deepcopy:深拷贝简单可变类型、复杂可变的copy()、deepcopy():简单不可变、复杂不可变类型的copy()、deepcopy():结论:对于简单类型的可变类型copy是深拷贝,改变了该拷贝变…...
QML Item
在QML中所有的可视项目都继承自Item,虽然Item本身没有可视化的外观,但它定义了可视化项目的所有属性。 Item可以作为容器使用: Item{Rectangle{id:retc}Rectangle{id:retc1}Rectangle{id:retc2}Rectangle{id:retc3}} item拥有children属性…...
使用xca工具生成自签证书
本文使用 xca 生成自签证书。 概述 之前使用 openssl 生成证书,在 golang 中测试,发现客户端连接失败,经查发现是Subject Alternative Name不支持导致的。因虚拟机 openssl 版本较低,有个功能无法实现,且升级麻烦&…...
Unity IOS 通过命令行导出IPA
新建一个文件然后输入如下内容 #!/usr/bin/env sh /Applications/Unity/Hub/Editor/2020.1.5f1c1/Unity.app/Contents/MacOS/Unity -quit -batchmode -projectPath /Users/zyt/Test -executeMethod Test.BuildEditor.BuildApp cd /Users/zyt/Test/Xcode/unity-xcode xcodebuil…...
「架构」全链路异步模式
总结自尼恩的全链路异步:网关纯异步化网关层的特点:不需要访问业务数据库只做协议转换和流量转发特点是 IO 密集型,特别适合纯异步的架构,可以极大的节省资源。如何进行网关异步化?使用高性能的通信框架Nettyÿ…...
CleanMyMac4.20最新版新增功能及电脑清理垃圾使用教程
CleanMyMac4.20作为知名的Mac清理工具,仅需一键即可快速而安全地清理系统垃圾,释放磁盘空间,因此一直深受Mac用户的喜爱。在不断更新的版本中,CleanMyMac已经不仅仅满足于只做简单的Mac清理工具,而是为Mac用户提供更多…...
Vue2的tsx开发入门完全指南
本篇文章尽量不遗漏重要环节,本着真正分享的心态,不做标题党 下面进入正题: 由于现在vue的官方脚手架已经非常完善我们就不单独配置webpack了,节省大量的时间成本。 首先使用vue/cli创建一个vue模版项目(记得是vue/…...
GLSL shader学习系列1-Hello World
这是GLSL shader系列第一篇文章,本文学习目标: 安装编辑工具编写hello world程序 安装插件 我使用VSCode编写shader代码,在VSCode上有两个好用的插件需要先装一下: Shader languages support for VS Code glsl-canvas…...
wordpress站点更换域名/中国建设网官方网站
目录资源下载1. KMeans实现聚类K-Means实现聚类效果图2.分析不同的距离算法带来的影响分成4类的效果图分成8类的效果图3.分析不同的K值带来的影响效果图4.分析不同的初始簇中心带来的影响分析图总结『机器学习』分享机器学习课程学习笔记,逐步讲述从简单的线性回归、…...
淘宝客做网站好还是建群号/自动优化句子的软件
一、编辑Grafana配置文件,设置发件人 docker安装的Grafana: vim /home/monitor/grafana/config/grafana.iniyum安装: vim /etc/grafana/grafana.ini在[smtp] 标签下 修改配置 # 配置邮件服务器 [smtp] enabled true # 发件服务器 host s…...
广州 网站建设/2023免费推广入口
QR算法求矩阵全部特征值的基本思想是利用矩阵的QR分解通过迭代格式 将AA1化成相似的上三角阵,从而求出矩阵A的全部特征值。 QR方法的计算步骤如下: 下面就依次进行介绍。 一. 将一般矩阵化为上Hessenberg阵 1.定义 一个矩阵如…...
中国建设银行深圳分行网站/上海网站排名seo公司哪家好
涉及一些文件操作的命令: 1、去掉/加上windows下文件的系统、只读、隐藏等属性,用chflags,nounchg/unchg,nohidden/hidden 2、去掉文件的属性(这个属性经常导致文件无法操作),先用xattr -l file…...
wordpress 全屏/seo是什么工作
六年级微课堂专注六年级微课堂,每日推送学习资料。微课探路课本再现巩固练习1. (1)③ (2)① (3)②2. (1)d=16(厘米) r=8(厘米)(2)d=12(厘米) r=6(厘米)3. 125.63.14=40(厘米)4. 50.24203.14…...
wordpress 建立网站/国家免费技能培训官网
Java 构造结构私有化单例设计模式:(Singleton)在一般情况下,一个类只有通过产生对象之后才可以操作这个类。class Singleton {public void print() {System.out.println("Hello,world!") ;}}public class TestDemo {public static void main(S…...