
leetcode
文章平均质量分 63
AI小笔记
人一能之,己百之;人十能之,己千之。
展开
-
剑指Offer 链表题目集合
采用双指针迭代,在遍历链表时,将当前节点的next 指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。我的第一想法是可以遍历链表,将每个节点的值存入数组中,然后将数组进行反转。空间复杂度:O(n)。额外使用一个数组存储链表中的每个节点。时间复杂度:O(n)。时间复杂度:O(n),正向遍历一遍链表。空间复杂度:O(1),常数空间复杂度。原创 2023-12-06 17:56:51 · 602 阅读 · 0 评论 -
python实现二叉树的创建
文章目录二叉树的基本概念二叉树的性质(特性)二叉树的节点表示以及二叉树的创建1.二叉树的节点表示2.二叉树的创建二叉树的基本概念二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)二叉树的性质(特性)性质1: 在二叉树的第i层上至多有2^(i-1)个结点(i>0)性质2: 深度为k的二叉树至多有2^k - 1个结点(k>0)性质3: 对于任意一棵二叉树,如果其叶结点数为N0,而度数为2的结点总数为N原创 2022-03-22 16:52:28 · 6078 阅读 · 2 评论 -
python实现队列
文章目录队列实现操作实现队列实现队列是一种先进先出的数据结构,本文用顺序表实现队列。操作Queue() 创建一个空的队列enqueue(item) 往队列中添加一个item元素dequeue() 从队列头部删除一个元素is_empty() 判断一个队列是否为空size() 返回队列的大小实现class Queue(object): """队列""" def __init__(self): self.items = [] def is_e原创 2022-03-16 10:29:33 · 2099 阅读 · 0 评论 -
python实现栈结构
文章目录栈结构实现栈的操作实现栈结构实现栈是一种先进后出的数据结构,本文用顺序表实现栈结构。栈的操作Stack() 创建一个新的空栈push(item) 添加一个新的元素item到栈顶pop() 弹出栈顶元素peek() 返回栈顶元素is_empty() 判断栈是否为空size() 返回栈的元素个数实现class Stack(object): """栈""" def __init__(self): self.items = [] de原创 2022-03-15 16:11:35 · 751 阅读 · 0 评论 -
python实现单向循环链表
文章目录单向循环链表操作实现单向循环链表单链表的一个变形是单向循环链表,链表中最后一个节点的next域不再为None,而是指向链表的头节点。操作is_empty() 判断链表是否为空length() 返回链表的长度travel() 遍历add(item) 在头部添加一个节点append(item) 在尾部添加一个节点insert(pos, item) 在指定位置pos添加节点remove(item) 删除一个节点search(item) 查找节点是否存在实现class N原创 2022-03-14 17:49:55 · 243 阅读 · 0 评论 -
python实现单向链表
文章目录单向链表节点实现单链表的操作单链表的实现测试代码总结单向链表单向链表也叫单链表,是链表中最简单的一种形式,它的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的链接域则指向一个空值。表元素域elem用来存放具体的数据。链接域next用来存放下一个节点的位置(python中的标识)变量p指向链表的头节点(首节点)的位置,从p出发能找到表中的任意节点。节点实现class SingleNode(object): """单链原创 2022-03-08 19:51:37 · 905 阅读 · 0 评论 -
454. 四数相加 II(Python)
给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。为了使问题简单化,所有的 A, B, C, D 具有相同的长度 N,且 0 ≤ N ≤ 500 。所有整数的范围在 -228 到 228 - 1 之间,最终结果不会超过 231 - 1 。例如:输入:A = [ 1, 2]B = [-2,-1]C = [-1, 2]D = [ 0, 2]输出:2解释:两个元组如下:原创 2020-11-27 09:31:03 · 242 阅读 · 0 评论 -
200. 岛屿数量(Python)
给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。示例 1:输入:grid = [[“1”,“1”,“1”,“1”,“0”],[“1”,“1”,“0”,“1”,“0”],[“1”,“1”,“0”,“0”,“0”],[“0”,“0”,“0”,“0”,“0”]]输出:1示例 2:输入:grid = [[“1”,“1”,“0”,“0原创 2020-11-02 09:45:26 · 2266 阅读 · 1 评论 -
二叉树的前序,中序,后序,层序遍历
题目说明这里是 4 道相关题目:144.二叉树的前序遍历94. 二叉树的中序遍历145. 二叉树的后序遍历102. 二叉树的层序遍历二叉树及遍历方式首先,二叉树是一种数据结构。简单来说,就是一个包含节点,以及它的左右孩子的一种数据结构。如果你按照 根节点 -> 左孩子 -> 右孩子 的方式遍历,即「先序遍历」,每次先遍历根节点,遍历结果为 1 2 4 5 3 6 7;同理,如果你按照 左孩子 -> 根节点 -> 右孩子 的方式遍历,即「中序序遍历」,遍历结果为 4原创 2020-10-27 09:07:20 · 530 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”最最最基础题,直接上代码:class Solution: def reverseLeftWords(sel原创 2020-10-24 11:56:33 · 166 阅读 · 0 评论 -
88. 合并两个有序数组(Python)
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出:[1,2,2,3,5,6]思路利用双指针,比较得到两个数组最原创 2020-10-24 11:42:49 · 365 阅读 · 0 评论 -
763. 划分字母区间(Python)
字符串 S 由小写字母组成。我们要把这个字符串划分为尽可能多的片段,同一个字母只会出现在其中的一个片段。返回一个表示每个字符串片段的长度的列表。示例 1:输入:S = “ababcbacadefegdehijhklij”输出:[9,7,8]解释:划分结果为 “ababcbaca”, “defegde”, “hijhklij”。每个字母最多出现在一个片段中。像 “ababcbacadefegde”, “hijhklij” 的划分是错误的,因为划分的片段数较少。思路: 对于这道题,一个关原创 2020-10-22 10:20:15 · 766 阅读 · 0 评论 -
925. 长按键入(Python)
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。示例 1:输入:name = “alex”, typed = “aaleex”输出:true解释:‘alex’ 中的 ‘a’ 和 ‘e’ 被长按。示例 2:输入:name = “saeed”, typed = “ssaaedd”输出:false解释:‘e原创 2020-10-21 20:07:52 · 581 阅读 · 0 评论 -
74. 搜索二维矩阵(Python)
编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值。该矩阵具有如下特性:每行中的整数从左到右按升序排列。每行的第一个整数大于前一行的最后一个整数。示例 1:输入:matrix = [[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]]target = 3输出: true示例 2:输入:matrix = [[1, 3, 5, 7],[10, 11, 16, 20],[23, 30, 34, 50]]t原创 2020-09-18 13:56:10 · 239 阅读 · 0 评论 -
39. 组合总和(Python)
给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例 2:输入:candidates = [2,3,5], target = 8,所求原创 2020-09-09 14:15:07 · 885 阅读 · 0 评论 -
77. 组合(Python)
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]题目就是要求我们从1到n找长度为k的组合数,所以回溯的终止条件就有了。class Solution: def combine(self, n: int, k: int) -> list: ans = list() def backtrack(t原创 2020-09-08 20:18:40 · 297 阅读 · 0 评论 -
297. 二叉树的序列化与反序列化(Python)
序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方式重构得到原数据。请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。示例:你可以将以下二叉树: 1 / \ 2 3 / \ 4 5序列化为 “[1,2,3,null,null原创 2020-06-16 23:49:55 · 363 阅读 · 1 评论 -
14. 最长公共前缀(Python)
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。示例 1:输入: [“flower”,“flow”,“flight”]输出: “fl”示例 2:输入: [“dog”,“racecar”,“car”]输出: “”解释: 输入不存在公共前缀。方法一:正常想法class Solution: def longestCommonPrefix(self, strs: 'List[str]') -> str: if strs==[]:原创 2020-06-16 00:20:50 · 403 阅读 · 1 评论 -
739. 每日温度(Python)
请根据每日 气温 列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用 0 来代替。例如,给定一个列表 temperatures = [73, 74, 75, 71, 69, 72, 76, 73],你的输出应该是 [1, 1, 4, 2, 1, 1, 0, 0]。提示:气温 列表长度的范围是 [1, 30000]。每个气温的值的均为华氏度,都是在 [30, 100] 范围内的整数。class Solution: def原创 2020-06-11 23:01:43 · 681 阅读 · 0 评论 -
35. 搜索插入位置(Python)
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5输出: 2示例 2:输入: [1,3,5,6], 2输出: 1示例 3:输入: [1,3,5,6], 7输出: 4示例 4:输入: [1,3,5,6], 0输出: 0方法:二分查找class Solution: def searchInsert(self, nums: List[in原创 2020-06-11 22:24:45 · 938 阅读 · 0 评论 -
面试题46. 把数字翻译成字符串(Python)
给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。请编程实现一个函数,用来计算一个数字有多少种不同的翻译方法。示例 1:输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”方法:动态规划class Solution: def translateNum(self, num: int原创 2020-06-09 23:17:51 · 351 阅读 · 0 评论 -
127. 单词接龙(Python)
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。示例 1:输入:beginWord = “hit”,endWord = “原创 2020-06-07 23:44:58 · 990 阅读 · 0 评论 -
面试题29. 顺时针打印矩阵(Python)
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]class Solution: def spiralOrder(self, matrix: List[List[int]]) ->原创 2020-06-05 23:46:56 · 244 阅读 · 1 评论 -
101. 对称二叉树(Python)
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的:方法一:左子树前序遍历,右子树后续遍历,若相反则是对称class Solution: def isSymmetric(self, root: TreeNode) -> bool: bli = [] # 用来存左子树的前序遍历 fli = [] # 用来存右子树的后原创 2020-05-31 22:14:21 · 588 阅读 · 0 评论 -
394. 字符串解码(Python)
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。示例:s = “3[a]2[bc]”, 返回 “aaabcbc”.s = “3[a2[c]]”, 返原创 2020-05-29 00:19:38 · 724 阅读 · 0 评论 -
974. 和可被 K 整除的子数组(Python)
给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。示例:输入:A = [4,5,0,-2,-3,1], K = 5输出:7解释:有 7 个子数组满足其元素之和可被 K = 5 整除:[4, 5, 0, -2, -3, 1], [5], [5, 0], [5, 0, -2, -3], [0], [0, -2, -3], [-2, -3]方法一:class Solution: def subarraysDivByK(self, A: List[int],原创 2020-05-27 21:13:04 · 343 阅读 · 1 评论 -
287. 寻找重复数(Python)
给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。示例 1:输入: [1,3,4,2,2]输出: 2示例 2:输入: [3,1,3,4,2]输出: 3方法一:常规想法把元素装入一个temp数组,若temp已存在该元素,则返回该元素。class Solution: def findDuplicate(self, nums: List[int]) -> int:原创 2020-05-26 21:13:58 · 1349 阅读 · 0 评论 -
4. 寻找两个正序数组的中位数(Python)
给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5方法一:内置函数nums = nums1 + nums2 num原创 2020-05-24 23:54:34 · 904 阅读 · 0 评论 -
5. 最长回文子串(Python)
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: “babad”输出: “bab”注意: “aba” 也是一个有效答案。示例 2:输入: “cbbd”输出: “bb”方法一:暴力法class Solution: # 暴力匹配(超时) def longestPalindrome(self, s: str) -> str: # 特判 size = len(s) if s原创 2020-05-22 00:19:29 · 967 阅读 · 0 评论 -
2. 两数相加(Python)
给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807方法一:暴力法全部换成数字做加法,再换换回去。class Solu原创 2020-05-19 23:35:57 · 1092 阅读 · 0 评论 -
680. 验证回文字符串 Ⅱ(Python)
给定一个非空字符串 s,最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: “aba”输出: True示例 2:输入: “abca”输出: True解释: 你可以删除c字符。思路:首先两个指针,l,r分别是从前开始和从后开始。如果s[l] != s[r]的时候,我们需要删除掉一个字符,就有两种情况。一种是删除左边的,一种是删除右边的。class Solution: def validPalindrome(self, s: str) -> bool:原创 2020-05-19 01:12:14 · 356 阅读 · 0 评论 -
25. K 个一组翻转链表(Python)
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5class Solution: def reverseKGroup(self,原创 2020-05-17 01:30:35 · 299 阅读 · 0 评论 -
560. 和为K的子数组(Python)
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :输入:nums = [1,1,1], k = 2输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。方法一:暴力法,会超时。class Solution: def subarraySum(self, nums: List[int], k: int) -> int: cnt, n = 0, len(nums) for i in range(n):原创 2020-05-15 23:55:51 · 1706 阅读 · 0 评论 -
102. 二叉树的层序遍历(Python)
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。示例:二叉树:[3,9,20,null,null,15,7],返回其层次遍历结果:[[3],[9,20],[15,7]]方法:BSFclass Solution: def levelOrder(self, root: TreeNode) -> List[List[int]]: if not root: return [] # 特殊情况,root为空直接返回原创 2020-05-13 21:29:08 · 386 阅读 · 0 评论 -
19. 删除链表的倒数第N个节点——Python版
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。示例:给定一个链表: 1->2->3->4->5, 和 n = 2.当删除了倒数第二个节点后,链表变为 1->2->3->5.思路:可以设想假设设定了双指针 p 和 q 的话,当 q 指向末尾的 NULL,p 与 q 之间相隔的元素个数为 n 时,那么删除掉 p 的下一个指针就完成了要求。设置虚拟节点 dummyHead 指向 head设定双指针 p 和 q,初始都指向虚拟节点 dumm原创 2020-05-12 22:42:05 · 298 阅读 · 0 评论 -
155. 最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。示例:输入:[“MinStack”,“push”,“push”,“push”,“getMin”,“pop”,“top”,“getMin”][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null,-3,原创 2020-05-12 19:17:59 · 145 阅读 · 0 评论 -
46. 全排列
给定一个 没有重复 数字的序列,返回其所有可能的全排列。示例:输入: [1,2,3]输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]回溯法class Solution(object): def permute(self, nums): """ :type nums: List[int] :rtype: List[List[int]] """原创 2020-05-11 22:39:29 · 148 阅读 · 0 评论 -
50. Pow(x, n)
实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25分治思想class Solution: def myPow(self, x: float, n: int) -> float: if not n:原创 2020-05-11 20:15:59 · 178 阅读 · 0 评论 -
236. 二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1原创 2020-05-10 19:37:16 · 120 阅读 · 0 评论 -
69. x 的平方根
实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842…,由于返回类型是整数,小数部分将被舍去。暴力法:class Solution: def mySqrt(self, x: int) -> int: if x==0 or x==1: r原创 2020-05-09 23:36:38 · 160 阅读 · 0 评论