力扣
Leosaf
大家好,我是天津科技大学人工智能专业的在校大学生,专注于人工智能的各个方面,目前就读本科,自己借用CSDN来记录自己的学习过程,欢迎大家一起分享学习经验
展开
-
力扣1713.得到子序列最少的操作次数
题目如下https://leetcode-cn.com/problems/minimum-operations-to-make-a-subsequence/题目解析简单来看会发现这道题目是求最长公共子序列,但是求最长公共子序列的时间复杂度会很高,其实我们可以将这个问题转化为最长上升子序列的解法。根据target中互不相同,我们知道每个数字对应的坐标唯一;于是最长公共子序列等价于arr用target的坐标转换后构成最长的上升子序列.因为子序列的顺序不会发生改变,还是按照原来的顺序进行排列,我们只需要原创 2022-01-12 13:30:22 · 2723 阅读 · 0 评论 -
力扣334.递增的三元序列(python题解)
题目如下:https://leetcode-cn.com/problems/increasing-triplet-subsequence/题目解析:这道题可以利用最长上升子序列的解法进行解答,但是这道题目可以优化,因为只需要达到三个上升序列即可,所以我们可以设置为定长。首先令K来储存我们的最长元素的最小的那一个,例如K[n]表示长度为n的上升序列中最后一个元素中的最小值,但是这里我们n只需要为2即可,因为如果有元素大于k[2],说明就有递增的三元序列。代码如下class Solution:原创 2022-01-12 11:17:30 · 348 阅读 · 0 评论 -
力扣1036.逃离大迷宫(Python题解)
题目网址:https://leetcode-cn.com/problems/escape-a-large-maze/submissions/题目解析:迷宫题目应该利用bfs进行解答,但是这道题目需要一点优化,给出的迷宫最大可到[1e6, 1e6], 数目庞大,如果直接进行遍历那么肯定会超时,但是我们可以巧妙地利用这个障碍,如果没有完全封锁的话,意味着我们可以走出去,但是封锁的话能达到什么地步呐?最大只能由200个坐标被封锁,最大化的话,就是说封锁一个角落最大值为n*(n-1)//2,n是封锁的坐标,所原创 2022-01-11 19:52:52 · 416 阅读 · 0 评论 -
Leetcode.6Z字形变换
题目解析这道题就需要我们暴力的去求解,解法其实也有方便的,这里我们采用了更为快的方法。我们只需要在计算中把三层分开然后组合就可以了。 if numRows < 2: return s res = ["" for _ in range(numRows)] i, flag = 0, -1 for c in s:# 我们把三层分开。 res[i] += c if i == 0 or i == n原创 2021-07-21 20:24:38 · 102 阅读 · 0 评论 -
leetcode.456.132模式
题目解析这道题目我们可以先找J。找出来j,开始找K,找K的条件是K要比J小,但是下标大,这我们可以一个一个遍历,最后找I,I要在K的基础上找,比K小,下标比J小。这次利用单调栈,我们储存的数值其实是可选的J的下标。codeclass Solution: def find132pattern(self, nums: List[int]) -> bool: n = len(nums) # 单调栈,存储的是可选的j的下标 stk = [0]原创 2021-07-21 20:22:16 · 107 阅读 · 0 评论 -
leetcode剑指 Offer 42. 连续子数组的最大和
题目意思很简单,我们可以直接用动态规划进行求解,前面的和如果小于所加的最后一个数字,那么最大值一定在这个数的后面,所以需要重新进行叠加,并记录此时最大值。class Solution: def maxSubArray(self, nums: List[int]) -> int: n = len(nums) pre = 0 ans = nums[0] for i in range(1, n + 1) : p原创 2021-07-17 15:30:57 · 92 阅读 · 0 评论 -
leetcode.53排序数组中查找数字
题目解析其实题目很简单,我们在排序数组中寻找的话首先要来找到左右边界,这里我们采用二分法进行解决。我们首先找到中点m,之后与target进行比较。i为初始下标0,j为结尾,如果寻找有边界,这个数小于等于target,那么i=m+1,否则j=m-1,然后继续这个循环,右边界与之相似 # 搜索右边界 right i, j = 0, len(nums) - 1 while i <= j: m = (i + j) // 2原创 2021-07-16 21:31:23 · 193 阅读 · 0 评论 -
leetcode 5.最长回文子数列——python
暴力解法看到这道题是第一个想的是暴力求解的方法,我们设置两个变量,一个变量代表起始位置,初始量为0,另外一个代表的是长度,初始量为1,我们进行遍历,如果发现更长的回文数列,那么就调换位置,最后返回结果。代码如下# encoding:utf-8def ff(a, b, c):# 判断是否为回文数列 while b < c: if a[b] != a[c]: return False b += 1 c -= 1原创 2021-07-15 20:47:30 · 154 阅读 · 0 评论 -
leetcode-300.最长递增子序列(python)
题目如下给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。题目解析这道题其实第一眼也能看出来,求最长递增数列应该用动态规划进行解决,但是动态规划的状态转移方程我们应该怎么做呐?我们假设有前n个数字进行比较,dp[i]是第i个,我们重新创建一个数列,数列里全是1,代表所有的数字都可以单个形成长度为1的子数列,然后计算前面有多少比自原创 2021-07-13 14:48:13 · 367 阅读 · 0 评论 -
力扣354.俄罗斯套娃信封问题——python
我们采用DP的方法进行解决,首先我们肯定要进行排序,我们首先会按照第一个数进行排序,但是相同的怎么办?我们在对相同的第一个的进行倒序排序,排序后,信封宽度是升序,必然是后面的信封套前面的信封。按h降序排列是为了找最长递增子序列时防止同一宽度的信封被选择多次。。之后我们通过循环进行获得最大值。 if not envelopes: return 0 N = len(envelopes) envelopes.sort(key=lambda x原创 2021-03-04 16:57:19 · 341 阅读 · 1 评论 -
力扣.304. 二维区域和检索 - 矩阵不可变——python
题目和昨天的差不多,都是有关于矩阵的,这里我们采用动态规划的方法进行解决。首先我们先保存所有的前缀和,之后我们需要知道一点sumRegion(row1, col1, row2, col2) = dp[row2][col2] - dp[row2][col1 - 1] - dp[row1 - 1][col2] + dp[row1 - 1][col1 - 1]但是为什么呐?我们看一下下面的图,黄色的减去两边橙色的加上一个红色的就是我们要求的,因为多间去了一个红色的。def __init__(self,原创 2021-03-02 17:40:13 · 152 阅读 · 0 评论 -
力扣303区域和检索 - 数组不可变——python解法
这道题目比较简单,我们直接上代码 def __init__(self, nums: List[int]): self.num_sum = [0,] for i in range(len(nums)): self.num_sum.append(self.num_sum[i]+nums[i]) def sumRange(self, i: int, j: int) -> int: return self.num_su原创 2021-03-01 21:06:58 · 109 阅读 · 0 评论 -
力扣867.转置矩阵——python讲解
题目比较简单,代码直接附上 M, N = len(matrix), len(matrix[0]) res = [[0] * M for i in range(N)] for i in range(M): for j in range(N): res[j][i] = matrix[i][j] return res原创 2021-02-25 19:56:24 · 194 阅读 · 0 评论 -
力扣832.翻转图像——python解法
这道题比较简单,反转图像我们怎么顺序都是一样的, for row in A: for k,_ in enumerate(row): row[k] = 1 - row[k] # Python 风格的循环, 1和0反转 i, j = 0, len(row) - 1 while i < j: row[i], row[j] = row[j], row[i] # P原创 2021-02-24 19:19:08 · 124 阅读 · 0 评论 -
力扣1052.爱生气的书店老板——python解答
题目很好理解,在做的时候我们可以尝试先计算所有的总和,计算过的算为0,之后我们来计算连续X个的哪个总和最大,求和就可以 n = len(customers) res = 0 for i in range(n): if grumpy[i] == 0: res += customers[i] customers[i] = 0 right = X原创 2021-02-23 20:51:33 · 87 阅读 · 0 评论 -
力扣766.托普利茨矩阵——python解答
这道题比较简单,我们只需要进行比较就可以了 m = len(matrix) n = len(matrix[0]) for i in range(0, m-1): for j in range(0, n-1): if matrix[i][j] != matrix[i+1][j+1]: return False return True...原创 2021-02-22 15:01:55 · 135 阅读 · 0 评论 -
力扣1438.绝对差不超过限制——python
题目中我们需要不断的进行两两比较,感觉用到itertools包应该是个不错的选择,罗列出所有的两两组合进行比较,但是很可惜,是一个超时的答案import itertoolsx=[10,1,2,4,7,2]k = 5right = 0left = 0res = 0while right < len(x): n = True right += 1 m=x[left:right+1] print(m) for i in itertools.permuta原创 2021-02-21 13:49:44 · 171 阅读 · 1 评论 -
力扣697.数组的度——python
我们利用哈希表来解决该问题,我们通过字典记录出现的次数和位置,进行排序,然后我们寻找第一个和最后一个位置差,就可以找到答案了 # 找到所有元素的索引 n = len(nums) d = collections.defaultdict(list) for i in range(n): d[nums[i]].append(i) # 按照出现次数排序 tmp = sorted(d, key=la原创 2021-02-20 14:29:25 · 173 阅读 · 0 评论 -
leetcode.1004最大连续1的个数3——python双指针
我们采用双指针,右指针进行移动,左指针判断0的个数,超过K右移 N = len(A) res = 0 left, right = 0, 0 zeros = 0 while right < N: if A[right] == 0: zeros += 1 while zeros > K: if A[left]原创 2021-02-19 22:19:38 · 71 阅读 · 0 评论 -
995.K连续位的最小翻转次数——python
我们使用队列模拟滑动窗口,该滑动窗口的含义是前面 K - 1 个元素中,以哪些位置起始的 子区间 进行了翻转。该滑动窗口从左向右滑动,如果当前位置 i 需要翻转,则把该位置存储到队列中。遍历到新位置 j (j < i + K) 时,队列中元素的个数代表了 i 被前面 K - 1 个元素翻转的次数。当 A[i] 为 0,如果 i 位置被翻转了偶数次,那么翻转后仍是 0,当前元素需要翻转;当 A[i] 为 1,如果 i 位置被翻转了奇数次,那么翻转后变成 0,当前元素需要翻转。综合上面两点,我们得到原创 2021-02-19 22:15:23 · 242 阅读 · 0 评论 -
力扣566.重塑矩形——python版
我们采用直接的暴力求法,首先判断是否可以重塑,如果可以,就重塑 M, N = len(nums), len(nums[0]) if M * N != r * c: return nums res = [[0] * c for _ in range(r)] row, col = 0, 0 for i in range(M): for j in range(N):原创 2021-02-17 15:10:17 · 81 阅读 · 1 评论 -
561.数组拆分1——python讲解
这里我们要两个数中的最小值进行寻找和的最大值,我们需要进行排序,然后我们需要进行两两比较就可以,这要就可以保证是最大了 nums.sort() res = 0 for i in range(0, len(nums), 2): res += min(nums[i], nums[i + 1]) return res...原创 2021-02-16 15:11:30 · 193 阅读 · 1 评论 -
力扣485.最大连续——python讲解
我们通过记录零的位置来比较最大的连续: index = -1 res = 0 for i, num in enumerate(nums): if num == 0: index = i else: res = max(res, i - index) return res...原创 2021-02-16 15:09:29 · 234 阅读 · 1 评论 -
力扣.765情侣牵手——python
我们先了解一下题意求,只要情侣在左右都可以,而且求数字 x 的对象时用到了一个技巧,x 的对象是x ^ 1。解释如下:当 x 是偶数,则其二进制的末尾是 0,所以 x ^ 1 将其二进制的末尾改成 1,于是得到了x的对象 x + 1。当 x 是奇数,则其二进制的末尾是 1,所以 x ^ 1 将其二进制的末尾改成 0,于是得到了x的对象 x - 1。我们尝试用贪心算法求解: res = 0 for i in range(0,len(row),2):原创 2021-02-14 15:49:06 · 205 阅读 · 1 评论 -
力扣978最长湍流子数组——Python解答
我们采用DP解法 up = [1] * len(arr) down = [1] * len(arr) ans = 1 for i in range(1, len(arr)): if arr[i] > arr[i-1]: up[i] = down[i-1] + 1 elif arr[i] < arr[i-1]: down[原创 2021-02-09 22:36:44 · 88 阅读 · 0 评论 -
力扣992.K个不同整数的子数组——Python
本个题目我们采用双指针的方法进行解决, 但是这里有需要注意的地方,根据 好子数组 的定义,当我们使用双指针的方法时,会发现当固定左边端点时,符合 恰好有 KK 个不同整数 的子区间的右端点并不是唯一的。这里我们转换下思路,假设求 最多有 K 个不同整数 的子区间,最终求得符合要求的子区间中,包含以下情况:仅包含 1 个不同整数的子区间;仅包含 2 个不同整数的子区间;…仅包含 K-1 个不同整数的子区间;仅包含 K 个不同整数的子区间。我们可以发现 恰好有 K 个不同整数 的子区间,包含于求原创 2021-02-09 21:48:35 · 418 阅读 · 0 评论 -
力扣665.非递减数列——python
这道题标记为简单,本以为遍历完就够了,结果报错了。[3,4,2,3]这种情况和其他的还不一样,我们需要修改数字,但是相对于i来说,当i = 1时,我们应该优先考虑把 i - 1 调小到 >= i - 2并且 <= i。同样尽量不去修改 i。我们需要修改i-1,而不是i,因为i具体我们还不知道,当 i > 1 且 i < i - 2 时,我们无法调整 i - ] ,我们只能调整i到 i - 1。 N = len(nums) count = 0原创 2021-02-07 17:25:32 · 148 阅读 · 0 评论 -
力扣1423.可获得的最大点数——python
这道题我们依旧采用滑动窗口的方法,我们使窗口长度为N - k,采用反向思维,计算窗口里的最小值,N = len(cardPoints) windowSize = N - k #窗口的大小 sums = 0 res = float("inf") #正无穷大 for i in range(N): sums += cardPoints[i] if i >= windowSize:原创 2021-02-06 17:52:46 · 156 阅读 · 1 评论 -
力扣1208.尽可能使字符串相等——python
利用滑动窗口的方法进行解题,不断地往下一个移动,记录最长的连续 l = len(s) costs = [0] * l total_cost = 0 start = 0 n = 0 for end in range(l): costs[end] = abs(ord(s[end])-ord(t[end])) total_cost += costs[end]原创 2021-02-05 17:27:59 · 111 阅读 · 0 评论 -
leetcode643.子数组最大的平均数——python
首先创立一个最大值,最大值最大,平均值自然最大,我们定义为无穷小,然后依次往下计算就行 sums = 0 largest = float('-inf')# 无穷小 for i, num in enumerate(nums): sums += num if i >= k: sums -= nums[i - k] if i >= k - 1:原创 2021-02-04 20:12:38 · 155 阅读 · 0 评论 -
力扣480.滑动窗口的中位数——python
我们采用数组二分查找算法,利用bisect包8.6. bisect — 数组二分查找算法¶,我们先创建第一个数组,然后删除一个,添加一个依次继续import bisectclass Solution: def medianSlidingWindow(self, nums: List[int], k: int) -> List[float]: #我们利用函数得到我们需要的中位数的位置 median = lambda a: (a[(len(a)-1)//2] +原创 2021-02-04 20:06:21 · 205 阅读 · 0 评论 -
力扣424.替换后的最长替换字符——python
这里利用defaultdict模块,创建出一个所有值为0的字典,之后进行遍历逐渐进行判断最大的可选的的数值,利用需要替换数=开始-结束+1-最大的重复数,如果符合要求先记录,否则我们改变起点继续进行 from collections import defaultdict maxLen, Start, maxFreq = 0, 0, 0 # 统计出现次数 freqDict = defaultdict(int) for End in原创 2021-02-02 18:59:59 · 193 阅读 · 1 评论 -
力扣839.相似的字符串组——python
先理解一下题目的意思,这个组中只要一个与其他的一个相似,就可以加入这个组,也就是说一个组中即使有两个不相似,他们也可以间接的连入关系这时就需要并查集来建立关系了,这样才可以建立一个清晰的关系,保证不重复。什么是并查集我们这里并用不到全部部分,其实全部挺好的,在刷题的时候,发现global函数在力扣的python无用,也就是我们需要在函数中修改参数必须重新建立一个类,在类中进行修改,但是我们此时仍然可以利用并查集的特点进行解决。我们加入一个参数时self.count = n在连接时,每连接一次,c原创 2021-01-31 16:03:50 · 203 阅读 · 2 评论 -
力扣778水位上升的泳池中游泳——python
题目要求我们在最短的时间内从左上角走到右下角,我们需要找到一个合理的路线,我们可以堆加bfs,在python中,我们可以用heapq这个包来模拟堆队列heapq — 堆队列算法,这是官方文档的介绍。堆队列是一个优先级队列,最小值永远在最前面,我们可以创建一个列表,里面由若干个元组,元组中分别是水位和坐标,堆会自动按照坐标排序,依次从左上角开始往下走,先走比较低的水位,同时,我们使用heappop也会弹出最小的值并且删除,利用heappush也会加入元素代码如下: res = 0原创 2021-01-30 20:21:22 · 188 阅读 · 0 评论 -
力扣1631最小体力消耗路径——python
我们先理解一下题目,他要求我们返回的是最小的体力消耗,这里的体力消耗于高度差的绝对值有关,越小越省体力,我们我们最后需要把所有的内容全部都连接一起。我们可以尝试用暴力方法求解。我们依次遍历上下左右,每条路都求完,然后返回出最大的绝对值之差。heights = []r, c = len(heights), len(heights[0])if r ==1 and c == 1: return 0 #如果只有一个格子直接返回0dp = [[float('inf')]*c for _ in原创 2021-01-30 19:29:20 · 278 阅读 · 0 评论 -
力扣724.寻找数组的中心索引——python
题目要求中心索引左右之和相等,没有的话我们返回-1,重复的返回最左边的,我们可以直接遍历所有,分别进行求和,满足条件我们返回值,否则-1 for i in range(len(nums)): if sum(nums[:i]) == sum(nums[i+1:]): return i return -1...原创 2021-01-28 15:31:36 · 143 阅读 · 0 评论 -
力扣1579.保证图可完全遍历——python
又是连接图问题,但是和之前有所不同,我们这里的线分为三种,一种只连接Alice,另一种只连接Bob,第三种两者都可以,注意我们此时要求去除的最大数量。我们最好的办法是先把第三种全部连接,在考虑其余的两种,这样才能保证去除量最大。我们利用并查集进行解决并查集的介绍在这...原创 2021-01-27 15:51:46 · 94 阅读 · 0 评论 -
力扣1128,等价多米诺骨牌对——python
题目的意思我们很容易去理解,但是他们还有可能反转才相等,那太麻烦了吧,不如我们直接用map函数对内部的所有小列表排序 newDominoes = map(lambda x:sorted(x),dominoes)之后我们只需要去重就行了,但是我们注意有一个坑,每有一个重复的出现,对数实际上是加的原来的重复个数,如果原来由两个[1, 2],再出现一个[1, 2],他们的对数实际上是加了两个,而不是只加一个。我们的第一个方法肯定会暴力简单的循环,双循环就可以完成了所有,但是两个循环复杂度似乎原创 2021-01-26 15:04:47 · 182 阅读 · 0 评论 -
力扣959.用斜杠划分区域——python解决
这一题又是一道关于并查集的题目,但是该如何去解决?原来的格子是一个整的正方形,我们通过输入斜杠进行切分,我们怎么去判断斜杠切分区域和方向?我们可以把正方形改变一下,我们就假使正方形已经被我们完全切分了,变成这样:我们把四个区域表上序号我们对列表遍历,如果是\,连接02, 13, 如果是/连接01, 23.这个时候,我们注意要创建这个并查集时候,我们要有正方形的块数,每块分成四份,最后在判断改变。class UnionFind: def __init__(self, n):原创 2021-01-25 19:27:11 · 205 阅读 · 1 评论 -
力扣989数组形式的整数python解答
我们直接把数字变成字符串再总和,变为整数计算完成后再变字符串 x = [] for i in A: x.append(str(i)) m = int(''.join(x)) m += K return list(str(m))原创 2021-01-22 21:00:09 · 148 阅读 · 0 评论