LeetCode
用于记录自己刷力扣的经历, 代码可能很糟糕. 远远比不上网络上各种大神的编程思路, 勿喷
Jiang锋时刻
这个作者很懒,什么都没留下…
展开
-
LeetCode分类整合[持续更新ing]
1. 单调栈LeetCode0496. 下一个更大元素 ILeetCode0739. 每日温度LeetCode1475. 商品折扣后的最终价格原创 2020-08-05 14:06:49 · 65 阅读 · 0 评论 -
LeetCode 迷宫系列(0490, 0499, 0505)
1. 迷宫1: 判断是否能走出迷宫题目//由空地和墙组成的迷宫中有一个球。球可以向上下左右四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。 //// 给定球的起始位置,目的地和迷宫,判断球能否在目的地停下。 //// 迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。 //// //// 示例 1: //// 输入 1: 迷宫由以下二维数组表示////0 0 1 0 0原创 2021-01-30 11:30:56 · 2382 阅读 · 0 评论 -
LeetCode0050. Pow(x, n)
一. 题目题目实现 pow(x, n) ,即计算 x 的 n 次幂函数。示例二. 方法一:解题思路x^n = (e^ln(x))^n = e^(n*ln(x))解题代码public double myPow(double x, int n) { int flag = 1; if(x < 0 && n % 2 == 1) { flag = -1; } x = Math.abs(x); // x^原创 2020-11-15 09:50:10 · 79 阅读 · 0 评论 -
LeetCode0231. x的幂
一. 题231: 2的幂题目给定一个整数,编写一个函数来判断它是否是 2 的幂次方。解题代码public boolean isPowerOfTwo(int n) { if(n <= 0) { return false; } // 方法一: 统计有多少位是1, 当只有一位1时, 就是2的幂 // int sum = 0; // for(int i = 30; i >= 0; i--) { // sum += n原创 2020-11-12 10:22:10 · 66 阅读 · 0 评论 -
LeetCode0001. 两数之和
一. 题目题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]二. 解法一: 暴力求解解题思路:双重循环遍历列表中任意两个元素之和如果之和等于 target则将则两个元素原创 2020-06-17 01:11:26 · 89 阅读 · 0 评论 -
LeetCode0003. 无重复字符的最长子串
一. 题目题目给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例二. 方案一: 滑动窗口解题思路循环遍历整个字符串如果遍历的字符不在之前的子串中, 则将该字符继续加在子串中如果遍历的字符在之前子串中已经存在, 则将子串修改为原子串重复字符之后到新字符这一段每添加一个字符就判断是否超过之前子串的最长长度, 超过就修改最长长度遍历完之后得到的长度即为之春的最长长度解题代码def lengthOfLongestSubstring(self, s: str原创 2020-06-17 13:48:05 · 88 阅读 · 0 评论 -
LeetCode0004. 寻找两个正序数组的中位数(还未解决, 不满足题目要求)
一. 题目题目给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例二. 方法一: 合并求解(达不到题目要求的时间复杂度)解题思路解题代码def findMedianSortedArrays(self, nums1: List[int], nums2: List[int]) -> float:原创 2020-06-24 00:00:22 · 98 阅读 · 0 评论 -
LeetCode0005. 最长回文子串
一. 题目题目示例二. 方法一:解题思路解题代码# 判断字符串是否为回文def palindrome(self, s1: str): s2 = s1[::-1] if s1 == s2: return True else: return Falsedef longestPalindrome(self, s: str) -> str: len1 = len(s) len2 = len(s) w原创 2020-06-18 02:21:44 · 79 阅读 · 0 评论 -
LeetCode0007. 整数反转
一. 题目题目给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例二. 方法一:解题思路解题代码def reverse(x: int) -> int: result = 0 temp = x if x > 0 else -x while temp > 0: result = result * 10 + temp % 10 temp //= 10 if temp > 2 **原创 2020-06-18 11:41:25 · 77 阅读 · 0 评论 -
LeetCode0008. 字符串转换整数 (atoi)
一. 题目题目示例二. 方法一: 暴力解题思路本题解题思路比较简单, 但是要考虑的情况比较多, 我也是多次提交才把所有情况考虑周全,具体情况在代码中标注出来了解题代码def myAtoi(self, s: str) -> int: # 去掉字符串左侧的所有空格 str1 = s.lstrip() # 如果str1为空, 直接返回0, 如果不进行处理, 后面取第一个元素时还会报异常 if not str1: return 0 #原创 2020-06-18 15:39:24 · 92 阅读 · 0 评论 -
LeetCode0009. 回文数
一. 题目题目判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例二. 方法1: 转成字符串解题思路将数字转成字符串两字符串两侧的字符依次进行比较, 若不相等则不是回文如果运行到字符串中间都没提前退出, 则该字符串就是回文解题代码def isPalindrome(x: int) -> bool: str1 = str(x) size = len(str1) for i in range(size //原创 2020-06-18 16:17:46 · 80 阅读 · 0 评论 -
LeetCode0011. 盛最多水的容器
一. 题目题目示例输入:[1,8,6,2,5,4,8,3,7]输出:49二. 方法一: 暴力法(超时)解题思路从左到右开始遍历, 计算出任意两个之间围城的面积再从右往左开始遍历, 计算出任意两个之间围城的面积两次遍历后, 求得的值即为最大值解题代码def maxArea(height: List[int]) -> int: max_size = 0 for i in range(len(height) - 1): for原创 2020-06-24 00:53:42 · 100 阅读 · 0 评论 -
LeetCode0012. 整数转罗马数字
一. 题目题目示例二. 方法一解题思路这个方法应该只要看代码就能理解, 不过缺点是代码太长了, 容易出错解题代码def intToRoman(self, num: int) -> str: str1 = "" # 因为num < 4000, 所以千位时不需要考虑 大于等于4的情况 if num >= 1000: n1 = num // 1000 # 千位是几就添加几个"M" str1 +=原创 2020-06-18 21:22:31 · 103 阅读 · 0 评论 -
LeetCode0013. 罗马数字转整数
一. 题目题目实例二. 方法一:暴力解题思路遍历整个字符串考虑字符串中每一种组合形式求出和即可解题代码def romanToInt(s: str) -> int: sum1 = 0 i = 0 # 后面加一个空格的原因是, 后续判断中有判断当前字符和后一个字符的情况, # 如果不加不加空格, 有可能出现异常 s = s + " " size = len(s) # 这里-1的原因就是减掉之前空格的长度原创 2020-06-18 22:48:49 · 88 阅读 · 0 评论 -
LeetCode0015. 三数之和
一. 题目题目示例二. 方法一: 暴力法(超时)解题思路解题代码def threeSum(self, nums: List[int]) -> List[List[int]]: result = [] nums.sort() size = len(nums) for i in range(size - 2): for j in range(i + 1, size - 1): for k in rang原创 2020-06-26 22:28:53 · 111 阅读 · 0 评论 -
LeetCode0017. 电话号码的字母组合
一. 题目题目示例输入:“23”输出:[“ad”, “ae”, “af”, “bd”, “be”, “bf”, “cd”, “ce”, “cf”].二. 方法一解题思路解题代码# 笛卡尔积def cartesian(self, list1, list2): list3 = [] for e1 in list1: for e2 in list2: ele = e1 + e2 list3.append原创 2020-06-19 00:16:54 · 109 阅读 · 0 评论 -
LeetCode0020. 有效的括号
一. 题目题目给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。示例二. 方法一: 栈解题思路循环遍历整个字符串如果是左括号: “(”, “[” 或 “{”, 则插入到列表末尾如果是右括号, 则判断列表末尾是否为与之匹配的左括号,如果匹配, 则弹出最后一个元素; 如果不匹配, 则直接返回False遍历原创 2020-06-19 01:11:12 · 84 阅读 · 0 评论 -
LeetCode0021. 合并两个有序链表
一. 题目题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例二. 方法一解题思路解题代码def mergeTwoLists(self, l1: ListNode, l2: ListNode) -> ListNode: # 创建一个空链表, 用于存放合并后的链表 result = ListNode() # cur, pointer1, pointer2分别指向result, l1 和 l2的头节点原创 2020-08-24 10:35:36 · 85 阅读 · 0 评论 -
LeetCode0026. 删除排序数组中的重复项
一. 题目题目给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。示例二. 方法一解题思路解题代码def removeDuplicates(self, nums: List[int]) -> int: i = 0 while i < len(nums) - 1: if nums[i]原创 2020-06-24 18:23:19 · 111 阅读 · 0 评论 -
LeetCode0028. 实现 strStr()
一. 题目题目给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。示例二. 方法一: 暴力法解题思路解题代码def strStr(self, haystack: str, needle: str) -> int: # 如果needle为空, 则返回0 if not needle: return 0 size原创 2020-06-19 14:34:12 · 100 阅读 · 0 评论 -
LeetCode0032. 最长有效括号
一. 题目题目给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。示例二. 方法一: 暴力解题思路判断每一个子串是否是合法的, 然后返回最长合法子串的长度python 运行会超时解题代码def isValid(self, s:str): list1 = [] for ele in s: if ele == '(': list1.append(ele) elif list1 a原创 2020-06-20 02:07:32 · 98 阅读 · 0 评论 -
LeetCode0038. 外观数列
一. 题目题目示例二. 方法一: 递归解题思路递归方法如果n = 1, 直接返回1如果n > 1, 则计算出n - 1项结果对结果进行遍历, 对相邻位置相同数字进行计数然后拼接好的字符串即可解题代码class Solution: # 递归函数, 貌似写在主函数里面会报错, 不清楚是不是LeetCode不允许主函数递归 def countNum(self, n: int) -> str: # 默认每个元素计数为1原创 2020-06-20 11:28:20 · 113 阅读 · 0 评论 -
LeetCode0053. 最大子序和
一. 题目题目给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例二. 方法一解题思路如果之前的最大子序列小于0, 则当前最大子序列就是当前元素如果之前的最大子序列大于0, 则当前最大子序列等于之前最大子序列 + 当前元素解题代码def maxSubArray(self, nums: List[int]) -> int: max_size = nums[0] arr = [0 for _原创 2020-10-13 16:07:16 · 57 阅读 · 0 评论 -
LeetCode0058. 最后一个单词的长度
一. 题目题目给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例输入: “Hello World”输出: 5二. 方法一: 不用split()解题思路从字符串末尾开始向前遍历当遇到第一个为空格开始计数知道遇到空格位置返回最终的结果即可解题代码def le原创 2020-06-20 16:08:18 · 75 阅读 · 0 评论 -
LeetCode0070. 爬楼梯
一. 题目题目示例二. 方法一解题思路因为一次只能可能走一步或两步, 所以当最后一步可能是1步或2步所以n阶的情况等于n-1阶的情况 + n-2阶的情况斐波那契解题代码def climbStairs(self, n: int) -> int: if n <= 2: return n res = [_ + 1 for _ in range(n)] for i in range(2, n): res原创 2020-10-13 15:05:40 · 79 阅读 · 0 评论 -
LeetCode0073. 矩阵置零
一. 题目题目给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0。请使用原地算法。示例二. 方法一解题思路解题代码def setZeroes(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead. """ row = set() col = set原创 2020-10-13 20:54:28 · 81 阅读 · 0 评论 -
LeetCode0086. 分隔链表
一. 题目题目给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5二. 方法一: 链表拼接解题思路创建两个链表然后遍历原链表, 如果值小于val, 则插入到链表1的末尾; 否则插入到链表2的末尾遍历结束后,原创 2020-10-17 13:10:30 · 189 阅读 · 1 评论 -
LeetCode0088. 合并两个有序数组
一. 题目题目示例二. 方法一解题思路为每个列表定义一个指针l1, l2, 用于后续元素的比较如果 l1指向的元素小于l2指向的元素, 则l1向后移动一位如果 l1指向的元素大于等于l2指向的元素, 则将l2指向的元素插入到l1所指的位置将l2向后移动一位, nums1中元素个数(m) + 1; 并且弹出num1中最后一个元素, 如果不弹出, list1的长度将改变当l1的指向了nums1的最后一个元素时, 此时nums2中剩下的元素都比num1中的元素大只需要将num2剩原创 2020-06-21 00:11:48 · 95 阅读 · 0 评论 -
LeetCode0116. 填充每个节点的下一个右侧节点指针
一. 题目题目示例二. 方法一: 层次遍历解题思路层次遍历, 将同一层的所有元素通过next指针连起来即可解题代码def connect(self, root: 'Node') -> 'Node': if not root: return root # res 用于存储需要依次遍历的元素 res = [root] while res: # 获取同一层的元素个数原创 2020-10-15 14:29:10 · 82 阅读 · 0 评论 -
LeetCode0118/0119. 杨辉三角
一. 题目题目示例二. 方法一解题思路解题代码def generate(self, numRows: int) -> List[List[int]]: arr = [[0 for _ in range(_ + 1)] for _ in range(numRows)] for i in range(numRows): for j in range(i + 1): if i == j or j == 0:原创 2020-08-07 10:28:09 · 103 阅读 · 0 评论 -
LeetCode0125. 验证回文串
一. 题目题目给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。示例二. 方法一解题思路先去掉原字符串中两端的空格以及将其中的小写字母转成大写字母创建两个指针, 分别指向整理后字符串的头尾如果头指针小于尾指针, 且头指针所指元素不是字母或数字, 则索引 + 1如果头指针小于尾指针, 且尾指针所指元素不是字母或数字, 则索引 - 1如果头尾指针指向的元素都是数字或字母, 则比较元素是否相等原创 2020-06-20 22:29:57 · 82 阅读 · 0 评论 -
LeetCode0136. 只出现一次的数字
一. 题目题目示例二. 方法一: hash表解题思路统计每个元素出现的次数, 然后找出出现次数为1的元素即可解题代码def singleNumber(self, nums: List[int]) -> int: map1 = collections.Counter(nums) for k in map1: if map1[k] == 1: return k分析时间复杂度: O(n)空间复杂度: O原创 2020-08-12 19:58:33 · 151 阅读 · 0 评论 -
LeetCode0137. 只出现一次的数字 II(未完善)
一. 题目题目示例二. 方法一解题思路解题代码def singleNumber(self, nums: List[int]) -> int: map1 = collections.Counter(nums) for k in map1: if map1[k] == 1: return k分析三. 方法二: 位运算解题思路解题代码分析...原创 2020-08-12 20:42:47 · 70 阅读 · 0 评论 -
LeetCode0141. 环形链表
一. 题目题目示例二. 方法一: 快慢指针解题思路解题代码def hasCycle(self, head: ListNode) -> bool: if not head: return False left = head right = head.next while right and right.next: if left.next != right.next: left =原创 2020-08-24 13:29:09 · 88 阅读 · 0 评论 -
LeetCode0142. 环形链表 II
一. 题目题目示例二. 方法一: 集合解题思路用集合存储每一个节点的地址值如果地址值已经在集合中存在, 则该节点是环的第一个节点, 返回该节点如果遍历到列表末尾, 则说明没有环解题代码 def detectCycle(self, head: ListNode) -> ListNode: res = set() while head: if id(head) in res: return he原创 2020-10-17 09:49:56 · 72 阅读 · 0 评论 -
LeetCode0151. 翻转字符串里的单词
一. 题目题目给定一个字符串,逐个翻转字符串中的每个单词。示例二. 方法一解题思路将字符串按照空格切分, 并存入列表从右开始遍历列表将获取都的元素 加一个空格添加到字符串中遍历完后, 去掉最后一个空格,返回结果即可解题代码def reverseWords(self, s: str) -> str: list1 = s.split() result = "" for i in range(len(list1) - 1, -1, -1原创 2020-06-21 11:11:01 · 88 阅读 · 0 评论 -
LeetCode0165. 比较版本号
一. 题目题目示例二. 方法一: 暴力法解题思路将两个字符串以"."分割成列表将两个列表用"0"填充成长度相等然后从开头依次比较相同位置元素的大小如果相等, 继续比较下一位置的元素如果不相等, 则返回结果解题代码def compareVersion(self, version1: str, version2: str) -> int: list1 = version1.split(".") list2 = version2.split(".")原创 2020-06-21 01:13:52 · 113 阅读 · 0 评论 -
LeetCode0189. 旋转数组
一. 题目题目给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例二. 方法一解题思路将列表中最后的元素弹出并插入到列表的第一个位置重复k次后, 得到的列表即为最终结果解题代码def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ for原创 2020-10-13 11:09:44 · 91 阅读 · 0 评论 -
LeetCode0190. 颠倒二进制位
一. 题目题目颠倒给定的 32 位无符号整数的二进制位。示例二. 方法一: 拼接 + 反转解题思路解题代码def reverseBits(self, n: int) -> int: bin_num = bin(n) size = 34 - len(bin_num) result = "0b" + bin_num[-1: 1: -1] + "0" * size return int(result, 2)分析时间复杂度: O(1原创 2020-08-15 17:48:08 · 98 阅读 · 0 评论 -
LeetCode0191. 位1的个数
一. 题目题目编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。示例二. 方法一解题思路解题代码def hammingWeight(self, n: int) -> int: count = 0 while n > 0: if n % 2 == 1: count += 1 n >>= 1 return count原创 2020-08-14 19:24:56 · 96 阅读 · 0 评论