![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 63
KazeHelloWorld
这个作者很懒,什么都没留下…
展开
-
反悔贪心专题
反悔贪心给定截止时间和价值,每个花费单位时间价值一定模型(耗费时间/截止时间)贪心反悔机给定截止时间和价值,每个花费单位时间约翰有太多的工作要做。为了让农场高效运转,他必须靠他的工作赚钱,每项工作花一个单位时间。 他的工作日从 0 时刻开始,有 10^9 个单位时间。在任一时刻,他都可以选择编号 1 到 N 的 N 项工作中的任意一项工作来完成。 因为他在每个单位时间里只能做一个工作,而每项工作又有一个截止日期,所以他很难有时间完成所有N个工作,虽然还是有可能。 对于第 i 个工作,有一个截止时间原创 2021-08-24 20:30:18 · 253 阅读 · 0 评论 -
单调栈专题
单调栈42.接雨水84. 柱状图中最大的矩形85.最大矩形42.接雨水给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。class Solution: def trap(self, height: List[int]) -> int: stack = [] ans = 0 for i, h in enumerate(height): while stack and h原创 2021-08-02 17:09:26 · 69 阅读 · 0 评论 -
leetcode最热100道
leetcode4. 寻找两个正序数组的中位数5. 最长回文子串4. 寻找两个正序数组的中位数给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。思路: 二分查找两个数组中排序为k的值或k,k+1的均值,每次两个数组各取第前k/2个比较,小的那个以及后面都淘汰,该数组指数右移到后一位,循环操作,直到k==1或有一个数组淘汰完。class Solution: def findMedianSortedArrays(self原创 2021-07-23 00:16:36 · 448 阅读 · 0 评论 -
动态规划专题
动态规划139.单词拆分139.单词拆分给定一个非空字符串 s 和一个包含非空单词的列表 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明:拆分时可以重复使用字典中的单词。你可以假设字典中没有重复的单词。class Solution: def wordBreak(self, s: str, wordDict: List[str]) -> bool: dp = [False]*(len(s)+1) dp[0] = Tr原创 2021-07-17 21:01:55 · 192 阅读 · 0 评论 -
深度优先搜索和广度优先搜索
617.合并二叉树给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是如果两个节点重叠,那么将他们的值相加作为节点合并后的新值,否则不为 NULL 的节点将直接作为新二叉树的节点。思路: 每次要存两个树节点的元祖共同遍历,直接在左树上进行操作,在循环中先将左树加上右树值,再对两个节点的左右子树判定,都为非空则入队列,否则直接赋值左树的左右子树为另一非空值。bfs:# Definition for a binary tr原创 2021-07-15 22:41:33 · 142 阅读 · 1 评论 -
买卖股票的最佳时机
买卖股票的最佳时机买卖股票的最佳时机 II买卖股票的最佳时机 III买卖股票的最佳时机 II给定一个数组 prices ,其中 prices[i] 是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。动态规划:一维:交易日期,价格数组长度二维:两种状态:持有或现金class Solution: def maxProfit(self, price原创 2021-07-15 22:00:07 · 173 阅读 · 1 评论 -
567. 字符串的排列
字符串排列给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的 子串 。思路: 维护26格char计数数组,全部为0时返回True,diff变量记录不同char个数,滑动窗口遍历数组,首先从起点出发,计算当前charcount和diff,然后每次只考虑左右位置,对左右位置对应char的count进行操作,最后若diff为0返回Trueclass Solution: def checkInclusion(self, s原创 2021-07-15 11:05:30 · 75 阅读 · 0 评论 -
连续乘积子数组
总结: 对于乘积数组,常用方法为保存最大最小两个值,遇到负值就交换152.乘积最大子数组给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。乘以一个负数,最大最小发生转换,所以维护保存最大最小值,每次遇到负数,最大乘以负数变成最小, 最小乘以负数变成最大class Solution: def maxProduct(self, nums: List[int]) -> int: max_pro = nu原创 2021-07-12 19:15:14 · 391 阅读 · 0 评论 -
算法—双指针
双指针旋转数组旋转数组给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。进阶:尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗?环状替换:思路:依次交换右移,每次从起点开始回到起点走了a圈遍历了an个元素,同时每个元素相隔为k交换了b个元素,有等式an=bk,所以 b=lcm(n,k)/kb =\text{lcm}(n,k)/kb=lcm(n,k)/k,所以外层循环的次数为nklcm(n,k)原创 2021-07-12 13:56:08 · 122 阅读 · 0 评论 -
918. 环形子数组的最大和
918. 环形子数组的最大和给定一个由整数数组 A 表示的环形数组 C,求 C 的非空子数组的最大可能和。在此处,环形数组意味着数组的末端将会与开头相连呈环状。(形式上,当0 <= i < A.length 时 C[i] = A[i],且当 i >= 0 时 C[i+A.length] = C[i])此外,子数组最多只能包含固定缓冲区 A 中的每个元素一次。(形式上,对于子数组 C[i], C[i+1], …, C[j],不存在 i <= k1, k2 <= j 其中 k原创 2021-07-11 15:32:29 · 106 阅读 · 0 评论 -
55. 跳跃游戏 & 45. 跳跃游戏 II
跳跃游戏跳跃游戏跳跃游戏给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。思路:每次保存能最远到达的位置,如果当前位置大于最远位置,提前返回,否则每次更新最远距离class Solution: def canJump(self, nums: List[int]) -> bool: max_length = 0 for i in range(len(nu原创 2021-07-10 20:57:32 · 103 阅读 · 0 评论 -
打家劫舍
198.打家劫舍你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。思路: 动态规划,子问题每次查看当前值与跳一格值和与前一格值比较,每个位置保存当前及之前的最大值class Solution: def rob(self, nums: List[int])原创 2021-07-09 16:40:58 · 75 阅读 · 0 评论