![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode(自用)
刘芋儿
这个作者很懒,什么都没留下…
展开
-
Leetcode 剑指 Offer 11. 旋转数组的最小数字
代码:class Solution: def minArray(self, numbers: List[int]) -> int: left, right = 0, len(numbers) - 1 while left < right: mid = (left + right) // 2 if numbers[mid] > numbers[right]: left..原创 2021-10-29 10:00:47 · 206 阅读 · 0 评论 -
Leetcode75-颜色分类
Leetcode75-颜色分类代码:class Solution: def sortColors(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ left = 0 right = 1 for left in range(len(nums)):原创 2021-09-22 16:12:20 · 207 阅读 · 0 评论 -
Leetcode74-搜索二维矩阵
Leetcode74-搜索二维矩阵思路:从右上角开始遍历,如果目标值小于当前值,则列减小;如果目标值大于当前值,则行增加。或者用两次二分法,先使用一次二分法找到可能出现的行,再在该行内使用二分法确定列。代码1:class Solution: def searchMatrix(self, matrix: List[List[int]], target: int) -> bool: row = 0 col = len(matrix[0]) - 1原创 2021-09-22 15:55:46 · 152 阅读 · 0 评论 -
Leetcode73-矩阵置零
Leetcode73-矩阵置零思路:使用其他字符占位,最后遍历列表,将该字符替换为数字0.遍历二维列表,如果遇到每个位置的数为0,将其所在行、所在列的数字替换为字符’X’代码:class Solution: def setZeroes(self, matrix: List[List[int]]) -> None: """ Do not return anything, modify matrix in-place instead.原创 2021-09-22 15:33:03 · 75 阅读 · 0 评论 -
Leetcode71-简化路径
Leetcode71-简化路径思路:代码:class Solution: def simplifyPath(self, path: str) -> str: l = path.split('/') res = [] for i in range(len(l)): if l[i] == '..': if res: res.pop()原创 2021-09-22 14:58:22 · 189 阅读 · 0 评论 -
Leetcode62-不同路径
Leetcode62-不同路径思路:当前位置可由前一位置向右或者向下得到。特例:第一行和第一列。第一行的位置只能由左边的位置向右得到;第一列的位置只能由上面的位置向下得到。代码:class Solution: def uniquePaths(self, m: int, n: int) -> int: #动态规划 dp = [[0]*n for _ in range(m)] for i in range(m):原创 2021-09-22 10:57:27 · 90 阅读 · 0 评论 -
Leetcode59-螺旋矩阵 II
Leetcode59-螺旋矩阵 II思路:初始化一个二维数组。二维数组的初始化方法: matrix = [[0] * n for _ in range(n)]和螺旋数组一样的思路代码:def generateMatrix(n): matrix = [[0] * n for _ in range(n)] left, right = 0, n - 1 top, botton = 0, n - 1 elements = [] index = 0原创 2021-09-21 15:29:09 · 84 阅读 · 0 评论 -
Leetcode58-最后一个单词的长度
Leetcode58-最后一个单词的长度思路:代码:class Solution: def lengthOfLastWord(self, s: str) -> int: end = len(s)-1 while end >= 0 and s[end] == ' ': end-=1 start = end while start >= 0 and s[start] != ' ':原创 2021-09-21 14:54:00 · 66 阅读 · 0 评论 -
Leetcode56-合并区间
Leetcode56-合并区间思路:判断左右区间的大小遍历intervals中的区间,和res中的最后一个区间相比较。[[1,3],[2,6],[8,10],[15,18]]首先排序:[[1,3],[2,6],[8,10],[15,18]]res初始化为:res=[[]]赋初值:res[0]=intervals[0]=[[1,3]]然后从[2,6]开始遍历,因为【2,6】的左边端点2小于res中最后一个值【1,3】的右边端点3,所以有重叠,因为是排过序的,所以左端点肯定来自【1,3】的1,关原创 2021-09-20 20:50:48 · 121 阅读 · 0 评论 -
Leetcode53-最大子序和
Leetcode53-最大子序和思路:动态规划dp[i]指i处的最大子序和,如果dp[i-1]<0, 那么dp[i-1]+nums[i]肯定比nums[i]小,此时舍弃dp[i-1],dp[i] = nums[i]代码:class Solution: def maxSubArray(self, nums: List[int]) -> int: dp = [0] * len(nums) dp[0] = nums[0] for i i原创 2021-09-20 17:16:49 · 66 阅读 · 0 评论 -
Leetcode55-跳跃游戏
Leetcode55-跳跃游戏代码1:(错误版)class Solution: def canJump(self, nums: List[int]) -> bool: cur, left, right = 0, 0, 0 tmp = 0 while right < len(nums): left = right + 1 right = cur + nums[cur]原创 2021-09-20 17:10:53 · 162 阅读 · 0 评论 -
Leetcode54-螺旋矩阵
Leetcode54-螺旋矩阵思路:依次向右向下向左向上遍历。使用while来控制循环:while(true)作为无限循环,经常在不知道循环次数的时候使用,并且需要在循环内使用break才会停止。break条件:left>right or top>botton代码:class Solution: def spiralOrder(self, matrix: List[List[int]]) -> List[int]: left, right = 0,原创 2021-09-20 16:50:53 · 60 阅读 · 0 评论 -
Leetcode50-Pow(x,n)
Leetcode50-Pow(x,n)代码class Solution: def myPow(self, x: float, n: int) -> float: res = 1 n1 = abs(n) while n1: if n1 % 2 == 1: res *= x n1 //= 2 x *= x if n >原创 2021-09-20 16:31:53 · 59 阅读 · 0 评论 -
Leetcode47-全排列II
Leetcode47-全排列II和上一题不同的是,本题的nums中可能包含了重复数字,不能再用if nums[i] in path:来判断了。此时想到引入一个列表来标记数字是否使用过。used[I] = True or FalseTrue: 用过了False:没用过题解来自:https://leetcode-cn.com/problems/permutations-ii/solution/hui-su-suan-fa-python-dai-ma-java-dai-ma-by-liwe-2/思原创 2021-09-15 16:16:47 · 65 阅读 · 0 评论 -
Leetcode46-全排列
Leetcode46-全排列思路:代码:class Solution: def permute(self, nums: List[int]) -> List[List[int]]: res = [] def backtrack(path): if len(path) == len(nums): res.append(path[:]) return原创 2021-09-15 14:23:46 · 75 阅读 · 0 评论 -
Leetcode45-跳跃游戏II
Leetcode45-跳跃游戏II思路代码:class Solution: def jump(self, nums: List[int]) -> int: if len(nums) == 1: return 0 step = 0 # 记录总步数 left = 0 right = 0 cur = 0 # nums=[2,3,1,1,4] whil原创 2021-09-14 17:06:36 · 70 阅读 · 0 评论 -
Leetcode43-字符串相乘
代码1:class Solution: def multiply(self, num1: str, num2: str) -> str: num1 = '0' + num1 l1 = len(num1) l2 = len(num2) sum = 0 for i in range(l2-1,-1,-1): c = 0 tmp_sum = 0 ...原创 2021-09-14 16:13:16 · 95 阅读 · 0 评论 -
Leetcode42-接雨水
Leetcode42-接雨水思路:双指针代码:class Solution: def trap(self, height: List[int]) -> int: ans = 0 left = 0 right = len(height) - 1 max_left = 0 max_right = 0 while left < right:原创 2021-09-14 15:04:51 · 76 阅读 · 0 评论 -
Leetcode41-缺失的第一个正数
Leetcode41-缺失的第一个正数思路:代码:class Solution: def firstMissingPositive(self, nums: List[int]) -> int: n = len(nums) for i in range(n): #判断当前输入是否在【1,n+1】 while nums[i] >= 1 and nums[i] <= n and nums[i] !原创 2021-08-30 11:00:45 · 69 阅读 · 0 评论 -
Leetcode39-组合总和
Leetcode39-组合总和思路:深度优先遍历/深度优先搜索-----------------------------------------------------------------------------------------代码:class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: res = []原创 2021-08-29 20:34:34 · 91 阅读 · 0 评论 -
Leetcode34-在排序数组中查找元素的第一个和最后一个位置
Leetcode34-在排序数组中查找元素的第一个和最后一个位置class Solution: def searchRange(self, nums: List[int], target: int) -> List[int]: if not nums: return [-1, -1] def searchLeft(nums, target): left = 0 right = len(n原创 2021-08-29 15:12:05 · 78 阅读 · 0 评论 -
Leetcode33-搜索旋转排序数组
Leetcode33-搜索旋转排序数组思路:二分法。class Solution: def search(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 while left <= right: mid = (left + right) // 2 if nums[mid] == ta原创 2021-08-28 21:13:56 · 96 阅读 · 0 评论 -
Leetcode31-下一个排列
Leetcode31-下一个排列思路:先从后往前遍历,得到最靠右的一组升序组【nums[left], nums[left+1]】代码:特殊情况,空列表or只有一个元素,则返回原列表。class Solution: def nextPermutation(self, nums: List[int]) -> None: if len(nums) == 1: return nums for left in range(len(num原创 2021-08-28 17:13:17 · 65 阅读 · 0 评论 -
Leetcode733-图像渲染
Leetcode733-图像渲染思路:深度优先搜索。从当前点分别向上、向下、向左、向右搜索,直到不满足条件(超出边界或者不等于初始设定的像素值)。不满足条件需往后退一步,比如:向上移动后不满足条件,则返回(向下回移一步),然后又向下试探。如果当前点移动后的点满足条件(等于初始像素值且没有出界),则将该点涂色,以该点为中心,向上向下向左向右搜索,以此类推。class Solution: def floodFill(self, image: List[List[int]], sr: int,原创 2021-08-23 21:14:07 · 61 阅读 · 0 评论 -
Leetcode643-子数组最大平均数 I
Leetcode643-子数组最大平均数 I思路:滑动窗口。class Solution: def findMaxAverage(self, nums: List[int], k: int) -> float: sum_ = 0 #计算k个数的和 max_avg = -inf #初始化最大值为负无穷 start = 0 #初始左界限 for end in range(len(nums)): sum_原创 2021-08-22 20:29:20 · 76 阅读 · 0 评论 -
Leetcode567-字符串的排列
Leetcode567-字符串的排列思路:滑动窗口。计数方法。如果当前子串不满足条件,则向右移动。(left-1,right+1)class Solution: def checkInclusion(self, s1: str, s2: str) -> bool: l1, l2 = len(s1), len(s2) if l1 > l2: return False counter1 = {i: 0 for i原创 2021-08-22 20:25:58 · 55 阅读 · 0 评论 -
Leetcode187-重复的DNA序列
Leetcode187-重复的DNA序列思路:滑动窗口;使用set()去重复。遍历长度为L的子串,如果子串没出现过,则加入visited,如果子串在visited中出现过,则是要寻找的目标子串,加入到最终的结果中。要注意:如果直接使用列表,则可能出现重复子串,使用set函数去重复。class Solution: def findRepeatedDnaSequences(self, s: str) -> List[str]: L = 10 visite原创 2021-08-22 20:20:45 · 50 阅读 · 0 评论 -
Leetcode29-两数相除
Leetcode29-两数相除思路:倍增比大小。比如63/4:步骤:4+4=8 < 63 multiply =2 【2x4=8】8+8=16<63 multiply =4【4x4=16】16+16=32<63 multiply =8【8x4=32】 res = 832+32=64>63 新的dividend=63-32=31再次循环:4+4=8 < 31 multiply =2 【2x4=8】8+8=16<31 multiply =4【4x原创 2021-08-21 14:56:56 · 102 阅读 · 0 评论 -
Leetcode28-实现 strStr()
Leetcode28-实现 strStr()思路:切片。遍历。class Solution: def strStr(self, haystack: str, needle: str) -> int: k = len(needle) n = len(haystack) # for i in range(n): for i in range(n-k+1): #边界 if haystack[i:i + k]原创 2021-08-21 13:53:43 · 62 阅读 · 0 评论 -
Leetcode876-链表的中间结点
Leetcode876-链表的中间结点思路1: 先计算出链表的长度,然后找到中间位置,从而得到中间节点。# Definition for singly-linked list.# class ListNode:# def __init__(self, val=0, next=None):# self.val = val# self.next = nextclass Solution: def middleNode(self, head: Lis原创 2021-08-21 10:55:26 · 46 阅读 · 0 评论 -
Leetcode26-删除有序数组中的重复项
Leetcode26-删除有序数组中的重复项思路:双指针i, ji用来记录哪些项是不重复的,j来遍历所有项。class Solution: def removeDuplicates(self, nums: List[int]) -> int: i = 0 j = 1 #for j in range(1, len(nums)): while j < len(nums): if nums[j] !原创 2021-08-20 22:44:57 · 51 阅读 · 0 评论 -
Leetcode344-反转字符串
Leetcode344-反转字符串思路:双指针,交换左右指针指向的字符。class Solution: def reverseString(self, s: List[str]) -> None: """ Do not return anything, modify s in-place instead. """ left = 0 right = len(s) - 1 while left &原创 2021-08-20 15:03:39 · 102 阅读 · 0 评论 -
Leetcode167-两数之和II
Leetcode167-两数之和II思路:双指针。和第一个两数之和的不同点是:本题有且只有一个答案,而且输入的整数数组是有序的。class Solution: def twoSum(self, numbers: List[int], target: int) -> List[int]: left = 1 right = len(numbers) res = [] while left < right:原创 2021-08-20 14:53:53 · 49 阅读 · 0 评论 -
Leetcode283-移动零
Leetcode283-移动零思路:双指针。right指针用于遍历,left指针用于记录不为零的数。class Solution: def moveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ left, right = 0, 0 for right i原创 2021-08-20 14:33:38 · 61 阅读 · 0 评论 -
Leetcode189-旋转数组
Leetcode189-旋转数组思路1:找规律,但是要新建另一个列表,感觉不太好。class Solution: def rotate(self, nums: List[int], k: int) -> None: """ Do not return anything, modify nums in-place instead. """ res = [0] * len(nums) for j in range原创 2021-08-20 10:28:13 · 105 阅读 · 0 评论 -
Leetcode16-最接近的三数之和
Leetcode16-最接近的三数之和思路:双指针代码:class Solution: def threeSumClosest(self, nums: List[int], target: int) -> int: nums.sort() min_dis = inf for start in range(len(nums) - 1): left = start + 1 right = len原创 2021-08-17 16:34:56 · 79 阅读 · 0 评论 -
Leetcode35-搜索插入位置
Leetcode35-搜索插入位置思路:二分法,注意特殊情况的判断,当target大于所有数时,插入到列表末尾。代码:class Solution: def searchInsert(self, nums: List[int], target: int) -> int: left = 0 right = len(nums) - 1 if target > nums[-1]: return len(nums)原创 2021-08-17 15:31:43 · 55 阅读 · 0 评论 -
Leetcode278-第一个错误的版本
Leetcode278-第一个错误的版本思路:二分法,双指针注意开闭区间eg.[F,F,F,T,T]:第四个版本开始错,返回4[F,F,T,T,T,T,T]:第三个版本开始错,返回3代码:# The isBadVersion API is already defined for you.# @param version, an integer# @return an integer# def isBadVersion(version):class Solution: def原创 2021-08-17 15:16:17 · 54 阅读 · 0 评论 -
Leetcode704-二分查找
Leetcode704-二分查找思路:二分法。定义left,right,初始化为第一个和最后一个元素。mid=(left+right)// 2,如果nums[mid]>target,中间的值比目标值大,说明目标值只可能出现在当前中间位置的左方,所以right=mid-1.最开始写的时候犯了一个错误:写成了right=mid,这种情况下,会陷入死循环。比如([-1,0,5],-1)查找-1时:left = 0right = 2mid = (0+2)//2=1nums[mid] =原创 2021-08-17 14:44:10 · 59 阅读 · 0 评论 -
Leetcode15-三数之和
Leetcode15-三数之和思路:双指针代码:(时间复杂度较高)class Solution: def threeSum(self, nums: List[int]) -> List[List[int]]: nums.sort() print(nums) start = 0 # left = 1 res = [] while start < len(nums):原创 2021-08-17 11:05:21 · 74 阅读 · 0 评论