
LeetCode算法
文章平均质量分 73
呆小呆_
这个作者很懒,什么都没留下…
展开
-
leetcode算法学习(23)——最长有效括号
最长有效括号题目描述方法一:栈思路代码复杂度分析方法二:动态规划思路代码复杂度分析方法三:无需额外空间思路代码复杂度分析题目描述给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例 1:输入: “(()”输出: 2解释: 最长有效括号子串为 “()”示例 2:输入: “)()())”输出: 4解释: 最长有效括号子串为 “()()”示例 3:输入: “())((())”输出: 4解释: 最长有效括号子串为 “(())”方法一:栈思路始终保持原创 2020-07-04 11:45:07 · 3337 阅读 · 0 评论 -
leetcode算法学习(22)——有效的字母异位词
有效的字母异位词题目描述方法一:count()遍历中直接比较字符个数思路代码方法二:哈希表--记录每个字符的数量思路代码题目描述给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。示例 1:输入: s = “anagram”,t = “nagaram”输出: true示例 2:输入: s = “rat”,t = “car”输出: false方法一:count()遍历中直接比较字符个数思路有效的字母异位词,两个字符串中的元素肯定是一致的首先判断原创 2020-07-02 20:56:32 · 134 阅读 · 0 评论 -
leetcode算法学习(21)——礼物的最大价值(动态规划)
礼物的最大价值题目描述思路空间复杂度优化:代码复杂度分析:题目描述在一个 m*n 的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于 0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向右或者向下移动一格、直到到达棋盘的右下角。给定一个棋盘及其上面的礼物的价值,请计算你最多能拿到多少价值的礼物?示例 1:输入: [[1,3,1],[1,5,1],[4,2,1]]输出: 12解释: 路径 1→3→5→2→1可以拿到最多价值的礼物思路设 f(i, j)为从棋盘左上角走原创 2020-06-29 16:27:47 · 3762 阅读 · 0 评论 -
leetcode算法学习(20)——表示数值的字符串
表示数值的字符串题目描述方法一:正则表达式思路代码方法二:条件判断思路代码题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123”、".1"即"0.1"、“1.“即"1.0"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、”-1E-16"及"12e+5.4"都不是。方法一:正则表达式思路符号"+" 或 " -“必须出现在首位或"e” 或 "E"的后面小数点"."前后可以无数字“原创 2020-06-29 13:17:33 · 4060 阅读 · 0 评论 -
leetcode算法学习(19)——股票的最大利润(动态规划)
股票的最大利润题目描述动态规划思路代码题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 =6)的时候卖出,最大利润 = 6-1 = 5 。注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格。示例 2:输入: [7,6,4,3,1]输出: 0解释: 在这种情况下, 没有交易完成, 所以最大利润为 0原创 2020-06-27 17:30:50 · 661 阅读 · 0 评论 -
leetcode算法学习(18)——重建二叉树
重建二叉树举例题目描述方法一:递归--复制列表的形式思路代码方法二:递归--哈希表思路代码举例例如要重建的是如下二叉树。其前序遍历和中序遍历如下。preorder = [3,9,8,5,4,10,20,15,7]inorder = [4,5,8,10,9,3,15,20,7]前序遍历的第一个元素 3 是根节点,第二个元素 9 可能位于左子树或者右子树,需要通过中序遍历判断。中序遍历的第一个元素是 4 ,不是根节点 3,说明 9 位于左子树,因为根节点不是中序遍历中的第一个节点。同理,前序原创 2020-06-27 16:11:39 · 301 阅读 · 0 评论 -
leetcode算法学习(17)—— 将整数按权重排序
将整数按权重排序题目描述方法一:递归思路代码方法二:字典思路代码方法三:记忆化(字典+递归)思路代码题目描述我们将整数 x 的 权重 定义为按照下述规则将 x 变成 1 所需要的步数:如果 x 是偶数,那么 x = x / 2如果 x 是奇数,那么 x = 3 * x + 1比方说,x=3 的权重为 7 。因为 3 需要 7 步变成 1 (3 --> 10 --> 5 --> 16 --> 8 --> 4 --> 2 --> 1)。给你三个整数 lo,原创 2020-06-25 15:28:28 · 1065 阅读 · 0 评论 -
leetcode算法学习(16)—— 链表中倒数第k个节点
链表中倒数第k个节点题目描述方法一:计算链表长度思路代码方法二:双指针思路代码题目描述输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.方法一:计算链表长度思路最直接的想法:遍历统计链原创 2020-06-23 19:36:46 · 175 阅读 · 0 评论 -
leetcode算法学习(15)—— 队列的最大值
队列的最大值题目描述方法一:暴力解决(时间复杂度不符合)思路代码方法二:添加辅助队列思路代码题目描述请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入:[“MaxQueue”,“push_back”,“push_back”,“max_value”,“pop_front”,“max_value”][原创 2020-06-23 18:17:39 · 295 阅读 · 0 评论 -
leetcode算法学习(1)——计数质数:统计所有小于非负整数 n 的质数的数量
计数质数示例思路一:暴力法(超时)思路二:优化暴力(超时)思路三:厄拉多塞筛法思路四:综上一起优化示例输入: 10输出: 4解释: 小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。思路:质数就是除了 1 和本身找不到其他能除尽的数,思路请看题目的提示!思路一:暴力法(超时)for … else 的用法, 一般配合 break 使用class Solution: def countPrimes(self, n: int) -> int:原创 2020-06-15 11:40:29 · 696 阅读 · 0 评论 -
leetcode算法学习(2)——同构字符串:给定两个字符串 s 和 t,判断它们是否是同构的
字典的方法1.如果s[i]不在字典的key中,需要考虑两种情况,若t[i]在字典的value中,返回False,否则dic[s[i]] = t[i]2.如果s[i]在字典的key中,若dic[s[i]] != t[i]即判断s中的字符的value是否和当前t的字符一致,返回Falseclass Solution: def isIsomorphic(self, s: str, t: str) -> bool: dic = {} for i in range(原创 2020-06-15 15:58:59 · 1279 阅读 · 0 评论 -
leetcode算法学习(3)——反转链表:反转一个单链表
反转链表迭代思路代码递归思路代码迭代思路输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL中间变量temp存放原链表的next地址(1)、old_head:1->2->3->4->5->NULLnew_head:1->None(2)、old_head:2->3->4->5->NULLnew_head:2->1->Non原创 2020-06-15 20:10:29 · 279 阅读 · 0 评论 -
leetcode算法学习(4)——存在重复元素:给定一个整数数组,判断是否存在重复元素
存在重复元素思路代码如果任意一值在数组中出现至少两次,函数返回 true 。如果数组中每个元素都不相同,则返回 false 。示例 1: 输入: [1,2,3,1] 输出: true示例 2: 输入: [1,2,3,4] 输出: false示例 3: 输入: [1,1,1,3,3,4,3,2,4,2] 输出: true思路将数组转换为集合,判断长度是否一致代码class Solution: def containsDuplicate(self, nums: List[int])原创 2020-06-15 20:37:50 · 432 阅读 · 0 评论 -
leetcode算法学习(5)——存在重复元素II:判断重复元素的索引差绝对值是否至多为k
存在重复元素II思路代码给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的 绝对值 至多为 k。示例 1: 输入: nums = [1,2,3,1], k = 3 输出: true示例 2: 输入: nums = [1,0,1,1], k = 1 输出: true示例 3: 输入: nums = [1,2,3,1,2,3], k = 2 输出: false思路首先判断是否存在重复元素,不存在返原创 2020-06-15 21:03:30 · 364 阅读 · 0 评论 -
leetcode算法学习(6)——最佳观光组合
最佳观光组合题目描述简单粗暴的解法(超出时间限制)改进思路代码进一步优化时间题目描述给定正整数数组 A,A[i] 表示第 i 个观光景点的评分,并且两个景点 i 和 j 之间的距离为 j - i。一对景点(i < j)组成的观光组合的得分为(A[i] + A[j] + i - j):景点的评分之和减去它们两者之间的距离。返回一对观光景点能取得的最高分。示例:输入:[8,1,5,2,6]输出:11解释:i = 0, j = 2, A[i] + A[j] + i - j = 8 + 5原创 2020-06-17 10:48:42 · 301 阅读 · 0 评论 -
leetcode算法学习(7)——x的平方根:实现 int sqrt(int x) 函数
x的平方根题目描述方法一:二分查找思路代码方法二:牛顿迭代思路方法三:袖珍计算器题目描述实现 int sqrt(int x) 函数。计算并返回 x 的平方根,其中 x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。示例 1: 输入: 4 输出: 2示例 2: 输入: 8 输出: 2 说明: 8 的平方根是 2.82842…袖珍计算器:通过其它的数学函数代替平方根函数得到精确结果,取整数部分作为答案;二分查找,牛顿迭代:通过数学方法得到近似结果,直接作为答案原创 2020-06-17 19:54:16 · 1097 阅读 · 0 评论 -
leetcode算法学习(8)——分割平衡字符串
分割平衡字符串题目描述方法一:字典思路代码方法二:标志位思路代码题目描述在一个「平衡字符串」中,‘L’ 和 ‘R’ 字符的数量是相同的。给出一个平衡字符串 s,请你将它分割成尽可能多的平衡字符串。返回可以通过分割得到的平衡字符串的最大数量。示例 1: 输入:s = “RLRRLLRLRL” 输出:4 解释:s 可以分割为 “RL”, “RRLL”, “RL”, “RL”,示例 2: 输入:s = “RLLLLRRRLR” 输出:3 解释:s 可以分割为 “RL”, “LLLRRR”, “LR”原创 2020-06-20 15:54:26 · 290 阅读 · 0 评论 -
leetcode算法学习(9)——按奇偶排序数组 II
按奇偶排序数组题目描述方法一:全部遍历,整体赋值思路代码方法二:遍历奇数索引位思路代码题目描述给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。示例: 输入:[4,2,5,7] 输出:[4,5,2,7] 解释:[4,7,2,5],[2,5,4,7],[2,7,4,5] 也会被接受。方法一:全部遍历,整体赋值思路遍历数组,查找所有的奇数原创 2020-06-20 16:29:39 · 142 阅读 · 0 评论 -
leetcode算法学习(10)——按奇偶排序数组
按奇偶排序数组题目描述方法一:整体赋值思路代码方法二:新数组赋值思路代码题目描述给定一个非负整数数组 A,返回一个数组,在该数组中, A 的所有偶数元素之后跟着所有奇数元素。你可以返回满足此条件的任何数组作为答案。示例: 输入:[3,1,2,4] 输出:[2,4,3,1] 输出 [4,2,3,1],[2,4,1,3] 和 [4,2,1,3]也会被接受。方法一:整体赋值思路变脸数组,找出所有的奇数和偶数,分别存放至odd和even数组先放偶数,在偶数后面放奇数代码class So原创 2020-06-20 16:49:03 · 175 阅读 · 0 评论 -
leetcode算法学习(11)——查找常用字符
查找常用字符题目描述方法一:count函数(时间快)思路代码方法二:Counter函数思路代码题目描述给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。示例 1: 输入:[“bella”,“label”,“roller”] 输出:[“e”,“l”,“l”]示例 2: 输入:[“cool”,“lock”,“cook”]原创 2020-06-22 11:25:54 · 129 阅读 · 0 评论 -
leetcode算法学习(12)——移除链表元素
移除链表元素Python 直接赋值、浅拷贝和深度拷贝解析字典浅拷贝实例深度拷贝需要引入 copy 模块解析更多实例题目描述思路代码Python 直接赋值、浅拷贝和深度拷贝解析直接赋值:其实就是对象的引用(别名)。浅拷贝(copy):拷贝父对象,不会拷贝对象的内部的子对象。深拷贝(deepcopy): copy 模块的 deepcopy 方法,完全拷贝了父对象及其子对象。字典浅拷贝实例>>>a = {1: [1,2,3]}>>> b = a.copy()原创 2020-06-22 14:32:35 · 373 阅读 · 0 评论 -
leetcode算法学习(13)——不用加减乘除做加法
不用加减乘除做加法位运算(&、|、^、~、>>、<<)1.位运算概述2.位运算概览3.按位与运算符(&)#4.按位或运算符(|)5.异或运算符(^)6.取反运算符 (~)7.左移运算符(<<)8.右移运算符(>>)10.复合赋值运算符不用加减乘除做加法题目描述思路代码位运算(&、|、^、~、>>、<<)1.位运算概述从现代计算机中所有的数据二进制的形式存储在设备中。即0、1两种状态,计算机对二进制数据进行的原创 2020-06-22 21:01:21 · 758 阅读 · 0 评论 -
leetcode算法学习(14)—— 顺时针打印矩阵
顺时针打印矩阵题目描述思路代码复杂度分析题目描述输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 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]限制: 0 <= matrix.length <= 100 0 <= m原创 2020-06-23 16:11:37 · 247 阅读 · 0 评论