![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构和算法
文章平均质量分 68
liyuanmrwhite
这个作者很懒,什么都没留下…
展开
-
动态规划-背包问题
1、基础问题:给你一个可以装载重量为w的背包和n个物品,每个物品有价值和重量2个属性,其中第i个物品重量wt[i],价值为val[i],现在用这个背包装物品,限定重量下最多价值是多少动态规划标准套路:1、确定状态和选择状态:背包重量和可选择的物品选择:装进背包和不装进背包2、dp数组定义:dp[i][j] 对于前i个物品,当背包重量为j时的最大价值时dp[i][j]3、状态转移矩阵dp[i][j]=1、if 没有把物品放进背包:dp[i-1][j] 维持之前.原创 2021-09-06 00:26:50 · 190 阅读 · 0 评论 -
动态规划3 高楼扔鸡蛋
887. 鸡蛋掉落难度困难668收藏分享切换为英文接收动态反馈给你k枚相同的鸡蛋,并可以使用一栋从第1层到第n层共有n层楼的建筑。已知存在楼层f,满足0 <= f <= n,任何从高于f的楼层落下的鸡蛋都会碎,从f楼层或比它低的楼层落下的鸡蛋都不会破。每次操作,你可以取一枚没有碎的鸡蛋并把它从任一楼层x扔下(满足1 <= x <= n)。如果鸡蛋碎了,你就不能再次使用它。如果某枚鸡蛋扔下后没有摔碎,则可以在之后的操作中重复使用...原创 2021-08-19 00:15:11 · 146 阅读 · 0 评论 -
动态规划2:四字键盘
LeetCode 651:四字键盘假设有一个键盘只有四个键,A 显示一个ACtrl+A 全选Ctrl+C 复制Ctrl+V 黏贴class Solution: def maxA(self, N): dp = [0 for i in range(N+1)] for i in range(1,N+1): #按A键 dp[i] = dp[i - 1] +1 for..原创 2021-08-02 23:56:53 · 116 阅读 · 0 评论 -
动态规划1:最长回文子序列
问题描述:516. 最长回文子序列给定一个字符串 s ,找到其中最长的回文子序列,并返回该序列的长度。可以假设 s 的最大长度为 1000 。示例 1:输入:"bbbab"输出:4一个可能的最长回文子序列为 "bbbb"。示例 2:输入:"cbbd"输出:2一个可能的最长回文子序列为 "bb"。方法一:斜线遍历class Solution: def longestPalindromeSubseq(self, s: str) -> int:原创 2021-07-05 00:23:01 · 239 阅读 · 0 评论 -
算法框架6 二叉树遍历及其应用
1. 中序遍历类型1:对于一个二叉查找树来说,其中序遍历结果是一个有序数组面试题 17.12. BiNodedef convertBiNode(self, root: TreeNode) -> TreeNode: self.ans = self.pre = TreeNode(-1) def dfs(root): if not root: return dfs(root.left) root.left原创 2021-03-01 00:24:22 · 149 阅读 · 0 评论 -
算法框架5 二分查找
基础二分查找def binary_search(nums,target): left = 0 right = len(nums) - 1 while left <= right: mid = left + (right - left)/2 if nums[mid] < target: left = mid + 1 elif nums[mid] > target: ri.原创 2021-02-23 00:12:01 · 109 阅读 · 0 评论 -
算法4 BFS
BFS模板from collections import dequedef BFS(start,target): q = deque() visited = set() q.append(start) #队列,关键数据类型 visited.add(start)#已经访问的元素 step = 0 #记录扩散步数 while q: sz = len(q) #将当前队列中元素向四周扩散 for i in r原创 2021-02-19 23:34:38 · 66 阅读 · 0 评论 -
算法框架2 回溯
result = []def backtrace(路径,选择列表): if 满足结束条件: result.add(路径) return for 选择 in 选择列表: 做选择 backtrace(路径,选择列表) 撤销选择关键三要素,路径,选择列表和结束条件案例1:46. 全排列import copyclass Solution: def permute(self, nums.原创 2021-01-15 00:17:05 · 59 阅读 · 0 评论 -
算法框架1:动态规划
通用模板:dp[0][0][...] = base case进行状态转移for 状态1 in 状态1 所有值: for 状态2 in 状态2所有值: for ... dp[状态1][状态2][...]=求最值(选择1,选择2,...)主要分解的关键元素:状态,选择和dp数组的定义案例1:509. 斐波那契数方法1:建立备忘录函数:class Solution: def fib(self, n: int) ->...原创 2021-01-11 00:05:04 · 257 阅读 · 0 评论 -
算法3 滑动窗口
滑动窗口模板def sliding_window(s,t)://t为s子串 left,right = 0,0 //索引 valid = 0 window,need = {},{} s_len = len(s) for c in t: need[c] = need.get(c,0) +1 need_len = len(need) while right < s_len: c1 = s[right]原创 2020-12-22 23:25:18 · 114 阅读 · 0 评论 -
数据结构与算法2 单调栈
基础类型:讲解 Next Greater Number 的原始问题: 给你⼀个数组, 返回⼀个等⻓的数组, 对应索引存储着下⼀个更⼤元素, 如果没有更⼤的元素, 就存-1。不好⽤语⾔解释清楚, 直接上⼀个例⼦:给你⼀个数组 [2,1,2,4,3], 你返回数组 [4,2,4,-1,-1]。解释: 第⼀个 2 后⾯⽐ 2 ⼤的数是 4; 1 后⾯⽐ 1 ⼤的数是 2; 第⼆个 2 后⾯⽐ 2 ⼤的数是 4; 4 后⾯没有⽐ 4 ⼤的数, 填 -1; 3 后⾯没有⽐ 3 ⼤的数, 填-1。de原创 2020-12-06 23:51:29 · 61 阅读 · 0 评论 -
数据结构与算法1 前缀和技巧
基础类型1int subarraySum(int[] nums, int k) {int n = nums.length;// map: 前缀和 -> 该前缀和出现的次数HashMap<Integer, Integer>preSum = new HashMap<>();// base casepreSum.put(0, 1);int ans = 0, sum0_i = 0;for (int i = 0; i < n; i++) { sum原创 2020-12-01 00:13:44 · 96 阅读 · 0 评论