
LeetCode笔记
LeetCode个人练习笔记
onlywishes
我不知道路途的前方究竟有什么,但还是迈出了步伐,我们仍在旅途之中。
展开
-
【LeetCode】229. 求众数 II
解题思路:一)哈希使用哈希表来计算每个数的个数,然后返回相同数的个数判断是否满足要求 ls = [] #结果 lt = {} for i in nums: lt[i] = lt.get(i,0)+1 #计数 for i,j in lt.items(): if lt[i] > len(nums)/3: #判断 ..原创 2022-03-25 23:13:50 · 460 阅读 · 0 评论 -
【LeetCode】226. 翻转二叉树
解题思路:一):递归要求翻转整棵树,就是要把每个节点的左孩子与右孩子交换,那么可以用递归将左右孩子交换,从下到上,从里到外 if not root: return root cur = root.left root.left = self.invertTree(root.right) root.right = self.invertTree(cur) return roo..原创 2022-03-19 23:02:59 · 544 阅读 · 0 评论 -
【LeetCode】219. 存在重复元素 II
解题思路:一):暴力解直接俩for循环记录相同值下标并计算两者间距离,距离满足小于K,返回True.注:时间复杂度太高,超时 for i in range(len(nums)): for j in range(i+1,len(nums)): if nums[i] == nums[j] and j-i<=k: return True else: ..原创 2022-03-18 23:59:44 · 306 阅读 · 0 评论 -
【LeetCode】169. 多数元素
解题思路:一)哈希既然总存在多数元素,也就是目标元素个数总大于总元素的一半,那么可以用哈希表遍历数组,将每个数存进去,每存一个相同的数设置其个数加一,如果有元素的个数大于总数一半,返回该元素 lt = {} for i in range(len(nums)): lt[nums[i]] = lt.get(nums[i],0)+1 #将每个元素加入并计算个数 if lt[nums[i]] ...原创 2022-03-17 22:57:51 · 378 阅读 · 0 评论 -
【LeetCode】160. 相交链表
解题思路:一)哈希首先明白这是两个链表相交,链表中每个数据都是有单独内存地址的,根据题意从相交位置开始到结束两个链表一直共用每个数据对应的地址。即前面不相交的部分元素都没有共同的地址,后面从相交位置开始就有共用地址了。题目要求返回的就是相交处的值,即第一次出现共用地址的地方,如何找到该值,哈希表摆摆手说还得靠我。先将链表A中元素逐个加入我们的哈希表中,里面每个元素的地址都是不一样的,在对B链表中元素进行遍历,若B中元素存在于哈希表中,说明这两个元素共用一个地址,...原创 2022-03-16 21:55:26 · 531 阅读 · 0 评论 -
【LeetCode】141. 环形链表
解题思路:一)判断链表中是否有环,若有环的话元素就不止遍历一次,因此可以用哈希表,元素出现第二次就有环 d = {} while head: d[head] = d.get(head,0)+1 #遍历,将元素就加入表中,并统计次数 if d[head] == 2: #出现2次说明重复,有环 return True ...原创 2022-02-27 22:57:26 · 225 阅读 · 0 评论 -
【LeetCode】121. 买卖股票的恰当时机
解题思路:相当于从给定天数中,选择两天,一天买入股票并且此时价格在卖出前最低,另一天卖出且此时价格为买入股票后的最高价假设A天买入,B天卖出,于是问题就分为求B前的最小值,A后的最大值可以从第一天开始遍历天数,在过程中保存更新最小值,最大值利润 low = float('inf') maxprofit = 0 for i in range(len(prices)): low = min(low,prices...原创 2022-02-24 23:17:02 · 85 阅读 · 0 评论 -
【LeetCode】112. 路径总和
解题思路:若存在一条路径上的和为目标值返回TRUE否则FALSE1)可以采用dfs进行递归,假设存在这样一条路径,目标值减去当前节点值后目标值就变为下面某条路径上的和了,当到达叶子节点时,目标值应该和叶子结点值相等,因此对左右子树进行递归,只要有就是TRUE if not root: #节点为空,false return False if not root.left and not root.right: ...原创 2022-02-21 23:49:28 · 87 阅读 · 0 评论 -
【LeetCode】111. 二叉树的最小深度
解题思路:一)找最小深度,可以分为比较左右子树的最小深度加一,不断递归,先遍历左子树,当遇到叶子结点时返回,记下深度,在遍历右子树,同样遇到叶子返回,然后比较左右深度大小,保存小的,最后加上根节点深度1 if not root :return 0 #如果节点为空反回0 if not root.left and not root.right: #叶子结点,开始计算 return 1 depth = 10**...原创 2022-02-20 22:57:05 · 248 阅读 · 0 评论 -
【LeetCode】110. 平衡二叉树
解题思路:要求每个节点的左右子树高度差不大于1由于每个节点高度由它的左右子树的高度决定,那么可利用递归先从最底层开始计算高度,若节点无子节点返回0,计算高度若有结点的左右子树高度差大于1,说明其不是平衡的,可返回-1代表不平衡,一旦出现了 -1就说明不平衡,那就从出现-1的地方到根节点 高度都为-1若左右子树高度差都小于等于1,那就取该节点正常高度,继续计算, def height(root): if not root:...原创 2022-02-19 22:14:46 · 220 阅读 · 0 评论 -
【LeetCode】102. 二叉树的层序遍历
解题思路:将二叉树每一层数据从做到右返回,每一层是一个整体,适合运用广度优先搜索,用队列来实现一层数据的添加,及这一层数据的下一层数据,下下层......实现:可以先把根节点入队,如果队列不为空,则把队列中每个元素依次出队,每出一个结点,把这个节点加入到一个列表中,再把该结点的左右孩子入队,没有跳过,最后当上一层最后一个元素出队完成后,把这个列表加入到一个大列表中,此时队列中就是下一层按顺序排列的结点,循环直到队列为空结束,不用队列函数 results = [] ...原创 2022-02-16 20:30:00 · 579 阅读 · 0 评论 -
【LeetCode】100. 相同的树
解题思路:树的结构和值都相同,才正确。1)根据二叉树有左部分和右部分,所以递归对左部分每个对应结点值比较,右部分每个对应节点值比较,都相等就正确 if not p and not q: #如果都为空,也一样 return True elif not p or not q: #如果一个为空FALSE return False elif p.val != q.va...原创 2022-02-15 21:30:14 · 344 阅读 · 0 评论 -
【LeetCode】94. 二叉树的中序遍历
解题思路:(一)二叉树的中序排列为 左根右,先遍历左半部分,然后根结点,再右半部分。对左半部分又可以按照初始状态进行划分,右半部分也是一样,可以使用递归先取根节点的左节点递归,如果左节点为空说明到最左边了,这时该节点为这层的根节点,由左根右顺序,把不用递归的根结点添加到栈中,在进行递归该根结点的右子节点,没有的话返回递归实现时,是函数自己调用自己,一层层的嵌套下去,操作系统/虚拟机自动帮我们用栈来保存了每个调用的函数递归是一个树结构,从字面可以其理解为重复“递推”和“...原创 2022-02-14 23:59:04 · 617 阅读 · 0 评论 -
【LeetCode】88. 合并两个有序数组
要求把2中元素加入到1中并且最后是有序的解题思路:一、直接把2中元素加入到1中元素后面在排序 nums1[m:]=nums2 #将1中元素后面的0替换为2中元素 nums1.sort() #对整体排序二、设置两个指针,在借助一个空列表,对1和2从第一个元素开始比较大小,把小的放进列表中,遍历完1,2数组后,将排好序的列表赋给1 ls = [] p1 ,p2 =0,0 while ...原创 2022-02-13 23:57:32 · 254 阅读 · 0 评论 -
【LeetCode】83. 删除排序链表中的重复元素
解题思路:因为数据有序,利用单链表从第一个开始遍历,设置一个节点遍历,如果当前节点值和下一个结点值相等,就把下一个结点删去,否则继续遍历。 if not head: return head p = head #设置遍历节点 while p.next: #当该节点还有下一个结点时,没有遍历完 if p.val==p.next.val: 两个节点值相等时,删去后面的结点 ...原创 2022-02-12 20:26:03 · 246 阅读 · 0 评论 -
【LeetCode】70. 爬楼梯
解题思路:一次爬两层或一层第0层和第1层只有一种方法,从第二层开始:第二层是第0层和第1层方法的和第三层是第1层和第2层方法的和第四层是第2层和第3层方法的和第五层是第3层和第4层方法的和第六层是第4层和第5层方法的和第七层是第5层和第6层方法的和由前面求出后面可利用动态规划所以第n层是第n-2层和第n-1层的和 a= b=1 #这里表示到0阶和1阶需要1方法 for i in range(2,n+1): #...原创 2022-02-11 20:30:10 · 169 阅读 · 0 评论 -
【LeetCode】69. x 的平方根
解题思路:对一个数开方后保留整数,那么这个整数平方肯定小于等于原来的数,根据该数的范围,0开方=0,1开方=1,这个整数在【0,x】之间,并且结果只有一个,可以用二分查找这个数, left,right,ans = 0,x,-1 #初始化 while left <= right: mid = (left+right)//2 if mid * mid <= x: #若m..原创 2022-02-10 23:26:03 · 295 阅读 · 0 评论 -
【LeetCode】67. 二进制求和
解题思路:1:将两个字符串从最后一位相加,逢二进一,每一个数字都加,不够的补0,记录每次加过的数连接一起,最后倒过来输出 result = "" carry = 0 #设置起始进位 p = len(a)-1 q = len(b)-1 while p>=0 or q>=0 or carry!=0: numA = int(a[p]) if p>=0 else 0 ..原创 2022-02-09 21:56:48 · 329 阅读 · 0 评论 -
【LeetCode】53. 最大子数组和
解题思路:求连续和最大,可以设置一个值 result 保存和的最大值。先将这个值 result 初始化最小值,每求一个和,与这个值比较,若和大,把和赋给这个值,若和不大于0,在后面重新求和,比较最大值保存最后返回这个值就是最大 result = -float('inf') #初始化最小值 count = 0 for i in range(len(nums)): count += nums[i] ...原创 2022-02-07 22:20:55 · 413 阅读 · 0 评论 -
【LeetCode】35. 搜索插入位置
解题思路: 所有的值按升序排列且唯一,可以用二分在一个闭区间内,若存在值相等于目标值,返回索引否则目标值在边界外 left , right = 0,len(nums)-1 #定义区间 while left<=right: #循环 mid = (left+right)//2 if nums[mid] < target: ...原创 2022-02-06 20:30:51 · 262 阅读 · 0 评论 -
【LeetCode】28. 实现 strStr()
解题思路: 根据要找的字符串长度,在另一个字符串中用这个长度遍历匹配,返回第一个值 if not needle:return 0 h = len(haystack) #求长度 n = len(needle) for i in range( h - n + 1): #最大遍历次数 if haystack[i:i + n] == needle: #根据长度匹配 ...原创 2022-02-05 21:15:17 · 268 阅读 · 0 评论 -
【LeetCode】27. 移除元素
解题思路: 用两个指针,对列表进行遍历,将不是val的移到前面,并保存长度,最后输出长度 a = 0 #设置两个指针,从头开始 b = 0 while a<len(nums): #对列表遍历 if nums[a] != val : #如果该值不等于val nums[b] = nums[a] #就赋值给b对应位置 ...原创 2022-02-04 19:07:45 · 384 阅读 · 0 评论 -
【LeetCode】21. 合并两个有序链表
解题思路: 可以用两个指针,一个指向创建的头结点不变,最后返回合并结果,另一个用来指向由小到大的数形成一条链表 p = ListNode() #创建头指针 temp = p # 保存头指针,移动的是p指针 while l1 and l2: #都不为空 if l1.val <= l2.val: p.next = l1 ...原创 2022-02-03 14:55:07 · 275 阅读 · 0 评论 -
【LeetCode】20. 有效的括号
解题思路: 由于括号只能是左边是左括号,且加右括号时,每加一个就在最右边减少一个左括号,这样才符合题意。那么可以用栈的特性来存储遍历字符串,如果是左括号就放到一个列表中,就是我们的栈,这样如果遍历到右括号,就说明左括号已经遍历完了,将新遍历的右括号与栈中最后一个元素对比(最里边的括号),判断是否相等(要转化一下),因为每个右括号对一个左括号,可以将右括号及对应的左括号存储在一个字典中,用右括号对应的左括号来比较。每配对一个,就把栈中最后一个配对的括号删去。如果还有其...原创 2022-02-01 23:39:38 · 496 阅读 · 0 评论 -
【LeetCode】14. 最长公共前缀
解题思路: 把这些字符先按字典顺序排序,第一个就是a开头的即使不是,其他的也是排在它后面的,比如:aaabc ,aaamn, aamna 三者排序为最小aaabc, 最大为 aamn可以看出公共前缀就在最小和最大字符里产生,为aa,可以多试试看是不是那么就可以取出最小字符,最大字符,最大公共前缀肯定长度不超过最小字符的长度,比较他俩字符并记下相等的长度就是可用max,min取值a = ['ab','abc','bcd','...原创 2022-01-31 22:49:33 · 440 阅读 · 0 评论 -
【LeetCode】13. 罗马数字转整数
解题思路:当一个数字是两个罗马数字的组合,说明左边的小于,又因为它们一一对应具体数字,可以用字典把7种罗马字符及6种组合字符装进去,然后再给出的字符中从左到右遍历,因为罗马字符有两种,所以分两种情况 第一种:先遍历出俩字符看看是否在字典中,在的话就取它的值,然后索引加2,继续循环加后面的数字 第二种:就是遍历出的俩字符不在字典中,说明左边字符大于等于右边字符,直接取第一个字符的值,然后索引加1,继续循环加后面的数字...原创 2022-01-30 23:30:59 · 877 阅读 · 0 评论 -
【LeetCode】9. 回文数
解题思路: 满足从右边读和从左边读是一样的,相当于是两个数相等, 把这个数翻过来就是从右边读的,然后比较这俩数是否相等class Solution: def isPalindrome(self, x: int) -> bool: a = str(x) if a[::-1]==a: return True else: return ...原创 2022-01-29 23:18:25 · 438 阅读 · 0 评论 -
【LeetCode】26. 删除有序数组中的重复项
解题思路: 要把不重复的元素个数返回,因为以按升序排列,那就用两个指针,一一比较,1、先判断nums是否有元素,没有就是长度为02、定义两个数 i = 0 , j = 1 ,如果 j <nums的长度,判断nums[ i ] 和 nums[ j ] 是否相等,若相等就 j ++,直到一个数不相等了,由于nums 是升序,所以直接把 i 后面的那个重复的数赋值为 j 所指的数,这样循环,i 及前面的数都是不同的,最后若 j >nums的长度了,说明nums中不同的...原创 2022-01-29 00:53:49 · 338 阅读 · 0 评论 -
【LeetCode】1. 两数之和
class Solution: def twoSum(self, nums: List[int], target: int) -> List[int]: cords={} for i,val in enumerate(nums): if target - val not in cords : cords[val] = i else: ret...原创 2022-01-27 23:50:04 · 551 阅读 · 0 评论