算法题
文章平均质量分 90
Leetcode、剑指offer等题型总结
不吃饭就会放大招
人工智能领域专家博主
展开
-
手撕代码题型总结
看到别人写的文章,真的很好,忍不住推荐一下!【1】0-1背包问题,解释什么问题适合使用动态规划,以及0-1背包问题的自上而下、自下而上解;【2】动态规划 LeetCode 题解基础 DP1. 爬楼梯:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法?思路:class Solution: def climbStairs(self, n: int) -> int: if n <= 2: return n self.count = se原创 2020-07-08 09:07:44 · 658 阅读 · 0 评论 -
扑克牌原始顺序问题
已知有 A-K 的十三张扑克牌,顺序未知,进行如下操作:1)从牌堆底拿一张牌翻开放在桌子上;2)从牌堆底拿一张放在牌堆顶;3)重复1、2的操作,直到十三张牌全部翻出为止。如果要求翻开的牌是从 A-K 顺序的,求开始牌堆的顺序。比如:原始序列为 2 3 1,经过上述操作后变为 1 2 3。假设已知原始序列 2 3 1,操作过程为:堆底拿一张翻开:(开)1,(堆)2 3堆底拿一张放在堆顶:(开)1,(堆)3 2堆底拿一张翻开:(开)1 2,(堆)3堆底拿一张放在堆顶:(开)1 2,(堆)3原创 2020-09-22 17:26:14 · 3921 阅读 · 0 评论 -
洗牌算法(打乱扑克牌顺序)
打乱原始数组的元素顺序。抽牌算法(Fisher-Yates Shuffle算法):每次从原始数组中随机取一个之前未取过的元素,添加到新数组中。原创 2020-09-25 10:51:32 · 2815 阅读 · 1 评论 -
微信抢红包算法实现
字节跳动二面问到了这个问题,小小研究了一下。(ps:微信红包貌似是使用二倍均值法实现的)只讨论金额随机的情况,需要满足规则:方案一:每个人点进来领,金额随机,随机的上限是当前剩余的红包金额。每次抢到的金额 = 随机区间(0,剩余红包金额)分析:这样做的缺陷是越早领越有优势,因为每次抢到的金额 = 随机区间(0,剩余金额),越早抢能领到的平均金额越大。假设有 10 个人,红包总金额 100,第一个人的随机范围是(0,100),平均金额 = 50;假设第一个人随机到 50 元,第二个人的随机范围就是(0,50)原创 2020-09-14 10:53:50 · 2401 阅读 · 1 评论 -
逻辑运算 之 异或的妙用
😉 第一节先复习一下异或的基本知识,如果认为已经了解就不用看啦,可以直接跳到异或应用部分 ~例1: 十进制数值的异或运算 5 ⊕ 3 = ?(这道题很简单,给大家预热一下~)5(10) = 0101(2)3(10) = 0011(2)0101 ⊕ 0011 = 0110(2)0110(2) = 6(10)所以:5 ⊕ 3 = 6例2: 交换两个变量的数值,要求不使用辅助存储空间。说明: 由于要求不使用额外的存储空间,所以就否决了常规的设置 temp 的方法。提示: 利用异或的性质:若 A ^ B .原创 2020-04-28 20:01:49 · 2689 阅读 · 0 评论 -
哈希表的应用
哈希表(Hash table,散列表)是根据键(key)直接访问数据的数据结构。也就是说,它是通过将键值映射到表中某个位置来访问数据,以加快查找的速度。这个映射函数叫散列函数,存放数据的数组叫散列表。哈希函数的构造方法:哈希冲突的解决方案:(上面这些方法具体的就不再写了,相关的博客和说明文档都是很多的)特别说明一下,python 字典其实就是哈希表,所以 python 对字典的键(key)要求很严格,它必须是不可变的、唯一的、可哈希的,换句话说就是要可以通过散列函数计算出唯一地址的。不允许同一个键出现两次。原创 2022-07-06 21:16:52 · 958 阅读 · 0 评论 -
【牛客OJ】输入输出处理
输入处理一行多个输入,以逗号分隔# 方法一L = list(eval(input())) # 将输入转换为 listdata = L[0] # 根据列表元素下标获取值target = L[1]input() 获取多个输入,此时是一个 str 类型,使用 eval() 转化为 tuple 类型,最后使用 list() 将其转化为 list。# 方法二data, target = input().split(',', 1) # 根据逗号分割输入data = list(eval(d原创 2020-07-15 09:49:36 · 1031 阅读 · 1 评论 -
动态规划Ⅳ:分割整数
文章目录数组区间数组区间数组区间和:给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。LeetCode 直达class NumArray: def __init__(self, nums: List[int]): if not nums: return None self.dp = [0] n = len(nums) for i in range(1, n+1)原创 2020-07-10 10:25:02 · 617 阅读 · 0 评论 -
动态规划Ⅲ:数组区间
文章目录三、数组区间1. 数组区间和2. 等差数列划分3. 子数组最大和三、数组区间1. 数组区间和数组区间和:给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。LeetCode 直达如果直接用暴力循环,时间开销是很大的,用动态规划的思路,建立 dp 数组,数组每个位置上是 当前位置的状态,即 从数组开始到当前位置所有元素的和。对于给定区间 [i,j],将求和问题转换为 res = dp[j] - dp[i-1],在具体的代码实现中原创 2020-06-17 13:52:16 · 1759 阅读 · 0 评论 -
动态规划Ⅱ:矩阵路径
基础 DP 问题,适合像我这样刚入 DP 大门的小萌新????文章目录一、斐波那契数列1. 爬楼梯问题2. 打家劫舍系列3. 信件错排一、斐波那契数列1. 爬楼梯问题爬楼梯:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法?(严格来说这不是动态规划,因为并没有要求最值,但是这个状态转移很有参考价值,主要用来体会一下什么是重叠子问题。)LeetCode 直达思路 1:自上而下求解,设对一个 n 阶的楼梯,有 F(n) 种上法。假设现在位于第 n 阶楼梯上,想要一步到达这里,可以在 n-原创 2020-06-07 21:56:25 · 3234 阅读 · 0 评论 -
动态规划Ⅰ:斐波那契数列
文章目录一、斐波那契数列1. 爬楼梯问题2. 打家劫舍系列3. 信件错排4. 母牛生产5. 数字转字符串一、斐波那契数列1. 爬楼梯问题爬楼梯:有 N 阶楼梯,每次可以上一阶或者两阶,求有多少种上楼梯的方法?(严格来说这不是动态规划,因为并没有要求最值,但是这个状态转移很有参考价值,主要用来体会一下什么是重叠子问题。)LeetCode 直达思路 1:自上而下求解,设对一个 n 阶的楼梯,有 F(n) 种上法。假设现在位于第 n 阶楼梯上,想要一步到达这里,可以在 n-1 阶一步上来,也可以在 n-2原创 2020-06-17 13:39:05 · 500 阅读 · 0 评论 -
类型题Ⅴ:回溯法
文章目录题型一:排列、组合、子集相关问题回溯法也称作暴搜(暴力搜索),本质是穷举状态空间所有可能。回溯法解题框架:result = []def backtrack(路径, 选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: # 做选择 将该选择从选择列表移除 路径.add(选择) # 进入下一层选择 backtrack(路径, 选择列表)原创 2020-09-11 14:09:28 · 597 阅读 · 0 评论 -
类型题Ⅳ:前缀和
前缀和前缀和 就是数组 第 0 项 到 当前项 的总和。比如数组 nums,那么它的前缀和 prefixSum[x] 就表示 nums 从第 0 项到第 x 项的总和。prefixSum[x]=nums[0]+nums[1]+...+nums[x]prefixSum[x] = nums[0] + nums[1] + ...+ nums[x]prefixSum[x]=nums[0]+nums[1]+...+nums[x]数组 nums 中任意一项就是两个相邻前缀和之差:nums[x]=prefix原创 2020-06-20 11:33:50 · 253 阅读 · 0 评论 -
类型题 Ⅲ:双指针及哈希表求和
1. 两数之和思路一:暴力解法,双重循环,每次固定一个 i,用 j 循环向前走,判断两数之和是否为 target,若是则返回 i 和 j 的坐标,时间复杂度为O(n2)O(n^2)O(n2)。class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: if not nums: return [] n = len(nums) for i in rang原创 2020-06-20 10:42:28 · 245 阅读 · 0 评论 -
类型题Ⅱ:位运算
文章目录位运算 —— 异或相关题目位运算 —— 异或英文: exclusive OR,缩写 xor数学符号: ⊕⊕⊕程序符号: ^运算法则: a⊕b=(¬a∧b)∨(a∧¬b)a⊕b = (¬a ∧ b) ∨ (a ∧¬b)a⊕b=(¬a∧b)∨(a∧¬b)口诀: “相同为 0,相异为 1”——XOR 在英文里面的定义为:either one (is one), but not both, 即只有一个为真(1)时结果取真(1)真值表:AB⊕⊕⊕FFFFTT原创 2020-06-20 10:35:21 · 308 阅读 · 0 评论 -
类型题Ⅰ:单调栈
单调栈算法单调栈:单调栈中的元素满足单调递增 / 递减的条件。利用单调栈,可以找到第一个比它小/大的元素的位置。新元素入栈前,会将栈顶破坏单调性的元素出栈,直到栈空或满足栈单调性才能加入新的元素。当元素出栈时,说明待入栈的新元素是出栈元素向后找第一个比它小/大的元素。通常,单调栈倾向于一维数组的问题,或者是多维数组可以转化为一维数组的问题。一般存储元素索引而非元素值。时间复杂度:O(n),所有元素只入栈一次代码框架:以单调递增栈为例for i in range(n): while stack原创 2020-06-11 15:42:14 · 244 阅读 · 0 评论 -
LeetCode刷题:树专题
文章目录【1】面试题 04.04. 检查平衡性【2】530. 二叉搜索树的最小绝对差【3】538. 把二叉搜索树转换为累加树【4】1022. 从根到叶的二进制数之和【5】543. 二叉树的直径【6】563. 二叉树的坡度【7】572. 另一个树的子树【8】606. 根据二叉树创建字符串【9】617. 合并二叉树【10】100. 相同的树【1】面试题 04.04. 检查平衡性考点: 递归思路1: 从顶向下,若根节点的左右子树高度相差小于等于1(即是平衡树),则递归向下检查每个子树是否也为平衡树。思路2原创 2022-04-12 19:45:07 · 343 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题68-Ⅱ 二叉搜索树的最近公共祖先】
【面试题68-Ⅱ 二叉搜索树的最近公共祖先】面试题68-Ⅱ:二叉搜索树的最近公共祖先:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路:二叉树后序遍历。遇到 p 或 q 向上返回,判断出 p 和 q 在某 root 节点的异侧时,该 root 即为最近的公共祖先,直接 return root。递归边界条件转载 2020-07-07 10:16:51 · 334 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题68-Ⅰ 二叉搜索树的最近公共祖先】
【面试题68-Ⅰ 二叉搜索树的最近公共祖先】面试题68-Ⅰ:二叉搜索树的最近公共祖先:给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”思路一:迭代法。题给为二叉搜索树,所以很容易判断各个值的相对位置关系。当 p 和 q 都在 root 的同一侧(左子树 / 右子树)时,则遍历到 root.left / ro转载 2020-07-07 09:20:06 · 256 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题67 把字符串转换成整数】
【面试题67 把字符串转换成整数】面试题67:把字符串转换成整数:写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略原创 2020-07-06 09:35:54 · 227 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题66 构建乘积数组】
【面试题66 构建乘积数组】面试题66:构建乘积数组:给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。参考:面试题66. 构建乘积数组(表格分区,清晰图解),两次遍历,分别计算上、下三角的乘积。class Solution: def constructArr(self, a: List[int]) -> List[int]:转载 2020-07-04 09:54:54 · 278 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题65 不用加减乘除做加法】
【面试题65 不用加减乘除做加法】面试题65:不用加减乘除做加法:写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。思路:位运算。参考:面试题65. 不用加减乘除做加法(位运算,清晰图解)作者:jydclass Solution: def add(self, a: int, b: int) -> int: x = 0xffffffff a, b = a & x, b & x转载 2020-07-01 11:00:03 · 279 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题63 股票的最大利润】
【面试题63 股票的最大利润】面试题63:股票的最大利润:假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?思路:动态规划。原创 2020-06-30 10:24:11 · 282 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题61 扑克牌中的顺子】
【面试题61 扑克牌中的顺子】面试题61:扑克牌中的顺子:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。思路:首先对数组排序,统计大小王的个数(讲道理最多两个0,但是题目没说只有一副牌,所有还是有可能有多个0的)。从第二个不为 0 的数开始检查顺子,计算和前一个不为 0 的数之差,并用大小王来补(因为大小王可以是任何数字),如果能补全所有的不连续点,就返回 True,原创 2020-06-28 10:26:54 · 460 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题60 n个骰子的点数】
【面试题60 n个骰子的点数】面试题60:n个骰子的点数:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。思路:动态规划。可以将class Solution: def twoSum(self, n: int): dp = [[0]*(6*n+1) for _ in range(n+1)] res = []原创 2020-06-27 12:26:12 · 315 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题59-Ⅱ 队列的最大值】
【面试题59-Ⅱ 队列的最大值】面试题59-Ⅱ:队列的最大值:请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1。思路:关键在于 O(1)O(1)O(1) 实现获取队列最大值,这种问题当然是使用单调栈了。维护一个双端非严格单调递减队列,当待入队元素大于当前队尾元素时,将队尾元素出队,直到满足的单调递减性质为止,这样就能原创 2020-06-26 10:17:05 · 211 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题59-Ⅰ 滑动窗口的最大值】
【面试题59-Ⅰ 滑动窗口的最大值】面试题59-Ⅰ:滑动窗口的最大值:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。思路一:暴力法。从 0 位置遍历数组,到 n-k+1 位置结束,每次获取滑动窗口中最大的数 append 到 res 数组中。时间复杂度:O(nk)O(nk)O(nk),除了滑动窗口,每次在窗口内寻找最大值也需要时间消耗,对于大小为 k 的窗口,查找最大值的花费就是 O(k)O(k)O(k)空间复杂度:O(n)O(n)O(n),最差情况下,滑动窗口大小为原创 2020-06-25 13:09:27 · 316 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题58-Ⅱ 左旋转字符串】
【面试题58-Ⅱ 左旋转字符串】面试题58-Ⅱ:左旋转字符串:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。思路一:使用字符串切片和字符串拼接。但是这样做太投机取巧了!时间复杂度:O(n)O(n)O(n),切片操作的时间复杂度空间复杂度:O(n)O(n)O(n),两个字符串切片的总长度为 Nclass Solution: def rev原创 2020-06-24 10:55:10 · 281 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题58-Ⅰ 翻转单词顺序】
【面试题58-Ⅰ 翻转单词顺序】面试题58-Ⅰ:翻转单词顺序:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。思路:先用 s.strip() 删除字符串的首尾空格,从后向前遍历字符串,根据空格判断单词,每遇到一个单词就将其 append 到 res 列表中,并判断是否为第一个单词,如果不是则继续 append 一个空格。注意 append 空格需要满足:原创 2020-06-24 10:38:15 · 186 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题57-Ⅱ 和为s的连续正数序列】
【面试题57-Ⅱ 和为s的连续正数序列】面试题57-Ⅱ:和为s的连续正数序列:输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。思路一:暴力枚举。枚举 1 到 target 二分之一长度(因为超过该大小一定不可能有两个连续正整数的和等于 target),从每个起点开始向后累加,如果找了刚好满足的序列就输出到 res 里。时间复杂度:O(n2)O(n^2)O(n2),遍历 target 长度的二分之转载 2020-06-23 09:22:00 · 270 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题57-Ⅰ 和为s的两个数字】
【面试题57 和为s的两个数字】面试题57:和为s的两个数字:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。思路一:哈希表。遍历数组一遍,边遍历边向回查找,假设当前值是 ,那么向前查找 ,如果找到了则直接返回,否则就将当前值 登记在哈希表中。时间复杂度:O(n)O(n)O(n)空间复杂度:O(n)O(n)O(n)思路二:双指针(对撞指针)。由于题目已经说了是递增数组,说明数组内部有序,那么可以用双指针分别指向数组头和尾,计算原创 2020-06-20 15:37:58 · 245 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题56-Ⅱ 数组中数字出现的次数 II】
【面试题56-Ⅱ 】Leetcode题目对应位置: 面试题56-Ⅱ:思路:转载 2020-06-20 15:15:08 · 232 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题56-Ⅰ 数组中数字出现的次数】
【面试题56-Ⅰ 数组中数字出现的次数】一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。Leetcode题目对应位置: 面试题56-Ⅰ:数组中数字出现的次数思路:难点在于时间和空间复杂度的要求,常规哈希表什么的都不可行。参考题解,可以使用异或操作。那么对于成对儿的数字,通过抑或操作就会抵消为 0,异或结果就是只出现了一次的数字。但是上述方法只适合于只有一个数字出现了一次,其他都是成对出现的情况。对于两转载 2020-06-19 10:09:22 · 205 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题55-Ⅱ 平衡二叉树】
【面试题55-Ⅱ 平衡二叉树】输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。Leetcode题目对应位置: 面试题55-Ⅱ:平衡二叉树思路:树的深度优先遍历,基于递归实现。自下而上求解每个节点左右子树的深度差,若任意一个超过 1,直接返回 false。class Solution: def isBalanced(self, root: TreeNode) -> bool: def recu转载 2020-06-18 09:58:11 · 216 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题55-Ⅰ 二叉树的深度】
【面试题55-Ⅰ 二叉树的深度】输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。Leetcode题目对应位置: 面试题55-Ⅰ:二叉树的深度思路 1:树的深度优先遍历,采用递归实现。树的高度 = max(左子树深度,右子树深度) + 1。递归终止条件:当 root 为空时,返回树深度为 0递归过程:计算 root 左子树的深度,计算 root 右子树的深度返回值:树的深度时间复杂度:O(n)O(n)O(n),n转载 2020-06-18 09:57:16 · 210 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题54 二叉搜索树的第k大节点 】
【面试题54 二叉搜索树的第k大节点】给定一棵二叉搜索树,请找出其中第k大的节点。Leetcode题目对应位置: 面试题54:二叉搜索树的第k大节点思路:二叉搜索树本身有序,中序遍历的结果就是递增序列,而题目中要求第 k 大,明显是需要一个递减序列,所以将中序遍历改为 “右根左”,就得到的是递减序列啦。用一个列表存储递减序列,最后直接返回第 k-1 个数即可(因为下标从 0 开始)。时间复杂度:O(n)O(n)O(n),最坏情况下,二叉树退化为链表,递归深度为 n空间复杂度:O(2n)O(2n)O原创 2020-06-16 13:33:36 · 219 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题53 在排序数组中查找数字】
【面试题53-I 在排序数组中查找数字】面试题53 在排序数组中查找数字 I:统计一个数字在排序数组中出现的次数。思路:由于是已排序数组,可以用二分查找找到我们的目标元素,但找到的位置不一定,可能前后都有相同的数字。然后再用双指针 i 和 j 分别指向找到的元素位置两侧,判断是否等于 target,若相等则计数器加 1,并移动指针。class Solution: def search(self, nums: List[int], target: int) -> int:原创 2020-06-16 10:53:08 · 225 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题52 两个链表的第一个公共节点】
【面试题52 两个链表的第一个公共节点】输入两个链表,找出它们的第一个公共节点。Leetcode题目对应位置: 面试题52:第一个只出现一次的字符两个链表的第一个公共节点思路:指针 p1 和 p2 分别指向链表 A 和 B,同时开始遍历链表,当指针 p1 到达 A 链表末尾时,重新定位到链表 B 的开头,同理当指针 p2 到达 B 链表末尾时,重新定位到链表 A 的开头,这样当他们相遇时,所指向的节点就是第一个公共节点。时间复杂度:O(m + n)空间复杂度:O(1)# Definition f原创 2020-06-16 09:48:38 · 202 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题50 第一个只出现一次的字符】
【面试题50 第一个只出现一次的字符】在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。Leetcode题目对应位置: 面试题50:第一个只出现一次的字符思路:暴力法。遍历整个字符串,对每个字符进行计数(用哈希表),最后再次遍历哈希表,找到值为 1 的字符串键即可。class Solution: def firstUniqChar(self, s: str) -> str: if not s: return " "原创 2020-06-16 08:56:37 · 178 阅读 · 0 评论 -
Leetcode刷题:剑指offer【面试题49 丑数】
【面试题49 丑数】我们把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。求按从小到大的顺序的第 n 个丑数。Leetcode题目对应位置: 面试题49:丑数思路:动态规划。丑数的递推性质:丑数 = 某个较小丑数 x 某因子(2/3/5)因此在求解第 k 个丑数时,只需要求得前面的丑数中,分别乘2、乘3、乘5 后最小的一个即可。比如现在已知前 3 个丑数,求第 4 个丑数:x1x2x3x4123?用 3 个指针 a、b、c 分别用来代表乘2原创 2020-06-15 10:10:24 · 231 阅读 · 0 评论