
模拟/遍历
算法
dinosaurcity
这个作者很懒,什么都没留下…
展开
-
【9月打卡~Leetcode每日一题】437. 路径总和 III(难度:中等)
437. 路径总和 III树的前缀和 时间复杂度O(N)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(x), left原创 2021-09-28 10:29:03 · 320 阅读 · 0 评论 -
【7月打卡~Leetcode每日一题】剑指 Offer 52. 两个链表的第一个公共节点(难度:简单)
思路:假设A链表的独立长度为a,公共长度为c(c可能为0)B链表的独立长度为b,公共长度为c如果两链表有公共节点,则一定满足 a+c+b = b+c+a若无公共节点,则一定满足 a+b = b+a在遍历时可以令两个指针分别遍历A链表和B链表,如果没碰到公共节点就交换遍历,如果两者同时遍历到nullptr,则说明是 a+b = b+a这个情况,如果同时遍历到一个公共节点,则说明是 a+c+b = b+c+a这个情况,同时要注意的是,还有一种情况是a = b,此时在 a+c+b = b+c+a 这个公.原创 2021-07-21 10:10:01 · 137 阅读 · 0 评论 -
【重拾算法~Leetcode每日一题】95. 不同的二叉搜索树 II(难度:中等)
95. 不同的二叉搜索树 II给定一个整数 n,生成所有由 1 … n 为节点所组成的 二叉搜索树 。# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass Solu原创 2020-07-21 10:23:51 · 194 阅读 · 0 评论 -
【1月打卡~Leetcode每日一题】86. 分隔链表(难度:中等)
86. 分隔链表给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。思路:遍历注意事项:链表题,一定一定自己画一下图,不然很容易出错# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = No原创 2021-01-03 19:07:48 · 155 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】330. 按要求补齐数组(难度:困难)
330. 按要求补齐数组给定一个已排序的正整数数组 nums,和一个正整数 n 。从 [1, n] 区间内选取任意个数字补充到 nums 中,使得 [1, n] 区间内的任何数字都可以用 nums 中某几个数字的和来表示。请输出满足上述要求的最少需要补充的数字个数。思路:将nums中所有数字可组合成的数字表示出来,然后从1到n遍历,如果无法表示,则ans+1,随后将所有已可表示的数字+当前的数字(全部可以表示)class Solution: def minPatches(self, num原创 2020-12-29 17:01:09 · 151 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】135. 分发糖果(难度:困难)
135. 分发糖果老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:1.每个孩子至少分配到 1 个糖果。2.相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢首先每个孩子给1个糖果,即可满足条件1,对于条件2,执行两次遍历即可思路:顺序遍历,满足该孩子比左边孩子拿到的多(如果评分高),逆序遍历,在满足前者的基础上,满足该孩子比右边的孩子拿到的多(如果评分高)原创 2020-12-24 10:42:12 · 189 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】103. 二叉树的锯齿形层序遍历(难度:中等)
103. 二叉树的锯齿形层序遍历给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。本质上还是中序遍历,只要在遍历的时候使用标记位翻转子数组即可# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# s原创 2020-12-22 09:38:20 · 155 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】389. 找不同(难度:简单)
389. 找不同给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。这道题虽然是个简单题,但是有个很有意思的解法,我第一次做是用的hash表存储,然后遍历hash表的values值,找到为奇数的那个,题解给了个更好的做法,那就是异或异或:· a异或a = 0· 0异或a = a他主要用到了上述两点class Solution: def findTheDifference(self, s原创 2020-12-18 11:54:10 · 176 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】738. 单调递增的数字(难度:中等)
738. 单调递增的数字给定一个非负整数 N,找出小于或等于 N 的最大的整数,同时这个整数需要满足其各个位数上的数字是单调递增。(当且仅当每个相邻位数上的数字 x 和 y 满足 x <= y 时,我们称这个整数是单调递增的。)思路:从右往左扫描,如果当前位置的数比前一位小,则将前一位数减一,后面的数全部置9class Solution: def monotoneIncreasingDigits(self, N: int) -> int: st = str(N原创 2020-12-15 12:27:09 · 189 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】49. 字母异位词分组(难度:中等)
49. 字母异位词分组给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。思路:异位词在排序后的结果一定是一致的,因此可以根据排序结果存入hash表,遍历hash表得到结果class Solution: def groupAnagrams(self, strs: List[str]) -> List[List[str]]: dic = collections.defaultdict(list) for st in s原创 2020-12-14 15:07:56 · 170 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】376. 摆动序列(难度:中等)
376. 摆动序列思路:模拟遇到不是摆动的数对,直接跳到下一个数对即可。需要注意的是,特判一下数对中两值相同时的情况class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: n = len(nums) if n<2 : return n ans,k = 2,-1 for i in range(n-1): if nu原创 2020-12-12 09:39:49 · 142 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】621. 任务调度器(难度:中等)
621. 任务调度器这道题看起来很吓人,但是其实就是构造问题,和我11月写的那道题解很类似【11月打卡~Leetcode每日一题】767. 重构字符串(难度:中等)那道题是隔一放一,这道题是隔n放一,然后再考虑最大词频的有几个即可class Solution: def leastInterval(self, tasks: List[str], n: int) -> int: if not tasks: return 0 coun原创 2020-12-05 09:22:07 · 247 阅读 · 0 评论 -
【12月打卡~Leetcode每日一题】204. 计数质数(难度:简单)
204. 计数质数统计所有小于非负整数 n 的质数的数量。在这里使用枚举的话,时间复杂度为O(n^1.5)可以考虑使用埃氏筛降低复杂度到O(nloglogn)即, for i in range(2,n):遍历,i的倍数肯定不是质数,后续再次遍历时也不用考虑,这样可以有效减少其重复性class Solution: def countPrimes(self, n: int) -> int: if n < 2: return 0原创 2020-12-03 10:40:47 · 119 阅读 · 0 评论 -
【11月打卡~Leetcode每日一题】767. 重构字符串(难度:中等)
767. 重构字符串给定一个字符串S,检查是否能重新排布其中的字母,使得两相邻的字符不同。若可行,输出任意可行的结果。若不可行,返回空字符串。与 男女排座问题类似,只需要统计出每个字符的词频,如果大于总长的一半(偶数情况)或大于总长的一半+1(奇数情况),则无法排序(排序方法为:隔一放一),否则直接按照词频隔一放一即可,贪心算法class Solution: def reorganizeString(self, S: str) -> str: Counter = col原创 2020-11-30 13:54:34 · 185 阅读 · 1 评论 -
【11月打卡~Leetcode每日一题】134. 加油站(难度:中等)
134. 加油站首先确定两个前提:如果有解,则答案唯一如果sum(gas)>=sum(cost),则一定有解如果有解,怎么找出发点呢?假如我们现在要从第i个加油站出发,决定我们能不能到达第i+1个加油站的,是cost[i]和gas[i]如果cost[i]<=gas[i],则能到达,且剩下gas[i]-cost[i]的油量如果cost[i]>gas[i],则不能到达因此我们考虑建立一个新的数组store,store[i]=gas[i]-cost[i],表示从第i个加油原创 2020-11-18 10:19:49 · 134 阅读 · 0 评论 -
【11月打卡~Leetcode每日一题】328. 奇偶链表(难度:中等)
328. 奇偶链表给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数。链表这种题还是要在纸上写一下模拟一下比较好,不然很容易出错,我这道题提交了4次才过,不管总体来说没有什么难思考的点,双指针遍历即可,要注意,在后续修改节点的时候,前面如果有调用,那么前面调用的链表中的该节点已被修改,需要仔细考虑,不然原创 2020-11-13 14:06:41 · 134 阅读 · 0 评论 -
【11月打卡~Leetcode每日一题】57. 插入区间(难度:困难)
57. 插入区间模拟法:分三种情况,①指定区间在当前区间右边(即未合并)②指定区间在当前区间左边(即未合并或已合并)③指定区间与当前区间有重合(即正在合并)class Solution: def insert(self, intervals: List[List[int]], newInterval: List[int]) -> List[List[int]]: ans,flag = list(),False #flag表示是否已经插入 a,b = new原创 2020-11-04 21:30:52 · 136 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】381. O(1) 时间插入、删除和获取随机元素 - 允许重复(难度:困难)
381. O(1) 时间插入、删除和获取随机元素 - 允许重复class RandomizedCollection: def __init__(self): """ Initialize your data structure here. """ self.collection = [] def insert(self, val: int) -> bool: """ Inserts原创 2020-10-31 09:51:07 · 284 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】129. 求根到叶子节点数字之和(难度:中等)
129. 求根到叶子节点数字之和比较简单的一道深搜题# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def sumNumbers(self, root: TreeNode) -> i原创 2020-10-29 10:22:42 · 166 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】473. 火柴拼正方形(难度:中等)
473. 火柴拼正方形搜索+回溯(其实就是枚举class Solution: def makesquare(self, nums: List[int]) -> bool: if not nums: return False total = sum(nums) each = total >> 2 if each << 2 != total:原创 2020-10-27 10:30:18 · 189 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】144. 二叉树的前序遍历(难度:中等)
144. 二叉树的前序遍历给定一个二叉树,返回它的 前序 遍历见九月份打卡https://blog.youkuaiyun.com/qq_42247018/article/details/108576535frontbl函数原创 2020-10-27 09:41:00 · 175 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】845. 数组中的最长山脉(难度:中等){补昨日}
845. 数组中的最长山脉思路:①先找数组中的“山峰”和“山谷”②定义山峰到两边山谷的距离为山脉的距离③遍历取最大的山脉class Solution: def longestMountain(self, A: List[int]) -> int: len_ = len(A) - 1 if len_ < 2 : return 0 peak,valley = list(),list() if原创 2020-10-26 10:09:35 · 195 阅读 · 1 评论 -
【10月打卡~Leetcode每日一题】143. 重排链表(难度:中等)
143. 重排链表# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def reorderList(self, head: ListNode) -> None: """ Do n原创 2020-10-20 15:55:04 · 171 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】116. 填充每个节点的下一个右侧节点指针(难度:中等)
116. 填充每个节点的下一个右侧节点指针"""# Definition for a Node.class Node: def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None): self.val = val self.left = left self.right = right self.ne原创 2020-10-15 20:11:28 · 129 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】24. 两两交换链表中的节点(难度:中等)
24. 两两交换链表中的节点这道题说难也难,说简单也简单,最好是自己画一下图,不然很容易漏连节点# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def swapPairs(self, head: ListNode原创 2020-10-13 18:21:44 · 174 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】1002. 查找常用字符(难度:简单)
1002. 查找常用字符给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。思路:用了个比较python的双列表存储的办法解决class Solution: def commonChars(self, A: List[str]) -> List[str]: temp_a,temp_b = []原创 2020-10-14 10:36:14 · 227 阅读 · 1 评论 -
【10月打卡~Leetcode每日一题】530. 二叉搜索树的最小绝对差(难度:简单)
530. 二叉搜索树的最小绝对差直接深搜,用中序遍历的思想,先找到最左边的节点,一步一步迭代到最右边的节点# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: def getMinimumDif原创 2020-10-12 23:33:35 · 139 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】75. 颜色分类(难度:中等)
75. 颜色分类给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。其实题目大意就是:给你一个数组Nums,内含0 ,1 ,2(可能不全含),让升序排序【要注意是在原数组操作,不另开空间】。今天上午买衣服,下午4点多到宿舍,吃完饭收拾了行李倒垃圾,8点半才来实验室,做题也感觉脑子有点不清醒,不是debug,完全是在试错。有点不太想动脑子,写完题解今天早点原创 2020-10-07 21:58:40 · 312 阅读 · 0 评论 -
【10月打卡~Leetcode每日一题】834. 树中距离之和(难度:困难)
834. 树中距离之和class Solution: def sumOfDistancesInTree(self, N: int, edges: List[List[int]]) -> List[int]: tree = [[] for _ in range(N)] for baba, erza in edges: tree[baba].append(erza) tree[erza].append(baba)原创 2020-10-06 20:33:32 · 88 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】538. 把二叉搜索树转换为累加树(难度:简单)
538. 把二叉搜索树转换为累加树事实证明不管题目再简单,通过率再高,都要自己看题,我超时了两版代码,一度满头问号,再看题目发现,哦,原来是二叉搜索树贴一下自己超时的代码吧(二叉搜索树少了很多条件,所以我用普通的树来做会超时)# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None#原创 2020-09-21 15:37:14 · 148 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】37. 解数独(难度:困难)
37. 解数独说实话,一开始看到这个题目的时候我是很拒绝的,因为感觉不确定性太大,然后去听了会歌,放松了一下心情,写下了第一版代码维护3个数组+1个队列,数组分别存每行、每列、每单元格的数字情况队列用于存储未填充的空白格遍历数独,如果是空白,则加入visit队列,如果是数字,则在对应的三个数组中更新相应的信息。在第一次中,我看通过率很高(事实证明是假的 )就直接用最简单的判断,如果该空白只有一个可以填的数字,那么填入这个数字并更新数组,因此超出时间限制了。在第二版代码里用了枚举+回溯,当递原创 2020-09-15 13:25:07 · 1272 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】94. 二叉树的中序遍历(难度:中等)
94. 二叉树的中序遍历给定一个二叉树,返回它的中序遍历。这道题没什么可说的在这里写一下最简单的几个遍历模版吧(前序、中序、后序):# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution: de原创 2020-09-14 11:46:49 · 167 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】216. 组合总和 III(难度:中等)
216. 组合总和 III大胆猜测,明天的每日一题是组合总和IV组合总和III其实比前两个都简单,看了眼通过率,不像是卡时间限制的,就直接敲了,没进行剪枝class Solution: def combinationSum3(self, k: int, n: int) -> List[List[int]]: a,ans = [],[] def dfs(a,b): sum_,len_ = sum(a),len(a)原创 2020-09-11 16:31:01 · 202 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】40. 组合总和 II(难度:中等)
40. 组合总和 II昨天那道题的变形版class Solution: def combinationSum2(self, candidates: List[int], target: int) -> List[List[int]]: def dfs(pos: int, rest: int): nonlocal sequence if rest == 0: ans.append(sequenc原创 2020-09-10 20:03:25 · 150 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】39. 组合总和(难度:中等)
39. 组合总和from typing import Listclass Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: def dfs(candidates, begin, size, path, res, target): if target < 0: return原创 2020-09-09 21:03:00 · 170 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】77. 组合(难度:中等)
77. 组合Python使用itertools库一行代码class Solution: def combine(self, n: int, k: int) -> List[List[int]]: return list(itertools.combinations(range(1,n+1),k))原创 2020-09-08 20:17:33 · 130 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】107. 二叉树的层次遍历 II(难度:简单)
107. 二叉树的层次遍历 II给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)这两天真的是周末吗,力扣的每日一题居然是简单。这道题就是一个BFS,最佳时间复杂度是N,如果想优化的话,python可以用一下deque,在插入和删除的时候提升速度(如果树比较大的话),不过实测速度提升不多# Definition for a binary tree node.# class TreeNode:# def __init__(self,原创 2020-09-06 09:48:01 · 179 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】60. 第k个排列(难度:中等)
60. 第k个排列(难度:中等)这题不算特别难,属于找规律的题目,看了一眼通过率大概50%就知道暴力算法肯定不行,因此需要找到输入和输出中的关系,他给的排列就是暗示,n个数字一共有n!个排列,且以其中的某一个数字为开始的排列有(n-1)!种,那么我只要找到k在n的时候对应的区域,再找k在n中对应区域的值映射到n-1中对应的区域即可,这其中要注意的是,由于每个区域有(n-1)!个数,因此k%=(n-1)! 即可得出k在某区域对应的坐标class Solution: def getPermutat原创 2020-09-05 11:47:21 · 163 阅读 · 0 评论 -
【9月打卡~Leetcode每日一题】257. 二叉树的所有路径(难度:简单)
二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。很简单一道题,直接dfs加一些限定条件# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# self.right = Noneclass Solution:.原创 2020-09-04 09:19:16 · 160 阅读 · 0 评论 -
【8月打卡~Leetcode每日一题】17. 电话号码的字母组合(难度:中等)
期末考试后继续写题解class Solution: def letterCombinations(self, digits: str) -> List[str]: if not digits: return list() phoneMap = { "2": "abc", "3": "def", "4": "ghi", "5"原创 2020-08-26 14:29:43 · 360 阅读 · 0 评论