
数据结构
文章平均质量分 91
苏学算法
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
python collections.OrderedDict() 用法
Python中的字典对象可以以“键:值”的方式存取数据。OrderedDict是它的一个子类,实现了对字典对象中元素的排序。注意,OrderedDict的 Key 会按照插入的顺序排列,不是Key本身排序:比如下面比较了两种方式的不同:import collections print 'Regular dictionary:'d={}d['a']='A'd['b']='B'd['c']='C'for k,v in d.items(): print k,v print '\nO原创 2020-12-17 15:12:36 · 3160 阅读 · 5 评论 -
【面经】美团算法二面
部门是美团服务平台-营销部门的 推荐广告算法一、项目介绍问阿里的项目问CNN的演进历史,未来的改进方向二、概率题A有n+1个硬币,B有n个硬币,A比B得到更多的正面朝上的概率是多少?原创 2020-09-28 18:06:27 · 1208 阅读 · 0 评论 -
【面经】美团算法一面
一、项目介绍二、手撕代码原创 2020-09-28 16:49:54 · 1111 阅读 · 0 评论 -
【剑指offer】33. 二叉搜索树的后序遍历序列
一、题目描述输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树: 5/ \2 6/ 1 3示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true提示:数组长度 <= 1000...原创 2020-09-28 16:49:43 · 558 阅读 · 0 评论 -
【LeetCode】239. 滑动窗口最大值
一、题目描述给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶:你能在线性时间复杂度内解决此题吗?示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] 解释: 滑动窗口的位置 最大值--------------- -----[1原创 2020-09-22 15:58:01 · 337 阅读 · 0 评论 -
【面试题】一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法
一、题目描述一个环,有n个点(编号 0 ~ n-1 ), 问从0点出发,经过k步回到原点(0点)有多少种方法 ?二、解题思路 & 代码再回到 0 点可以从右面回来,也可以从左面回来,即先到达旁边的一个点,看看有多少回来的方法即可。所以运用动态规划的思想,我们可以写出递推式如下: dp(k,j)=dp(k−1,j−1)+dp(k−1,j+1)dp(k, j) = dp(k-1, j-1) + dp(k-1, j+1)dp(k,j)=dp(k−1,j−1)+dp(k−1,j+1)dp(k,j)原创 2020-09-21 11:40:26 · 2343 阅读 · 0 评论 -
【LeetCode】209. 长度最小的子数组 & 862. 和至少为 K 的最短子数组
209. 长度最小的子数组一、题目描述给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。示例:输入:s = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。进阶:如果你已经完成了 O(n) 时间复杂度的解法, 请尝试 O(n log n) 时间复杂度的解法。二、解题思路 & 代码2.1 方法一:暴力法(P原创 2020-09-20 11:55:15 · 610 阅读 · 1 评论 -
最短路径算法之Dijkstra算法
参考:最短路径算法之Dijkstra算法漫画:图的 “最短路径” 问题python如何实现Dijkstra算法–最短路径问题原创 2020-09-18 19:48:23 · 475 阅读 · 0 评论 -
【LeetCode】42. 接雨水
42. 接雨水(二维)一、题目描述给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。示例:输入: [0,1,0,2,1,0,1,3,2,1,2,1]输出: 6二、解题思路 & 代码2.1 按列求求每一列的水,我们只需要关注当前列,以及左边最高的墙,右边最高的墙就够了。装水的多少,当然根据木原创 2020-09-18 11:27:47 · 1108 阅读 · 1 评论 -
【LeetCode】58. 最后一个单词的长度
一、题目描述给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: "Hello World"输出: 5二、解题思路 & 代码由于要获取最后一个单词的长度,需要从尾开始遍历。但是结尾处还可能有空格所以一般的解题思路为,先去掉末尾的空格,然后从尾向前开始遍历,直到遇到第一个原创 2020-09-18 10:06:57 · 291 阅读 · 0 评论 -
【LeetCode】125. 验证回文串
一、题目描述给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例 1:输入: "A man, a plan, a canal: Panama"输出: true示例 2:输入: "race a car"输出: false二、解题思路 & 代码2.1 直接取反比较class Solution: def isPalindrome(self, s: str) -> bool:原创 2020-09-17 22:04:46 · 227 阅读 · 0 评论 -
【LeetCode】680. 验证回文字符串 Ⅱ &变形
一、题目描述给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: "aba"输出: True示例 2:输入: "abca"输出: True解释: 你可以删除c字符。注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。二、解题思路 & 代码双指针 + 贪心算法class Solution: def validPalindrome(self, s: str) -> bool: def ch原创 2020-09-13 16:56:26 · 389 阅读 · 0 评论 -
【剑指offer】剑指 Offer 54. 二叉搜索树的第k大节点
一、题目描述给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4限制:1 ≤ k ≤ 二叉搜索树元素个数二、解题思路 & 代码解法基于原创 2020-09-12 16:51:47 · 414 阅读 · 0 评论 -
【LeetCode】328. 奇偶链表
一、题目描述给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。示例 1:输入: 1->2->3->4->5->NULL输出: 1->3->5->2->4->NULL示例 2:输入: 2->1->3->5->6原创 2020-09-12 16:36:27 · 272 阅读 · 0 评论 -
【LeetCode】498. 对角线遍历 & 1424. 对角线遍历 II
I、498. 对角线遍历(蛇形)一、题目描述给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。示例:输入:[ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ]]输出: [1,2,4,7,5,3,6,8,9]解释:说明:给定矩阵中的元素总数不会超过 100000 。二、解题思路 & 代码2.1 对角线迭代和翻转算法初始化数组 result,用于存储最后结果。原创 2020-09-12 15:08:26 · 924 阅读 · 0 评论 -
最长的公共连续子串
一、题目描述两个字符串(可能包含空格),找出其中最长的公共连续子串, 并输出其长度。二、解题思路 & 代码创建一个二维数组 dp[n][m]dp[n][m]dp[n][m],其中 dp[i][j]dp[i][j]dp[i][j] : 表示取到 s1[i]s1[i]s1[i] 和取到 s2[j]s2[j]s2[j] 时的最大连续子串长度。如果 s1[i]s1[i]s1[i] 等于 s2[j]s2[j]s2[j],则 dp[i][j]dp[i][j]dp[i][j] 等于取到 s1[i−1]s原创 2020-09-08 20:30:38 · 805 阅读 · 0 评论 -
删除最小字母(第四范式算法一面)
一、题目描述给定一个长度为n的小写字符数组,一次操作是删除一个最小字母,如有多个删除最靠左的。要求输出操作k次后的字符串。输入:abcdabcd k = 3输出:cdbcd 二、解题思路 & 代码由于都是小写字母,字符类型比较简单,故而可以用简便的方法采用哈希表将字符串进行计数将键值从小到大排序,而后从前往后删除,当删除的数量 == k 时停止from collections import Counterdef delMinAlpha(s, k): n = le原创 2020-09-07 17:11:46 · 749 阅读 · 0 评论 -
【leetCode】31. 下一个排列
一、题目描述实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。以下是一些例子,输入位于左侧列,其相应输出位于右侧列。1,2,3 → 1,3,23,2,1 → 1,2,31,1,5 → 1,5,1二、解题思路 & 代码一遍扫描什么样子的重新排列将产生下一个更大的数字呢?我们想要创建比当前更大的排列。因此,我们需要将数字 a[i−1]a[i原创 2020-09-07 12:23:35 · 323 阅读 · 0 评论 -
【LeetCode】32. 最长有效括号
一、题目描述给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: "(()"输出: 2解释: 最长有效括号子串为 "()"示例 2:输入: ")()())"输出: 4解释: 最长有效括号子串为 "()()"二、解题思路 & 代码2.1 动态规划dp[i]dp[i]dp[i] 表示以 iii 结尾的最长有效括号;当 s[i]s[i]s[i] 为 (,dp[i]dp[i]dp[i] 必然等于 000,因为不可能组成有效的括号原创 2020-09-07 11:20:08 · 485 阅读 · 1 评论 -
寻找迷宫中的最短路径
一、题目描述给定一个 n*m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中0表示可以走的路,1表示不可通过的墙壁。最初,有一个人位于 start 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至 end 处,至少需要移动多少次。数据保证 start 处和 end 处的数字为0,且至少存在一条通路。输入格式第一行包含两个整数n和m。接下来n行,每行包含m个整数(0或1),表示完整的二维数组迷宫。输出格式输出一个整数,表示从左上角移动至原创 2020-09-06 18:15:35 · 1530 阅读 · 1 评论 -
【LeetCode】460. LFU缓存
一、题目描述请你为 最不经常使用(LFU)缓存算法设计并实现数据结构。它应该支持以下操作:get 和 put。get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1。put(key, value) - 如果键已存在,则变更其值;如果键不存在,请插入键值对。当缓存达到其容量时,则应该在插入新项之前,使最不经常使用的项无效。在此问题中,当存在平局(即两个或更多个键具有相同使用频率)时,应该去除最久未使用的键。「项的使用次数」就是自插入该项以来对其调用 get 和 put原创 2020-09-05 21:52:08 · 283 阅读 · 0 评论 -
迷宫问题
参考:迷宫II原创 2020-09-05 18:30:00 · 154 阅读 · 0 评论 -
【剑指offer】61. 扑克牌中的顺子
一、题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True示例 2:输入: [0,0,1,2,5]输出: True 限制:数组长度为 5 数组的数取值为 [0, 13] .二、解题思路 & 代码此 555 张牌是顺子的 充分条件 如下:除大小王外,所有牌 无重复 ;设此原创 2020-09-05 12:23:04 · 410 阅读 · 0 评论 -
【LeetCode】93. 复原IP地址
一、题目描述给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 1:输入:s = "25525511135"输出:["255.255.11.1原创 2020-09-05 11:06:42 · 371 阅读 · 0 评论 -
【LeetCode】101. 对称二叉树
一、题目描述给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 进阶:你可以运用递归和迭代两种方法解决这个问题吗?二、解题思路 & 代码2.1 递归# Definition for a binar原创 2020-09-05 10:55:46 · 274 阅读 · 0 评论 -
【LeetCode】263.丑数 & 264. 丑数 II
I. 263. 丑数(是否为丑数)一、题目描述编写一个程序判断给定的数是否为丑数。丑数就是只包含质因数 2, 3, 5 的正整数。示例 1:输入: 6输出: true解释: 6 = 2 × 3示例 2:输入: 8输出: true解释: 8 = 2 × 2 × 2示例 3:输入: 14输出: false 解释: 14 不是丑数,因为它包含了另外一个质因数 7。说明:1 是丑数。输入不会超过 32 位有符号整数的范围: [−231,231−1][−2^{31}, 2原创 2020-09-04 16:16:11 · 447 阅读 · 0 评论 -
C++虚函数与多态记录(面试级整理)
C++虚函数与多态记录代码// 虚函数和多态/* 基类成员函数用virtual修饰 1. 基类大小多出来4个字节 指针 _vfptr _vfptr 指向一个 函数指针数组 数组中保存所有虚函数的地址2. 派生类继承基类, 会继承基类的函数指针数组里的元素3. 如果派生类有重写,即在派生类里面有与基类重名的函数, 那么重写后的函数地址会覆盖函数指针数组里的元素4. 调用函...原创 2019-11-30 21:18:33 · 690 阅读 · 1 评论 -
【面经】字节跳动 Data 算法三面
一、手撕代码【LeetCode】311. 稀疏矩阵的乘法【概率】甲乙射击比赛,单局甲胜率0.6,3局2胜和5局3胜两种赛制甲如何选择?无限多局,甲获胜概率?二、计算机基础 & 神经网络进程和线程神经网络的权值都初始化为 0.1 行不行答案:为什么神经网络参数不能全部初始化为全0?PPO 介绍内联函数和宏答案:内联函数以及它和宏的区别三、项目介绍着重讲自己做的工作...原创 2020-09-03 00:19:30 · 1647 阅读 · 0 评论 -
【LeetCode】311. 稀疏矩阵的乘法
本题是 LeetCode 会员才能看…一、题目描述给你两个 稀疏矩阵 A 和 B,请你返回 AB 的结果。你可以默认 A 的列数等于 B 的行数。请仔细阅读下面的示例。示例:输入:A = [ [ 1, 0, 0], [-1, 0, 3]]B = [ [ 7, 0, 0 ], [ 0, 0, 0 ], [ 0, 0, 1 ]]输出: | 1 0 0 | | 7 0 0 | | 7 0 0 |AB = | -1 0 3 | x | 0 0 0 |原创 2020-09-03 00:22:21 · 849 阅读 · 0 评论 -
【LeetCode】78. 子集 & 90. 子集 II
78. 子集一、题目描述给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。说明:解集不能包含重复的子集。示例:输入: nums = [1,2,3]输出:[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], []]二、解题思路 & 代码2.1 迭代class Solution: def subsets(self, nums: List[int]) -> List[Li原创 2020-09-03 00:24:11 · 347 阅读 · 0 评论 -
【LeetCode】143. 重排链表
【2019年计算机统考408真题】一、题目描述给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。示例 1:给定链表 1->2->3->4, 重新排列为 1->4->2->3.示例 2:给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.二、解题原创 2020-09-02 17:07:59 · 507 阅读 · 0 评论 -
【LeetCode】162. 寻找峰值
一、题目描述峰值元素是指其值大于左右相邻值的元素。给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回任何一个峰值所在位置即可。你可以假设 nums[-1] = nums[n] = -∞。示例 1:输入: nums = [1,2,3,1]输出: 2解释: 3 是峰值元素,你的函数应该返回其索引 2。示例 2:输入: nums = [1,2,1,3,5,6,4]输出: 1 或 5 解释: 你的函数原创 2020-09-02 16:46:04 · 511 阅读 · 2 评论 -
【LeetCode】958. 二叉树的完全性检验
一、题目描述给定一个二叉树,确定它是否是一个完全二叉树。百度百科中对完全二叉树的定义如下:若设二叉树的深度为 h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在最左边,这就是完全二叉树。(注:第 h 层可能包含 1~ 2h 个节点。)示例 1:输入:[1,2,3,4,5,6]输出:true解释:最后一层前的每一层都是满的(即,结点值为 {1} 和 {2,3} 的两层),且最后一层中的所有结点({4,5,6})都尽可能地向左。示例 2:原创 2020-09-02 16:24:31 · 443 阅读 · 0 评论 -
【LeetCode】415. 字符串相加
一、题目描述给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。提示:num1 和num2 的长度都小于 5100num1 和num2 都只包含数字 0-9num1 和num2 都不包含任何前导零你不能使用任何內建 BigInteger 库, 也不能直接将输入的字符串转换为整数形式二、解题思路 & 代码算法流程:设定 i,j 两指针分别指向 num1,num2 尾部,模拟人工加法;计算进位: 计算 carry = tmp // 10,代表当前位相加是否产生进原创 2020-09-02 16:16:04 · 277 阅读 · 0 评论 -
【LeetCode】344. 反转字符串
一、题目描述编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 char[] 的形式给出。不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。你可以假设数组中的所有字符都是 ASCII 码表中的可打印字符。示例 1:输入:["h","e","l","l","o"]输出:["o","l","l","e","h"]二、解题思路 & 代码2.1 双指针法class Solution: def reverseStrin原创 2020-09-02 16:09:54 · 258 阅读 · 0 评论 -
【剑指offer】39. 数组中出现次数超过一半的数字
一、题目描述数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2 限制:1 <= 数组长度 <= 50000二、解题思路 & 代码2.1 哈希表因为超过一半,那也就是数量最多的那个元素(都超过一半了,不会再有超过一半的数了)class Solution: def majorityElement(self,原创 2020-09-02 15:58:20 · 329 阅读 · 0 评论 -
【LeetCode】1312. 让字符串成为回文串的最少插入次数
一、题目描述给你一个字符串 s ,每一次操作你都可以在字符串的任意位置插入任意字符。请你返回让 s 成为回文串的 最少操作次数 。「回文串」是正读和反读都相同的字符串。示例 1:输入:s = "zzazz"输出:0解释:字符串 "zzazz" 已经是回文串了,所以不需要做任何插入操作。示例 2:输入:s = "mbadm"输出:2解释:字符串可变为 "mbdadbm" 或者 "mdbabdm" 。示例 3:输入:s = "leetcode"输出:5解释:插入 5 个字符后字原创 2020-09-02 12:08:50 · 645 阅读 · 0 评论 -
【LeetCode】516. 最长回文子序列 (动态规划)
一、题目描述给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。提示:1 <= s.length <= 1000s 只包含小写英文字母二、解题思路 & 代码2.1 二维 dpdp 数组的定义是:在子串 s[i..j]s[i..j]s[i原创 2020-09-02 11:24:52 · 568 阅读 · 0 评论 -
【LeetCode】5. 最长回文子串
一、题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"二、解题思路 & 代码2.1 动态规划对于一个子串而言,如果它是回文串,并且长度大于 2,那么将它首尾的两个字母去除之后,它仍然是个回文串。例如对于字符串“ababa”,如果我们已经知道 “bab” 是回文串,那么 “ababa” 一定是回文串原创 2020-09-02 10:59:15 · 899 阅读 · 0 评论 -
【LeetCode】69. x 的平方根
一、题目描述实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。二、解题思路 & 代码2.1 二分法**思路分析:**使用二分法搜索平方根的思想很简单,就类似于小时候我们看的电视节目中的“猜价格”游戏,高了就往低了猜原创 2020-09-02 10:35:52 · 402 阅读 · 0 评论