数据结构与算法
戎梓漩
这个作者很懒,什么都没留下…
展开
-
floyd算法三重循环的顺序为什么不能改
那么i、j间的最短距离为经过不经过k点和经过k点的最小值,其中不经过k点的最短距离为dp[k - 1][i][j],经过k点的最短距离为dp[k - 1][i][k] + dp[]k - 1[k][j]。设dp[k][i][j]表示:点i、点j之间,经过的点的编号不超过k的最短距离。i点和j点之间的最短距离为dp[n][i][j]。floyd算法的本质是动态规划算法。设一共有1-n个点。原创 2023-04-10 21:38:48 · 509 阅读 · 1 评论 -
最长公共子序列问题(LCS)求解
对于 dp[i][j],如果 s[i-1] 和 t[j-1] 相等,则 dp[i][j] = dp[i-1][j-1] + 1;否则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。最后,dp[len(s)][len(t)] 就是 s 和 t 的最长公共子序列的长度。否则比较 dp[i-1][j] 和 dp[i][j-1],如果 dp[i-1][j] 大于 dp[i][j-1],则说明最长公共子序列中不包含 s[i-1],将 i 减 1;重复这个过程直到 i 或 j 为 0。原创 2023-03-28 23:23:51 · 219 阅读 · 0 评论 -
最长上升子序列问题(LIS)求解
例如,对于序列 [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5],最长的单调递增子序列为 [1, 2, 3, 5, 5],长度为 5。LIS(Longest Increasing Subsequence)问题是指给定一个序列,求其中最长的单调递增子序列的长度。LIS 问题可以使用动态规划算法解决,时间复杂度为。,也可以使用二分查找算法优化时间复杂度至。原创 2023-03-26 00:03:39 · 142 阅读 · 0 评论 -
python树状数组模板
【代码】python树状数组模板。原创 2023-03-25 02:04:25 · 94 阅读 · 0 评论 -
巧解异或操作的逆运算——位运算结合律
异或操作原创 2022-10-10 12:01:31 · 644 阅读 · 0 评论 -
python数组按照频率(哈希表)排列
排列原创 2022-09-19 18:32:51 · 597 阅读 · 0 评论 -
并查集的应用
并查集在leetcode中原创 2022-07-30 11:25:18 · 175 阅读 · 0 评论 -
字典树python模板
字典树通用python模板原创 2022-07-07 12:08:48 · 230 阅读 · 0 评论 -
广度优先搜索、dijkstra算法与A*启发式搜索
利用广度优先搜索、dijkstra路径搜索算法、A*启发式搜索算法解决leetcode中的题目原创 2022-06-05 16:26:27 · 346 阅读 · 0 评论 -
约瑟夫环问题
问题描述:共有 n 名小伙伴一起做游戏。小伙伴们围成一圈,按 顺时针顺序 从 1 到 n 编号。确切地说,从第 i 名小伙伴顺时针移动一位会到达第 (i+1) 名小伙伴的位置,其中 1 <= i < n ,从第 n 名小伙伴顺时针移动一位会回到第 1 名小伙伴的位置。游戏遵循如下规则:从第 1 名小伙伴所在位置 开始 。沿着顺时针方向数 k 名小伙伴,计数时需要 包含 起始时的那位小伙伴。逐个绕圈进行计数,一些小伙伴可能会被数过不止一次。你数到的最后一名小伙伴需要离开圈子,并视作输掉游原创 2022-05-04 14:57:59 · 109 阅读 · 0 评论 -
拒绝采样算法
leetcode:470.用Rand7()实现Rand10()题目:已有方法 rand7 可生成 1 到 7 范围内的均匀随机整数,试写一个方法 rand10 生成 1 到 10 范围内的均匀随机整数。不要使用系统的 Math.random() 方法解法:class Solution: def rand10(self): """ :rtype: int """ # 方法一:拒绝采样 # 时间复杂度:O(1)原创 2022-05-04 11:34:51 · 473 阅读 · 0 评论 -
凸包算法-流程及代码简述
leetcode:587.安装栅栏凸包算法:给定N个点,包围这N个点的最小面积的多边形为凸包,找到这N个点中在凸包上的点。一、暴力法时间复杂度:O(n^3)空间复杂度:二、方法二:Javis算法时间复杂度:O(n^2)空间复杂度:O(n)class Solution: def outerTrees(self, trees: List[List[int]]) -> List[List[int]]: def cross(x, y, z): # 求外积原创 2022-05-02 09:58:31 · 983 阅读 · 0 评论 -
水塘抽样算法在leetcode中的应用
一、水塘抽样算法二、应用1、382.链表随机节点382.链表随机结点给你一个单链表,随机选择链表的一个节点,并返回相应的节点值。每个节点 被选中的概率一样 。实现 Solution 类:Solution(ListNode head) 使用整数数组初始化对象。int getRandom() 从链表中随机选择一个节点并返回该节点的值。链表中所有节点被选中的概率相等。 示例:输入["Solution", "getRandom", "getRandom", "getRandom", "原创 2022-04-25 12:27:06 · 178 阅读 · 0 评论 -
有符号位移(<<、>>)与无符号位移(>>>)
一、区别无符号右移:正负数在最高位均补0,有符号右移:正数的最高位补0,负数的最高位补1二、示例1、正数正数的有符号右移与无符号位移结果相同以正整数10为例,其二进制表示:0000 0000 0000 0000 0000 0000 0000 10101.1、有符号右移(>>)有符号位移的最高位补0。10的二进制表示:0000 0000 0000 0000 0000 0000 0000 1010,10右移一位为:0000 0000 0000 0000 0000 0000原创 2021-10-02 21:59:08 · 1398 阅读 · 0 评论 -
广度优先搜索bfs记录节点层数,以二叉树为例
方法一:记录每一层节点的个数def bfs(root): queue = [root] while queue: n = len(queue) for i in range(n): node = queue.pop(0) if node.left: queue.append(node.left) if node.right: queue.append(node.right)方法二:记录每个节点的层数queue = [(root, 0)]while原创 2021-06-25 22:13:28 · 1033 阅读 · 0 评论 -
位运算n&(n-1)的用处
一、是否是2的幂题目:leetcode 231.2的幂n&(n-1)会把最低位的1变为0,当n&(n-1) == 0 且n !=0时,说明n的二进制表示中有且只有一个1代码如下:return n&(n-1) == 0 and n !=0二、二进制中1的个数题目:leetcode 剑指offer 15.二进制中1的个数代码:res = 0while n: n &= n-1 res += 1return res ...原创 2021-06-23 18:55:42 · 182 阅读 · 2 评论