leetcode刷题之旅
foolS22
这个作者很懒,什么都没留下…
展开
-
leetcode算法题第77题:组合
给定两个整数 和 ,返回范围 中所有可能的 个数的组合。你可以按 任何顺序 返回答案。回溯三部曲 :回溯法的书写模板:原创 2022-07-06 18:22:12 · 1615 阅读 · 1 评论 -
leetcode算法题第36题:有效的数独
请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 1.数字 1-9 在每一行只能出现一次。 2.数字 1-9 在每一列只能出现一次。 3.数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图)注意: 有效的数独满足以下三个条件: 1.同一个数字在每一行只能出现一次; 2.同一个数字在每一列只能出现一次; 3.同一个数字在每一个小九宫格只能出现一原创 2022-07-04 23:01:08 · 331 阅读 · 0 评论 -
leetcode算法题第34题:在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。如果数组中不存在目标值 target,返回 [-1, -1]。你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。1.初始化: 左边界 i = 0,右边界 j = len(nums) - 1。2.循环二分: 当闭区间 [i, j]无元素时跳出; 1.计算中点 m = (i + j) / 2 (向下取整); 2.若 nums[m] < ta原创 2022-07-02 11:36:02 · 502 阅读 · 0 评论 -
leetcode算法题第32题:最长有效括号
给你一个只包含 和 的字符串,找出最长有效(格式正确且连续)括号子串的长度。 具体做法是我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」,这样的做法主要是考虑了边界条件的处理,栈里其他元素维护左括号的下标:1.对于遇到的每个‘(’ ,我们将它的下标放入栈中2.对于遇到的每个‘)’ ,我们先弹出栈顶元素表示匹配了当前右括号: 如果栈为空,说明当前的右括号为没有被匹配的右括号,我们将其下标放入栈中来更新我们之前提到的「最后一个没有被匹配的右括号的下标」原创 2022-06-29 21:40:21 · 2042 阅读 · 0 评论 -
leetcode算法题第31题:下一个排列
整数数组的一个 排列 就是将其所有成员以序列或线性顺序排列。例如,arr = [1,2,3] ,以下这些都可以视作 arr 的排列:[1,2,3]、[1,3,2]、[3,1,2]、[2,3,1] 。整数数组的 下一个排列 是指其整数的下一个字典序更大的排列。更正式地,如果数组的所有排列根据其字典顺序从小到大排列在一个容器中,那么数组的 下一个排列 就是在这个有序容器中排在它后面的那个排列。如果不存在下一个更大的排列,那么这个数组必须重排为字典序最小的排列(即,其元素按升序排列)。例如,arr = [1,原创 2022-06-28 14:34:30 · 207 阅读 · 0 评论 -
leetcode算法题第50题:Pow(x, n)
实现 pow(x, n) ,即计算 的整数 次幂函数(即, )。 1.快速幂+递归 2.快速幂+迭代把n转换成二进制的数,从左往右,每一位对应上一位的平方,初始值为x,当这一位为1时,初始值ans*该位对应的x值...原创 2022-06-24 22:05:28 · 2223 阅读 · 0 评论 -
leetcode算法题第26题:删除有序数组中的重复项
给你一个 升序排列 的数组 ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 将最终结果插入 的前 个位置后返回 。不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。定义两个指针 fast 和 slow 分别为快指针和慢指针,快指针表示遍历数组到达的下标位置,慢指针表示下一个不同元素要填入的下标位置,初始时两个指针都指向下标 1。假设数组nums 的长度为 n。将快指针 fast 依次遍原创 2022-06-21 10:53:56 · 366 阅读 · 0 评论 -
leetcode算法题第25题:K 个一组翻转链表
给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 1.先写出翻转整个链表的函数,返回反转后的head和tail2.递归法,不断比较链表的个数是否大于k,如果大于k则调用翻转链表函数,重新建立连接,否则直接返回翻转前的链表...原创 2022-06-20 21:53:21 · 538 阅读 · 0 评论 -
leetcode算法题第24题:两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 一、应用辅助栈帮忙我们利用一个 stack,然后不断迭代链表,每次取出两个节点放入 stack 中,再从 stack 中拿出两个节点。借助 stack 后进先出的特点,放进去的时候是 1,2 。拿出来的时候就是 2,1 两个节点了。再把这两个节点串联起来,重复这个逻辑遍历完整个链表,就可以做到两两反转的效果了。虽然用到了 stack,但因为只存了两个元素,所以空间复杂度原创 2022-06-18 10:47:23 · 264 阅读 · 0 评论 -
leetcode算法题第23题:合并K个升序链表
给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表.1.先找出合并两个升序链表2.用二分法同时对多个链表进行合并 3.最终合并到最后一个大链表...原创 2022-06-17 10:56:45 · 121 阅读 · 0 评论 -
leetcode算法题第22题:括号生成
数字 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 首先,面向小白:什么是动态规划?在此题中,动态规划的思想类似于数学归纳法,当知道所有i...原创 2022-06-17 10:00:10 · 313 阅读 · 0 评论 -
leetcode算法题第21题:合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 什么是递归呢?函数在运行时调用自己,这个函数就叫递归函数,调用的过程叫做递归。比如定义函数 f(x)=x+f(x−1):思路:我们可以如下递归地定义两个链表里的 merge 操作(忽略边界情况,比如空链表等):我们直接将以上递归过程建模,同时需要考虑边界情况。如果 l1或者l2一开始就是空链表 ,那么没有任何操作需要合并,所以我们只需要返回非空链表。否则,我们要判断 l1 和 l2 哪一个链表的头节点的原创 2022-06-15 11:11:24 · 136 阅读 · 0 评论 -
leetcode算法题第20题:有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:1.左括号必须用相同类型的右括号闭合。2.左括号必须以正确的顺序闭合。本题可以使用栈这一数据结构来解答,栈的特点是先进后出,可以适用此题的匹配。我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我们可以取出原创 2022-06-14 10:42:45 · 447 阅读 · 0 评论 -
leetcode算法题第19题:删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 个结点,并且返回链表的头结点。 1.我们可以使用两个指针 first 和 second 同时对链表进行遍历,并且first 比 second 超前 n 个节点。当 first 遍历到链表的末尾时,second 就恰好处于倒数第 n 个节点。2.具体地,初始时 first 和 second 均指向头节点。我们首先使用 first 对链表进行遍历,遍历的次数为 n。此时,first 和 second 之间间隔了n−1个节点,即 first 比second 超前了 n 个节点原创 2022-06-13 18:46:10 · 114 阅读 · 0 评论 -
leetcode算法题第18题:四数之和
给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):1. 0 ...原创 2022-06-12 22:09:56 · 357 阅读 · 0 评论 -
leetcode算法题第17题:电话号码的字母组合
给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。1. 首先使用哈希表存储每个数字对应的所有可能的字母,然后进行回溯操作。2.回溯过程中维护一个字符串,表示已有的字母排列(如果未遍历完电话号码的所有数字,则已有的字母排列是不完整的)。该字符串初始为空。每次取电话号码的一位数字,从哈希表中获得该数字对应的所有可能的字母,并将其中的一个字母插入到已有的字母排列后面,然后继续处理电话号码的后一位数字,直到原创 2022-06-08 23:22:45 · 147 阅读 · 0 评论 -
leetcode算法题第16题:最接近的三数之和
给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数,使它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在恰好一个解。本题与 15. 三数之和 非常类似,可以使用「双指针」的方法来解决。 1.先把数组从小到大排序2.先确定第一个指针a,a从左往右依次遍历。3.随后确定第二指针b,第三指针c,b从a右边第一个数组往右遍历,c则从整个数组的末尾向前遍历。4.每当三个元素的和大于taget时,c向左移动一位,否则b向右移动一位。每一次移动,都原创 2022-06-07 15:50:08 · 742 阅读 · 0 评论 -
leetcode算法题第15题:三数之和
给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c =0 ?请你找出所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。题目要求不重复:则需要使用到排序算法。这里的双指针是伪双指针(实际应该是三指针 )第一个指针p1(第一个数)从头到尾开始遍历,第二个指针p2则表示第二个数,因为是不重复的三元组,所以第二个指针p2要从第一个指针p1的右 边一个元素开始遍历,第三个指针p3(第三个元素)从末尾开始遍历,当三个元素的值大于0原创 2022-06-06 22:50:35 · 170 阅读 · 0 评论 -
leetcode算法题第14题:最长公共前缀
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 。纵向扫描时,从前往后遍历所有字符串的每一列,比较相同列上的字符是否相同,如果相同则继续对下一列进行比较,如果不相同则当前列不再属于公共前缀,当前列之前的部分为最长公共前缀。...原创 2022-06-05 20:59:41 · 129 阅读 · 0 评论 -
leetcode算法题第13题:罗马数字转整数
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000给你给定一个罗马数字,你要转换成相应的整数。通常情况下,罗马数字中小的数字在大的数字的右边。若输入的字符串满足该情况,那么可以将每个字符视作一个单独的值,累加每个字符对应的数值即可。例如 XXVII 可视作 X原创 2022-06-04 10:16:56 · 128 阅读 · 0 评论 -
leetcode算法题第12题:整数转罗马数字
根据罗马数字的唯一表示法,为了表示一个给定的整数 num,我们寻找不超过num 的最大符号值,将 num 减去该符号值,然后继续寻找不超过 num 的最大符号值,将该符号拼接在上一个找到的符号之后,循环直至num 为 0。最后得到的字符串即为num 的罗马数字表示。编程时,可以建立一个数值-符号对的列表 valueSymbols,按数值从大到小排列。遍历 valueSymbols 中的每个数值-符号对,若当前数值value 不超过num,则从 num 中不断减去value,直至num 小于 value,然后原创 2022-06-03 10:16:28 · 105 阅读 · 0 评论 -
leetcode算法题第11题:盛最多水的容器
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。说明:你不能倾斜容器 本题使用双指针思路简单明了 ,左指针指向数组开头,右指针指向数组末尾,每次移动左右指针小的一方(左指针向右移动,右指针向左移动),每移动一次之后计算此时容器的容量,而容器容量的公式为:两个指针指向的数字中较小值∗指针之间的距离所以,如果我们移动数字较大的原创 2022-06-02 14:32:24 · 267 阅读 · 0 评论 -
leetcode算法题第10题:正则表达式匹配
给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 '.' 和 '*' 的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖 整个 字符串 s的,而不是部分字符串。 我们用 f[i][j] 表示 s 的前 i 个字符与 p 中的前 j个字符是否能够匹配。在进行状态转移时,我们考虑 p 的第 j 个字符的匹配情况:1.当第j个字符不是'*'时,则要匹配s[i]和p[j]的情况,如果不相等,则s和p一定不匹配。如果s[i]==p[j],则要转移到对前i-原创 2022-06-02 00:21:39 · 263 阅读 · 0 评论 -
leetcode算法题第9题:回文数
leetcode算法题第9题:回文数题目:给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。解题思路:方法1:将整数转换成字符串,然后反转,比较是否相等方法2:每次将整数的最后一位放到新数的最后一位代码:...原创 2022-05-31 16:32:34 · 66 阅读 · 0 评论 -
leetcode算法题第8题:字符串转换整数
leetcode算法题第8题:字符串转换整数 (atoi)题目:请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。函数myAtoi(string s) 的算法如下:1.读入字符串并丢弃无用的前导空格。2.检查下一个字符(假设还未到字符末尾)为正还是负号,读取该字符(如果有)。 确定最终结 果 是负数还是正数。 如果两者都不存在,则假定结果为正。3.读入下一个字符,直到到达下一...原创 2022-05-31 13:09:01 · 126 阅读 · 0 评论 -
leetcode算法题第7题:整数反转
leetcode算法题第7题:整数反转题目:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围[,] ,就返回 0。解题思路:设反转后的数为rex,则不断的把x的末尾数推出,推入rex的尾端,直到x为0为止,但题目有限制条件,rex的范围再[,],所以则再倒数第二位时就需要判断rex和//10和()//10的大小,又因为如果rex和x的位数如果相同的话,则x的值也是小于[,]的,所以x的首位就是rex的末...原创 2022-05-29 22:51:31 · 150 阅读 · 0 评论 -
leetcode算法题第6题:Z 字形变换
leetcode算法题第6题:Z 字形变换题目:将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行Z 字形排列。比如输入字符串为 "PAYPALISHIRING"行数为 3 时,排列如下:P A H NA P L S I I GY I R之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"解题思路:遍历字符串s和对应的行数num,把字符依次填入相应的行,当i==num或i=...原创 2022-05-28 10:27:44 · 99 阅读 · 0 评论 -
leetcode算法第5题:最长回文子串
leetcode算法题第5题:最长回文子串题目:给你一个字符串s,找到s中最长的回文子串。解题思路:中心扩展算法 遍历字符串s,从每一个字符或者两个字符开始遍历,往两边扩散,当left[i]==right[j],且i>=0,j<len(s)时,则left和right的下坐标往外扩一位,在判断是否符合规则,如果符合则再继续往外扩,直到不满足条件,每遍历一个字符则判断长度是否比上次的字符串长,如果是则返回最新长度,不是则保留上一个长度。代码:...原创 2022-05-27 23:13:07 · 98 阅读 · 0 评论 -
leetcode算法第四题:寻找两个正序数组的中位数
leetcode算法题第四题:寻找两个正序数组的中位数题目:给定两个大小分别为 m 和 n 的正序(从小到大)数组nums1 和nums2。请你找出并返回这两个正序数组的中位数 。算法的时间复杂度应该为 O(log (m+n))解题思路:二分查找法如何把时间复杂度降低到 O(log(m+n)) 呢?如果对时间复杂度的要求有log,通常都需要用到二分查找,这道题也可以通过二分查找实现。根据中位数的定义,当 m+n 是奇数时,中位数是两个有序数组中的第 (m+n)/2 个元素,当 ...原创 2022-05-26 17:47:12 · 91 阅读 · 0 评论 -
leetcode算法题第三题:无重复字符的最长子串
给定一个字符串 ,请你找出其中不含有重复字符的 最长子串 的长度。解题:滑动窗口法我们不妨以示例一中的字符串 abcabcbb 为例,找出从每一个字符开始的,不包含重复字符的最长子串,那么其中最长的那个字符串即为答案。对于示例一中的字符串,我们列举出这些结果,其中括号中表示选中的字符以及最长的字符串:(a)bcabcbb 开始的最长字符串为(abc)abcbb;a(b)cabcbb 开始的最长字符串为 a(bca)bcbb;ab(c)abcbb 开始的最长字符串为ab(cab)cbb;abc(a)b原创 2022-05-25 12:14:59 · 171 阅读 · 0 评论 -
leetcode算法第二题:两数相加
给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。请你将两个数相加,并以相同形式返回一个表示和的链表。你可以假设除了数字 0 之外,这两个数都不会以 0 开头。...原创 2022-05-24 20:56:10 · 118 阅读 · 0 评论 -
leetcode算法第一题:两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。使用哈希表,可以将寻找 target - x 的时间复杂度降低到从 O(N)O(N) 降低到 O(1)O(1)。这样我们创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target - x,然后将 x 插入到哈希表中,即可保证不会原创 2022-05-23 20:42:41 · 142 阅读 · 1 评论