
算法
星辰的野望
这个作者很懒,什么都没留下…
展开
-
LSM-tree基本原理及应用
LSM-tree基本原理及应用LSM-tree是什么log-structed merge-tree日志结构的:系统日志是不会出错的,只需要在后面追加。所以日志结构就代指追加型结构。原理:把磁盘看做一个日志,在日志中存放永久性数据及其索引,每次都添加到日志的末尾。文件传输(存取)大多是顺序的,提高磁盘带宽利用率。LSM-tree是专门为key-value存储系统设计的,主要业务是查找和插入。LSM的特点是利用磁盘的顺序写,写入速度比随机写入的B-树更快。LSM-tree来自哪里Bigta原创 2022-05-16 11:10:07 · 2952 阅读 · 1 评论 -
矩阵连乘题解
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档矩阵连乘题目一、题目分析二、变量说明p数组2.读入数据总结题目计算一系列矩阵相乘所需要的最少步骤数。一、题目分析两个矩阵相乘的必要条件是第一个矩阵的列和第二个矩阵的行相同。假设第一个矩阵是pq,第二个矩阵是qr,那么所需要的计算步骤是pqr次。因此假设有n个矩阵,只需要n+1个空间就可以表征这些矩阵的性质。为了便于下标处理,矩阵从下标1开始。二、变量说明p数组代码如下(示例):import numpy as npimp原创 2021-06-07 23:56:15 · 606 阅读 · 0 评论 -
跳表+图的中心问题+快排与堆排
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档算法复习一、跳表二/图的中心问题三/快速排序和堆排序二、使用步骤1.引入库2.读入数据总结一、跳表定义:为一个值有序的链表建立多级索引,比如每2个节点提取一个节点到上一级,我们把抽出来的那一级叫做索引或索引层。其中down表示down指针,指向下一级节点。以此类推,对于节点数为n的链表,大约可以建立log2n-1级索引。像这种为链表建立多级索引的数据结构就称为跳表。查找方式:从最上面一层索引开始,假设寻找y,在第一层索引找到x和z原创 2021-06-07 23:49:35 · 300 阅读 · 1 评论 -
算法实验报告—DP
算法实验报告——DP最长公共子序列(LCS)题目代码运行结果计算矩阵连乘题目题目分析变量说明p数组dp【i】【j】核心思想分析代码运行结果凸多边形的最优三角划分题目最优子结构证明递推关系代码防卫导弹题目思路代码石子合并题目思路代码运行结果01背包问题思路其他的dp数组最长公共子序列(LCS)题目 一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=<x1, x2,…, xm>,则另一序列Z=<z1, z2,…, zk>是X的子序列是指存在一原创 2021-06-03 11:28:14 · 837 阅读 · 0 评论 -
算法实验报告2——贪心
算法实验报告2——贪心目录一、背包问题题目思路细节代码运行结果二、照亮的山景题目思路细节代码运行结果三、搬桌子问题题目思路细节代码运行结果四、八皇后问题题目思路细节代码运行结果目录一、背包问题题目有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。物品 A B C D E F G重量 35 30 60 50 40 10 25价值 10 40 30 50 35 40 30思路把所有物品的平均价值求出..原创 2021-05-20 18:04:25 · 2421 阅读 · 0 评论 -
素数测试
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档素数测试前言:两种高效的求mod方法一、(a*b)%n二、(a*b)%nMiller-Rabin测试前言:两种高效的求mod方法一、(a*b)%n代码如下:public long multiple(long a,long b,long n){ long ans = 0; while(b > 0){ if((b & 1) == 1){原创 2021-05-19 00:00:52 · 275 阅读 · 0 评论 -
算法实验报告(第k小的数+重数+棋盘覆盖问题)
算法实验报告1目录快速排序及第k小数思路代码运行结果重数题目思路代码运行结果棋盘覆盖问题题目思路代码运行结果目录快速排序及第k小数思路快速排序的性质:当一次排序完成后,左边元素一定比基准元素小,右边元素一定比基准元素大。因此选择第k个元素作为基准,设置左右两个哨兵,当哨兵相遇的时候证明这一趟排序已经完成,此时虽然基准左右是无序的,但是大小是已知的。代码package Algorithms_算法.实验;import java.util.Arrays;public class q..原创 2021-05-17 15:05:54 · 825 阅读 · 0 评论 -
并查集应用:敌人和朋友
package Algorithms_算法.作业.Friend_Enemy_并查集;public class UnionSet { private int []unions,enemy,rank; int[][] relations; char[] f_or_e; public UnionSet(int[][] relations, char[] f_or_e) { this.relations = relations; this.f_o原创 2021-05-09 11:24:34 · 363 阅读 · 0 评论 -
矩阵的LU分解和求逆
package Algorithms_算法.Class._Matrix;import java.util.Arrays;public class LU { double[][] matrix; double[][] expand_Matrix; double[][] reverse_matrix; double[][] l; double[][] u; public void initialize(double[][] matrix){原创 2021-04-22 16:47:16 · 968 阅读 · 0 评论 -
2021-4-12算法复习
二分搜索二分搜索的一种应用:求最大(最小值),可以建立一个检验函数,用x代表其中的值,返回解是否可行的boolean,然后在主函数中用左边界表示一定成立的解,右侧表示一定不可能的解,不断把中值代入方程检验,缩小范围,直到得出近似解。1.n根绳子能剪出k根最长多长的绳子。2.求牛舍给定情况下,两头牛之间的最大距离。3.求物品的最大平均价值。(wi,vi已知)主函数:public double solve(int n,int k,double[] ripes){ double lef原创 2021-04-12 22:06:33 · 91 阅读 · 0 评论 -
双指针消除重复数字
利用快排双色分区partition思想,O(N),O(1)维护两个指针,将数组分成三个区:[0 ... validRange]为有效区(全是有效数)(validRange ... curIndex)为垃圾区(全是垃圾数)[curIndex ...]为未知区(还没看的数)同时记录前一个数preNum和当前数出现次数count,遍历每个数,判断是否垃圾:当前数首次出现,有效数,发货到有效区,同时扩充有效区;当前数出现次数<2,有效数,发货到有效区,同时扩充有效区;当前数.转载 2021-04-06 23:29:52 · 148 阅读 · 0 评论 -
LIS
public class Solution { public int lengthOfLIS(int[] nums) { int[] len = new int[nums.length]; Arrays.fill(len, 1); int ans = 1; for(int i=1;i<len.length;i++){ for(int j=0;j<i;j++){ if(.原创 2021-04-04 20:24:26 · 133 阅读 · 0 评论 -
俄罗斯信封问题
给你一个二维整数数组 envelopes ,其中 envelopes[i] = [wi, hi] ,表示第 i 个信封的宽度和高度。当另一个信封的宽度和高度都比这个信封大的时候,这个信封就可以放进另一个信封里,如同俄罗斯套娃一样。请计算 最多能有多少个 信封能组成一组“俄罗斯套娃”信封(即可以把一个信封放到另一个信封里面)。注意:不允许旋转信封。package LeeCode._20210305_354_动态规划_二分查找;import java.util.ArrayList;im.原创 2021-04-04 20:23:43 · 272 阅读 · 0 评论 -
寻找中位数
给你两个有序的数组,求中位数双指针查找,每次把k减少一定的值,直到k=1,取两个指针的最小值。public class _decrease__k { public double findMedianSortedArrays(int[] nums1, int[] nums2) { int len1 = nums1.length; int len2 = nums2.length; int left = (len1 + len2 + 1)..转载 2021-04-04 20:13:43 · 962 阅读 · 0 评论 -
排序时间复杂度+快排的小改进
排序时间复杂度 排序方法 平均情况 最好情况 最坏情况 空间 稳定性 冒泡排序 O(n^2) O(n) O(n^2) O(1) 稳定 选择排序 O(n^2) O(n^2). O(n^2) O(1) 不稳定 插入排序 O(n^2) O(n) O(n^2) O(1) 稳定转载 2021-03-27 10:58:44 · 283 阅读 · 0 评论 -
快速排序_查找第k小元素
快速排序_查找第k小元素以下代码可以从数组a[]中找出第k小的元素。它使用了类似快速排序中的分治算法,期望时间复杂度是O(N)的。请仔细阅读分析源码,填写划线部分缺失的内容。一个问题,快排你的开始位置不一定就是你最后i = j的位置,无法确定第一次定下来的元素是哪一个。所以只能判断当前定下来的元素和k的关系,如果定下来的i在k的左边,那就从i+1到r进行快排,寻找第k-i大的元素(左边的都比i小,i号元素又比k号元素小,所以是k-i)如果定下来的在k的右边,那就从l到i-1找第k大..转载 2021-03-27 10:40:45 · 1740 阅读 · 0 评论 -
【有界数组中指定下标处的最大值】(233周赛)(2)
思路首先理解题目给出的规则1.数组长度 n每个元素最小是 1相邻的元素只能 +1 或 -1整个数组的和不超过 maxSum求第 index 位置的值最大是几2.也就是说一开始都是 1把 index 的值提高,两侧的值跟随这增高不断提升 index 的值,受牵连的元素越来越多最终,形成一座山峰3.画完图发现如果给我 nums[index] 想要的值 x ,数组的长度 n ,和 index我可以求出数组的和 sum并且 sum 会随着 x 变大而增大所以我决定使用二分转载 2021-03-26 22:44:10 · 197 阅读 · 0 评论 -
特殊数组下标最大值(233周赛)(1)
给你三个正整数 n、index 和 maxSum 。你需要构造一个同时满足下述所有条件的数组 nums(下标 从 0 开始 计数):nums.length == nnums[i] 是 正整数 ,其中 0 <= i < nabs(nums[i] - nums[i+1]) <= 1 ,其中 0 <= i < n-1nums 中所有元素之和不超过 maxSumnums[index] 的值被 最大化返回你所构造的数组中的 nums[index] 。注意:abs(x).转载 2021-03-26 22:39:06 · 276 阅读 · 0 评论 -
积压订单数量(233周赛)()
给你一个二维整数数组 orders ,其中每个 orders[i] = [pricei, amounti, orderTypei] 表示有 amounti 笔类型为orderTypei 、价格为pricei 的订单。订单类型 orderTypei 可以分为两种:0 表示这是一批采购订单 buy1 表示这是一批销售订单 sell注意,orders[i] 表示一批共计 amounti 笔的独立订单,这些订单的价格和类型相同。对于所有有效的 i ,由 orders[i] 表示的所有订单提交时间均...转载 2021-03-26 15:17:44 · 320 阅读 · 0 评论 -
记忆化搜索(48双周赛)()
给你nums,它是一个大小为2 * n的正整数数组。你必须对这个数组执行 n次操作。在第i次操作时(操作编号从 1开始),你需要:选择两个元素x 和y。获得分数i * gcd(x, y)。将x和y 从nums中删除。请你返回 n次操作后你能获得的分数和最大为多少。函数gcd(x, y)是x 和y的最大公约数。本题要求分数和的最大值,最直接想到的就是暴力枚举所有的情况,但是如果只是这样,必然会超时。因为只是单纯的暴力枚举,会有很...转载 2021-03-26 15:14:41 · 198 阅读 · 0 评论 -
能构造出连续值的最大数目(48双周赛)
题目:给一个nums数组,请返回从0开始(包括0),你最多能构造出多少个连续整数。提示 1假设数组中若干个元素可以构造出 [0, x][0,x] 范围内的所有整数。如果此时我们再多选择一个元素 yy,那么这些元素可以构造出 [0, x][0,x] 以及 [y, y+x][y,y+x] 范围内的所有整数。提示 2如果我们希望这个多选择的元素 yy 使得答案变得更大,那么区间 [0, x][0,x] 和 [y, y+x][y,y+x] 需要满足什么要求?思路与算法...转载 2021-03-26 15:12:29 · 230 阅读 · 0 评论 -
好子数组(232周赛)()
题目;给你一个整数数组nums(下标从 0 开始)和一个整数k。一个子数组 (i, j)的 分数定义为min( nums[i], nums[i+1], ..., nums[j] ) * (j - i + 1)。一个好子数组的两个端点下标需要满足i <= k <= j。请返回 好子数组的最大可能 分数。思路:区间的左端点即为「i 左侧最近的那个严格大于 nums[i] 的元素下标的后一个位置」右端点即为「i 右侧最近的那个严格大于nums[i] 的...转载 2021-03-26 15:03:48 · 452 阅读 · 0 评论 -
最大平均通过率(232周赛)
题目:一所学校里有一些班级,每个班级里有一些学生,现在每个班都会进行一场期末考试。给你一个二维数组 classes,其中classes[i] = [passi, totali],表示你提前知道了第i个班级总共有totali个学生,其中只有passi个学生可以通过考试。给你一个整数extraStudents,表示额外有extraStudents个聪明的学生,他们 一定能通过任何班级的期末考。你需要给这extraStudents个学生每人都安排一个班级,使得 所有班级...转载 2021-03-26 14:38:18 · 222 阅读 · 0 评论 -
星星图中心结点(232周赛)
题目:有一个无向的 星型 图,由 n 个编号从 1 到 n 的节点组成。星型图有一个 中心 节点,并且恰有 n - 1 条边将中心节点与其他每个节点连接起来。给你一个二维整数数组 edges ,其中edges[i] = [ui, vi] 表示在节点 ui 和 vi 之间存在一条边。请你找出并返回edges 所表示星型图的中心节点。思路:n个点只有n-1条边,没有一条多余的,所以中心节点必须出现n-1次,即每条边都有中心节点class Solution { public int ..原创 2021-03-26 14:31:21 · 160 阅读 · 0 评论 -
异或+动态规划(4)(231周赛)
题目:返回数组中要更改的最小元素数,以使所有长度为k的区间异或结果等于零。【left,right】的异或结果就是从left到right所有数的异或。const int INF = 0x3f3f3f3f;class Solution {public: int minChanges(vector<int>& nums, int k) { int n = nums.size(); vector<unordered_map&...转载 2021-03-26 14:25:20 · 231 阅读 · 0 评论 -
受限路径的长度(231周赛)
//题目://返回从节点 1 出发到节点 n 的 受限路径数 。//路径的距离定义:这条路径上所有边的权重总和。//用 distanceToLastNode(x) 表示节点 n 和 x 之间路径的最短距离。//受限路径:满足 distanceToLastNode(zi) > distanceToLastNode(zi+1) 的一条路径,//其中 0 <= i <= k-1 。//题意分析;// 问题1. 找到每个点的最短路径distance// .转载 2021-03-26 14:18:04 · 336 阅读 · 0 评论 -
删除链表重复元素(一题三解)
删除链表重复元素(一题三解)一、迭代法public ListNode recursion_deleteDuplicates(ListNode head){ ListNode dummy = new ListNode(); dummy.next = head;//不加哑节点的话,就要用注释里那条,我没看懂 if(head == null){//当前遍历到头了 return null; }else if(head.原创 2021-03-26 13:10:34 · 175 阅读 · 0 评论 -
统计点对数目+容斥原理(47双周赛)
统计点对数目(容斥原理)题目:给你一个无向图,无向图由整数n,表示图中节点的数目,和edges组成,其中edges[i] = [ui, vi]表示ui 和vi之间有一条无向边。同时给你一个代表查询的整数数组queries。第 j 个查询的答案是满足如下条件的点对 (a, b) 的数目:1.a < b2.cnt是与 a或者b相连的边的数目,且 cnt严格大于queries[j]。请你返回一个数组answers,其中answers.lengt...转载 2021-03-25 23:11:25 · 224 阅读 · 0 评论 -
贪心算法+滑动窗口(47双周赛)
贪心算法+滑动窗口题目:一个字符串的 美丽值定义为:出现频率最高字符与出现频率最低字符的出现次数之差。比方说,"abaacc"的美丽值为3 - 1 = 2。给你一个字符串s,请你返回它所有子字符串的美丽值之和c++实现class Solution {public: int beautySum(string s) { int n = s.size(), sum = 0; for(int len = 2; len <=...转载 2021-03-25 22:02:56 · 368 阅读 · 0 评论 -
单调栈
解题思路今天这个题目很有意思,个人认为难度在中上。虽然题目的 n 的范围是 15000,但是我测试了 O(N^2)O(N 2 ) 复杂度的代码也不会超时。题目要找 132 模式的组合,也就是对于 i < j < ki<j<k 有 nums[i] < nums[k] < nums[j]nums[i]<nums[k]<nums[j]。下面我写了两种方法,方法一比较暴力,方法二使用「单调栈」。方法一:使用暴力维护 3这个方法就是 O(N^2)O(N 2 )转载 2021-03-24 23:56:18 · 138 阅读 · 0 评论 -
扁平化嵌套列表迭代器
LeeCode341. 扁平化嵌套列表迭代器一、题目二、代码一、题目本题定义了一个类 NestedInteger ,这个类可以存储 int 或 List ;所以称它是一个「嵌套列表」。类似于一棵多叉树,每个节点都可以有很多子节点。它有三个方法:isInteger() ,判断当前存储的对象是否为 int;getInteger() , 如果当前存储的元素是 int 型的,那么返回当前的结果 int,否则调用会失败;getList() .转载 2021-03-23 23:44:45 · 185 阅读 · 0 评论 -
实现HashMap
LeeCode复习.706 实现HashMap一、题目二、代码一、题目不使用任何内建的哈希表库设计一个哈希映射(HashMap)。1.MyHashMap() 用空映射初始化对象2.void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。3.int get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。.原创 2021-03-22 09:47:35 · 276 阅读 · 0 评论 -
螺旋矩阵应用
LeeCode复习-螺旋矩阵一、题目1.给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。2.给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。二、解题1.思路暴力寻找下标的边界吧,多试几次,记住转角不要重复打印,还有如果只剩一行/一列的时候要单独考虑。2.代码54public List<Integer> spiralOrder(int[][] m原创 2021-03-22 09:43:02 · 224 阅读 · 0 评论 -
统计子序列个数
LeeCode复习-115-统计子序列个数一、题目给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。例如,"ACE"是"ABCDE"的一个子序列,而"AEC"不是)题目数据保证答案符合 32 位带符号整数范围。二、解题1.思路我一开始的想法是,设dp[i][j] 是以 i为母串,j为子串的符合条件的串的个数。题解:dp[i][j] 是母串s从i到末尾的子串,原创 2021-03-22 09:37:14 · 1922 阅读 · 0 评论 -
翻转链表多解
Leecode每日一题.92 翻转范围内的链表一、题目二、解题思路总结一、题目对于单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。二、解题思路利用栈来把要反转的结点入栈,最后按序出栈就是翻转的顺序,前提是要保存反转链表的前一个和后一个节点。代码如下:import java.util.Stack;public class Stack_ { .原创 2021-03-22 09:22:50 · 128 阅读 · 0 评论 -
Master Theorem
首先搞清楚,有很多的递推,时间复杂度相应的有一个递推公式,用眼睛看这个公式去猜比较麻烦,例如:所以,需要主定律来根递推公式的系数来推出T(n)到底是何方神圣。 首先我们看递推公式: 说通俗一点,很直接的给了公式,看一下推导过程:Work是工作,每次迭代做一次,所以复杂度等于每一层的复杂度乘以迭代次数,总数为n每次分成a个小的问题,一共分b次,每一次的额外复杂度(n/b)d,化简得到。(因为每次分层可能会舍弃一些分...原创 2021-03-21 23:56:44 · 232 阅读 · 0 评论 -
下一个更大元素(单调栈)
题目:每日一题503. 下一个更大元素 II提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、题目二、解题思路前言LeeCode关于单调栈的应用提示:以下是本篇文章正文内容,下面案例可供参考一、题目给定一个循环数组(最后一个元素的下一个元素是数组的第一个元素),输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1。来源:力扣(L原创 2021-03-06 16:28:23 · 270 阅读 · 0 评论