leetcode
文章平均质量分 58
leetcode刷题笔记
hhmy77
计算机研究生在读,公众号:code路漫漫
展开
-
397. 整数替换
一开始想用dp[],但是爆内存了后面改成递归,AC了class Solution: def __init__(self): self.d = dict() self.d[1] = 0 self.d[2] = 1 def integerReplacement(self, n: int) -> int: if n in self.d: return self.d[n] else:原创 2021-11-19 12:39:25 · 2999 阅读 · 1 评论 -
[code] 刷题模板
主要用Python和C++两种语言刷地图方向:d = [(-1,0),(1,0),(0,-1),(0,1)]BFS def BFS(start): if vis[start[0]][start[1]] == 1: # 根据条件返回 size = 0 # 记录数量 que = [start] # 队列 # 可加判断条件 # 标记访问 vis[start[0]][start[1]] = 1 while qu原创 2021-06-19 20:46:26 · 178 阅读 · 0 评论 -
1171. 从链表中删去总和值为零的连续节点
暴力大法# Definition for singly-linked list.# class ListNode:# def __init__(self, x):# self.val = x# self.next = Noneclass Solution: def removeZeroSumSublists(self, head: ListNode) -> ListNode: lst = [] p = hea原创 2021-04-16 10:32:42 · 142 阅读 · 1 评论 -
1367. 二叉树中的列表
递归class Solution: def isSubPath(self, head: ListNode, root: TreeNode) -> bool: if not head: return True if not root: return False if root.val == head.val: return self.isSubPath(head.next,原创 2021-04-07 21:08:08 · 101 阅读 · 0 评论 -
80. 删除有序数组中的重复项 II
双指针变量:i遍历数组j停留在应该替换的位置cur保存当前遍历到的数字cnt保存当前遍历到数字的个数策略:如果 nums[i] = cur,说明相同字符,此时:如果 nums[j] != cur,那么应该替换然后计数cnt+1,如果cnt>2,那么应该停留,因为已经有两个元素保存了如果 nums[i] != cur,说明出现新字符,此时:更新cur,和cnt,替换num[j]class Solution: def removeDuplicates(self, nums)原创 2021-04-06 14:59:09 · 81 阅读 · 0 评论 -
88. 合并两个有序数组
概述用暴力的方法很简单,非暴力的解法比较巧妙合并后排序class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ i,j = m,0 while j<n:原创 2021-04-05 20:13:59 · 87 阅读 · 0 评论 -
转换成BST的两道题目
文章目录概述题目108. 将有序数组转换为二叉搜索树二分建树109. 有序链表转换二叉搜索树暴力快慢指针+递归分治+中序遍历优化1382. 将二叉搜索树变平衡暴力二分总结概述108. 将有序数组转换为二叉搜索树109. 有序链表转换二叉搜索树延申题目:BST为什么是平衡的1382. 将二叉搜索树变平衡题目108. 将有序数组转换为二叉搜索树二分建树直接二分建树就好/** * Definition for a binary tree node. * struct TreeNode原创 2021-04-03 20:21:14 · 139 阅读 · 0 评论 -
链表相加的两道题目
文章目录概述2. 两数相加遍历两趟使用新链表445. 两数相加 II暴力用栈概述2. 两数相加445. 两数相加 II2. 两数相加这道题头疼的地方就是链表长度不一样我们处理一下链表,让l1的长度始终大于等于l2,然后只对这种情况处理,逻辑就会好写很多遍历两趟class Solution: def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: # 先把链表处理成l1最长原创 2021-04-02 22:06:32 · 121 阅读 · 0 评论 -
138. 复制带随机指针的链表
文章目录概述分析题解暴力 使用额外的存储空间转换为图DFSBFScopy和拆分总结概述此题同 剑指 Offer 35. 复杂链表的复制这道题解法非常多分析如果没有random指针,那么就是普通的单链表现在多出来的条件是,有一个random指针,要求我们把random指针也拷贝下来random指针指向的是结点,不是index,如果是index就好办很多题解暴力 使用额外的存储空间现在关键的地方是我们怎么把random指针指向的结点保存下来由于这个自定义类是可变的,我们没办法做hash来记原创 2021-04-02 11:12:27 · 96 阅读 · 1 评论 -
两道链表展开的题目
概述114. 二叉树展开为链表430. 扁平化多级双向链表114 这道题目要求我们把一颗二叉树展开成链表430 这道题目要求我们把复杂的链表展开114题解已经发布在这篇博客,这里不再赘述了下面写430的题解先序递归仔细观察这个链表结构,发现我们按照先序递归的方式来访问这个复杂链表,刚好就能得到展开后的结果,那么可以写出代码:class Solution: def flatten(self, head: 'Node') -> 'Node': if not h原创 2021-04-01 16:19:52 · 61 阅读 · 0 评论 -
1006. 笨阶乘
文章目录概述题解暴力 表达式求值优化暴力循环计算数学概述展开为算术表达式,不带括号,然后向下取整那这道题就是计算表达式就行了,计算表达式在之前的博文里面有介绍,这里再复习一下题解暴力 表达式求值按照题意我们需要生成算术表达式 s = [] op = ['*','/','+','-'] ind = 0 for i in range(N,0,-1): s.append(i) if i !原创 2021-04-01 11:53:18 · 137 阅读 · 0 评论 -
725. 分隔链表
题解关键点在于k<size的时候怎么按照题目正确划分每个part的数量size=10,k=3的时候,得到4,3,3的组合size=14,k=3的时候,得到4,4,3,3的组合容易得到规律,basic=size//k是每个划分区域的基础大小,然后初始化我们让每个part大小为basic,然后我们把size%k的数量,依次给前面的每个part加1,这样刚好是正确的数量然后我们需要实现一个摘下链表前n个结点的代码 # 取得一段链表的前n个结点,并且返回截取后的新链表 def get原创 2021-03-27 20:07:10 · 84 阅读 · 0 评论 -
旋转数组、链表
文章目录概述题目189. 旋转数组朴素旋转规律61. 旋转链表二次遍历,成环+断链逆置725. 分隔链表概述有考察数学的,有考察操作的题目61.旋转链表189. 旋转数组725. 分隔链表189. 旋转数组这道题如果用O(n)O(n)O(n)的空间来辅助移动那么很容易解决,这里就不贴了这个方法了朴素旋转按照规律移动每个元素到它应该位于的位置class Solution {public: void rotate(vector<int>& nums, in原创 2021-03-27 16:45:45 · 92 阅读 · 0 评论 -
幂相关专题
概述题目Pow(x, n)x 的平方根有效的完全平方数超级次方50. Pow(x, n)需要处理的是n<=0的状态如果n=0,那么返回1如果n<0,那么取x的倒数,再乘朴素解法 未通过class Solution: def myPow(self, x: float, n: int) -> float: if n == 0 : return 1 if n<0:原创 2021-03-26 10:56:06 · 197 阅读 · 0 评论 -
删除排序链表中重复元素
概述两道题目,都是对排序链表做删除操作没有什么特别难的地方,就是考察代码能力和链表操作题目删除排序链表中的重复元素删除排序链表中的重复元素 II删除排序链表中的重复元素朴素迭代:class Solution: def deleteDuplicates(self, head: ListNode) -> ListNode: if not head: return head p = head原创 2021-03-25 16:30:28 · 177 阅读 · 0 评论 -
114. 二叉树展开为链表
文章目录递归分析利用栈迭代展开O(1)的迭代展开,和解法1思想相同修改last指针,后序递归这道题解法太多了,先写自己的解法,然后摘录一些精妙的写法递归分析按照之前文章的思路递归的一些例子,稍微分析一下就能写出代码边界情况root为空或者root无左右孩子一般操作展开左子树得到L,展开右子树得到R然后寻找root的前驱结点t,将t的右指针指向R将root.left置为空,root.right置为L返回部分返回拼接后的root即可class Solution: def fl原创 2021-03-19 11:23:30 · 89 阅读 · 0 评论 -
链表翻转专题
文章目录概述题目定义基于迭代的翻转基于递归的翻转给翻转指定一个区间直接套用reverseList改进reversList(head指定翻转的个数 以2为例指定翻转的个数 给定K总结参考文章概述链表结构描述# Definition for singly-linked list.class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next由ListNo原创 2021-03-18 16:47:35 · 147 阅读 · 0 评论 -
计算器类题目的解法汇总
文章目录题目解法通用解法 转换成逆波兰表达式展开括号 针对224,227通用解法 基于递归引用题目力扣上关于计算器的题目:逆波兰表达式求值基本计算器基本计算器 II基本计算器 III基本计算器 IV为运算表达式设计优先级给表达式添加运算符其中基本计算器1~3是让我们设计算器,后两道题目其实和设计计算器没太大关系特别说明,由于精度的问题,这里的题目凡是涉及到除法都只保留整数部分解法通用解法 转换成逆波兰表达式对于逆波兰表达式,我们可以用一个栈就能求解出结果,这也是150.原创 2021-03-14 18:58:03 · 464 阅读 · 0 评论 -
224. 基本计算器
展开整个式子只有+ - ( ),如果我们把括号展开,那么可以遍历一次得到答案,即数字和符号的组合相加例如 1+2+(3-(4+5)) = 1+2+3-4-5,是+1 +2 +3 -4 -5这些数字合起来关键是我们怎么把括号展开同时给每个数字赋予正确的符号数字的符号被两个因素影响数字当前的符号数字之前的符号例如-(1+2)中2的符号,第一点,2的符号是+,第二点,2的符号受到了括号前-的影响,综合下来2的符号是-数字当前的符号很好判断,要么是正要么是负,但是数字之前的符号需要记录下来,每个原创 2021-03-13 16:13:34 · 103 阅读 · 0 评论 -
131. 分割回文串
最朴素的回溯直接写了一个朴素的回溯,无剪枝也无优化的class Solution: def partition(self, s: str) -> List[List[str]]: self.ans = [] self.back(s,[]) return self.ans def back(self,s,lst): if s == '': self.ans.a原创 2021-03-07 13:49:57 · 125 阅读 · 0 评论 -
下一个更大元素 123
496. 下一个更大元素 I - 力扣(LeetCode) (leetcode-cn.com)503. 下一个更大元素 II - 力扣(LeetCode) (leetcode-cn.com)556. 下一个更大元素 III - 力扣(LeetCode) (leetcode-cn.com)1条件1 <= nums1.length <= nums2.length <= 10000 <= nums1[i], nums2[i] <= 10^4nums1和nums2中所有原创 2021-03-07 11:08:43 · 72 阅读 · 0 评论 -
303. 区域和检索 - 数组不可变
前缀和暴力解法class NumArray: def __init__(self, nums: List[int]): self.lst = nums def sumRange(self, i: int, j: int) -> int: return sum(self.lst[i:j+1])# Your NumArray object will be instantiated and called as such:# obj = NumAr原创 2021-03-01 12:09:13 · 72 阅读 · 0 评论 -
链表排序相关
文章目录链表结构题目要求一般做法说明选择排序插入排序快速排序归并排序链表结构给定的链表要么是单链表、要么是双链表,不过一般是单链表题目要求是否可以交换结点的值?还是只能交换结点,值无法改变?最简单的要求是我们可以交换结点的值,如果要求只能交换结点的位置,那么代码会变得稍微复杂一些一般做法任何时候,我们都可以遍历一次链表,把链表的值拷贝下来存放到数组中,对数组进行排序,然后将排序后的结果依次赋值给链表结点,此时的开销相当于我们对数组排序的基础上增加了遍历的开销如果不是特别要求的话,直接使用一原创 2021-02-12 20:57:42 · 527 阅读 · 1 评论 -
力扣第 221 场周赛
文章目录5637. 判断字符串的两半是否相似5638. 吃苹果的最大数目5210. 球会落何处5640. 与数组中元素的最大异或值经历5637. 判断字符串的两半是否相似class Solution: def halvesAreAlike(self, s: str) -> bool: score = ('a','e','i','o','u','A','E','I','O','U') a = s[:len(s)//2] b = s[len(s)原创 2020-12-27 18:51:51 · 179 阅读 · 0 评论 -
455. 分发饼干
暴力class Solution: def findContentChildren(self, g: List[int], s: List[int]) -> int: ans = 0 cg = Counter(sorted(g)) cs = Counter(sorted(s)) # 匹配剩下的元素 for gk in cg.keys(): for ck in cs.key原创 2020-12-25 11:11:12 · 89 阅读 · 0 评论 -
135. 分发糖果
每个孩子至少1个,则ans >= NN个孩子排成直线,不是环,不用考虑首尾问题然后遍历每个孩子,如果这个孩子评分比相邻的孩子高,那么给他+1,如果与相邻的孩子相等,则他们获得的糖果数没有要求模拟 AC思路:整个数组里面,评分最低的肯定是获得糖果最少的并且一定是1,因为整个最少糖果数组肯定是由1生成的按照评分最少的元素开始遍历ratings,然后检查它周围的元素,如果它周围元素大,那么就给它周围元素更新为当前糖果数+1class Solution: def candy(self,原创 2020-12-24 14:08:19 · 193 阅读 · 0 评论 -
387. 字符串中的第一个唯一字符
哈希遍历两趟字符串class Solution: def firstUniqChar(self, s: str) -> int: ans = 0 mp = Counter(s) for i,ch in enumerate(s): if mp[ch] == 1: return i return -1 时间复杂度 O(n)O(n)O(n)空间复杂度 O(∣s∣)O(原创 2020-12-23 14:14:30 · 184 阅读 · 0 评论 -
316. 去除重复字母
贪心+栈字符串里面每个字母至少出现1次,有些字母会出现多次,对于重复的字母,我们只能保留1次,去掉多余的字母,合理的选取要保留的元素,使得重构后的字符串字典序最小对于bcabc,里面b和c重复,a只出现1次,去掉前面重复的bc,得到abc字典序最小对于cbacdcbc,其中cb重复,ad唯一,我们ad的相对位置一定是不能改变的,整个字符串现在变成xxaxdxxx,往里面填充字符,显然xxacdxbx即acbd是最终答案经过初步分析,我们现在得到字符串里面字母个数的两个特性字母个数只有一个字母个原创 2020-12-20 22:09:27 · 527 阅读 · 0 评论 -
48. 旋转图像
文章目录映射关系 AC题解借用辅助空间原地旋转对角线反转这道题解法非常多,另外此题同 https://leetcode-cn.com/problems/rotate-matrix-lcci/ 面试题 01.07. 旋转矩阵映射关系 AC假设矩阵A是原本的矩阵,B是旋转后的矩阵,n是矩阵行数那么A、B中元素有如下映射关系A[i][j]=B[j][n−i−1]A[i][j] = B[j][n-i-1]A[i][j]=B[j][n−i−1]并且这个映射是单一映射,那现在就好办了,我们只要从A矩阵按照这个映原创 2020-12-19 15:39:46 · 139 阅读 · 1 评论 -
IDEA导入opencv
工作需要用到java做图像处理,导入opencv参考这篇文章:https://medium.com/@aadimator/how-to-set-up-opencv-in-intellij-idea-6eb103c1d45c然后在java里面写的时候,必须要在类里面加上 static { // 动态链接opencv System.loadLibrary(Core.NATIVE_LIBRARY_NAME); }不然会报错文档搜 opencv javado原创 2020-12-18 19:34:21 · 872 阅读 · 0 评论 -
389. 找不同
哈希哈希做这道题很简单class Solution: def findTheDifference(self, s: str, t: str) -> str: d1 = Counter(s) d2 = Counter(t) # 添加了新字母 if len(d1.keys()) != len(d2.keys()): return list(set(d2.keys()) - set(d1.keys()))[原创 2020-12-18 10:46:34 · 183 阅读 · 0 评论 -
leetcode 股票问题汇总
文章目录题目121. 买卖股票的最佳时机暴力记录极小值O(n)解法DP股票问题有很多很多技巧题目买卖股票的最佳时机只能买卖一次买卖股票的最佳时机 II可以买卖多次,但是买入之前手上不能拥有股票买卖股票的最佳时机 III最多可以买卖两次买卖股票的最佳时机 IV给定k,最多可以买卖k次最佳买卖股票时机含冷冻期卖出股票后第二天无法买入IPO剑指 Offer 63. 股票的最大利润同121买卖股票的最佳时机含手续费可以买卖多次,但是每次都要支付给定的手续费股票价格跨度12原创 2020-12-17 21:50:39 · 153 阅读 · 0 评论 -
738. 单调递增的数字
暴力 TLEclass Solution: def monotoneIncreasingDigits(self, N: int) -> int: while True: if self.judge(N): return N N-=1 def judge(self,N): s = str(N) for i in range(len(s)-1):原创 2020-12-15 12:52:46 · 148 阅读 · 0 评论 -
49. 字母异位词分组
暴力 hash没有给输入样例长度对list里面的每个单词统计里面的字母和词频,得到由这些字母组成的字典如果两个字母对应的字典是相同的,那么它们就是字母异位词现在的问题就是找到字典下对应的所有字母异位词即可,直接构造不可取,一共有n!种组合,还要比较,直接遍历原来的list即可但是字典不能在python中hash,我们转换成用下标来hash,用que来存放队列,添加时用in来判断字典是否在里面虽然这个字母都是小写字母,但是根据我的经验判断,使用库dict比自己手写开数组效率要高class Sol原创 2020-12-14 10:42:37 · 120 阅读 · 0 评论 -
376. 摆动序列
文章目录尝试第一次尝试 二重循环 WA第二次尝试 回溯 TLE第三次尝试 DP 没分析出来题解DP贪心很有难度的一道题,尝试了很多次,还是没写出来尝试第一次尝试 二重循环 WA对所有元素,尝试构成一个符合条件的摆动序列,然后统计最大长度,复杂度O(n2)O(n^2)O(n2)class Solution: def wiggleMaxLength(self, nums: List[int]) -> int: if not nums: return原创 2020-12-13 19:43:05 · 272 阅读 · 1 评论 -
649. Dota2 参议院
第一次尝试 暴力本来想统计字符串里面R和D的数目,发现想得太简单了“DDRRR”虽然R多,但却是D赢了,因为D先行ban了两个R,还剩一个R ban了一个D,然后剩下那个D又把R给ban了,最后5个只剩下一个D所以是D赢第二次尝试 模拟观察上面的投票过程,只有当队列中能够投票的元素均相同的时候才能宣布胜利,否则每个元素都会禁止离它最近的下一个敌对元素,那么我们按照这个策略来模拟使用r和d来统计当前分别能够投票的元素个数,使用flag数组标记flag[i]是否有投票权利遍历队列,直到r或d原创 2020-12-11 12:42:29 · 339 阅读 · 0 评论 -
842. 将数组拆分成斐波那契序列
又是一道贪心,不会写,照搬题解思路回溯+剪枝回溯的模板很简单if 枚举完所有条件: 记录 返回 for i in 待选的情况: if 需要剪枝: break if i满足某些条件: 选择i 继续回溯(更新变量) 不选i对于这道题,可以分析出三种剪枝情况如果当前数字是0,那么我们只能加入0或者退出这轮选择(因为之后的数不能以0开头),后面的情况就是需要剪枝如果当前数字是超过了2^31-1,那么剪枝,因为之后的数肯定会超过2^31-1如果当前数字超过了F[-2]+F原创 2020-12-08 16:37:56 · 116 阅读 · 0 评论 -
861. 翻转矩阵后的得分
贪心每次都改变一行或者一列,将0和1互换若干次操作之后,按照每行的数统计结果,用二进制表示首先高位的1会大于所有低位的1之和,如1000 = 8 > 0111 = 7那么我们贪心的策略就有了,其次为了尽可能的构造高位1,对于第一列,如果翻转后1的个数多,那么就翻转,由于此时保证了最高位出现了最多的1,那么我们接下来依次检查每一行,如果这一行首尾不是0,那么就翻转这一行然后我们用列变换再次检查其它列的元素,如果翻转后1变多,那么翻转列总结一下策略检查第一列,如果翻转后1变多,那么翻转检原创 2020-12-07 11:13:02 · 183 阅读 · 0 评论 -
621. 任务调度器
12月份的题目怎么一直都是贪心题。。第一次尝试 暴力模拟 TLE很明显的贪心,求最短时间相同的字母之间执行顺序需要等待n的时间,不能连续执行n的范围是0到100还是要用到hash table来记录任务种类,key是字母,value是次数直观的想法是,当我们选择了一个任务,标记它被选择的时间然后当我们需要选择任务的时候,寻找一个剩余次数最多的任务,如果它标记的时间大于n则执行,如果没有大于n那么寻找次多的任务,重复上述步骤直到能选择一个任务执行,如果都不行,那么轮空下面整理这个思路首先用C原创 2020-12-05 16:18:08 · 158 阅读 · 0 评论 -
659. 分割数组为连续子序列
第一次尝试先O(N)遍历一次检查数组元素是不是连续的,不连续返回false维护一个最小堆和一个res序列,里面的元素是(value,cnt),根据value来排序,我们用last来标记当前序列选择的最后一个元素,用x,cnt表示弹出的堆顶元素如果当前堆顶元素能够和last构成连续,那么执行如下操作cnt-=1,更新last为x,然后放入res序列里面,等待下一轮遍历如果构不成连续,返回False如果res不为空,重新构造heap执行上面的步骤,直到res为空暴 力 大 失 败题解受不了了直原创 2020-12-04 14:14:28 · 611 阅读 · 0 评论