算法和数据结构体系
算法和数据结构——基础的补充和提升!!!
爱敲代码的Harrison
种一棵树最好的时间是十年前,其次是现在。
展开
-
与哈希函数有关的结构
哈希碰撞:输入域可以无穷大,输出域相对有限,所以势必会有两个不同的输入域对应同一个输出域。哈希表的设计一致性哈希解决的就是增加或者减少机器让它的数据迁移不是全量的,而且还能做到负载均衡.........原创 2022-05-26 10:10:59 · 126 阅读 · 0 评论 -
网络最大流算法
package com.harrison.class35;/** * @author Harrison * @create 2022-04-16-22:20 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 本题测试链接:// https://lightoj.com/problem/internet-bandwidth// 这是一道DinicAlgorithm算法的题// 把如下代码粘贴进网页所提供的java编译器环境中// 不需要修改任何内容可以直接通过原创 2022-04-16 22:23:35 · 278 阅读 · 2 评论 -
动态规划猜法中和外部信息简化练习(4)
package com.harrison.class34;/** * @author Harrison * @create 2022-04-16-20:13 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 整型数组arr长度为n(3 <= n <= 10^4),最初每个数字是<=200的正数且满足如下条件:// 1. 0位置的要求:arr[0]<=arr[1]// 2. n-1位置的要求:arr[n-1]<=arr[n-2]//原创 2022-04-16 21:44:02 · 428 阅读 · 0 评论 -
奇怪的打印机
力扣链接奇怪的打印机代码package com.harrison.class34;/** * @author Harrison * @create 2022-04-16-10:51 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 本题测试链接 : https://leetcode.com/problems/strange-printer/public class Code06_StrangePrinter { public static int s原创 2022-04-16 11:20:13 · 413 阅读 · 0 评论 -
哈夫曼树,
package com.harrison.class34;/** * @author Harrison * @create 2022-04-15-14:42 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */import java.util.Comparator;import java.util.HashMap;import java.util.Map.Entry;import java.util.PriorityQueue;// 本文件不牵扯任何byte类型的转原创 2022-04-15 14:43:26 · 134 阅读 · 0 评论 -
子数组长度不超过M的最大累加和
题目package com.harrison.class34;/** * @author Harrison * @create 2022-04-15-14:19 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */import java.util.LinkedList;// 给定一个数组arr,和一个正数M// 返回在子数组长度不大于M的情况下,最大的子数组累加和public class Code04_MaxSumLengthNoMore { // O原创 2022-04-15 14:22:26 · 808 阅读 · 0 评论 -
*动态规划猜法中和外部信息简化练习(3)
package com.harrison.class34;/** * @author Harrison * @create 2022-04-15-13:54 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 如果一个字符相邻的位置没有相同字符,那么这个位置的字符出现不能被消掉// 比如:"ab",其中a和b都不能被消掉// 如果一个字符相邻的位置有相同字符,就可以一起消掉// 比如:"abbbc",中间一串的b是可以被消掉的,消除之后剩下"ac"// 某些字原创 2022-04-15 14:06:27 · 86 阅读 · 0 评论 -
动态规划猜法中和外部信息简化练习(2)——移除盒子
力扣链接移除盒子代码package com.harrison.class34;/** * @author Harrison * @create 2022-04-15-13:37 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 本题测试链接 : https://leetcode.com/problems/remove-boxes/public class Code02_RemoveBoxes { // arr[L...R]消除,而且前面跟着K个ar原创 2022-04-15 14:02:53 · 271 阅读 · 0 评论 -
动态规划猜法中和外部信息简化练习(1)——戳气球
题目package com.harrison.class34;/** * @author Harrison * @create 2022-04-15-13:36 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 本题测试链接 : https://leetcode.com/problems/burst-balloons/public class Code01_BurstBalloons { public static int maxCoins0(int原创 2022-04-15 13:59:05 · 516 阅读 · 0 评论 -
DC3算法练习(4)
题目代码package com.harrison.class33;/** * @author Harrison * @create 2022-04-15-13:13 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code04_LongestCommonSubstringConquerByHeight { public static int lcs1(String s1, String s2) { if (s1 ==原创 2022-04-15 13:15:21 · 113 阅读 · 0 评论 -
DC3算法练习(3)
题目力扣链接拼接最大数代码package com.harrison.class33;/** * @author Harrison * @create 2022-04-15-13:05 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 测试链接: https://leetcode.com/problems/create-maximum-number/public class Code03_CreateMaximumNumber { public s原创 2022-04-15 13:11:00 · 302 阅读 · 0 评论 -
DC3算法练习(2)
题目代码package com.harrison.class33;/** * @author Harrison * @create 2022-04-15-13:00 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code02_InsertS2MakeMostAlphabeticalOrder { // 暴力方法 public static String right(String s1, String s2) {原创 2022-04-15 13:03:30 · 193 阅读 · 0 评论 -
DC3生成后缀数组练习(1)——按字典序排在最后的子串
力扣链接:按字典序排在最后的子串package com.harrison.class33;/** * @author Harrison * @create 2022-04-15-12:25 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code01_LastSubstringInLexicographicalOrder { public static String lastSubstring(String s){ if原创 2022-04-15 12:32:36 · 251 阅读 · 0 评论 -
DC3算法生成后缀数组
package com.harrison.class33;/** * @author Harrison * @create 2022-04-13-16:00 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// 生成后缀数组的暴力方法时间复杂度:O(N^2*logN)// 而DC3算法生成后缀数组的时间复杂度仅O(N)// 为啥叫DC3?因为是根据下标模3来取得public class DC3 { // 下标代表名次,值代表原数组的位置 // 不会原创 2022-04-15 12:18:12 · 458 阅读 · 0 评论 -
状态压缩的动态规划——铺砖问题
题目你有无限的12的砖块, 要铺满MN的区域,不同的铺法有多少种?package com.harrison.class32;/** * @author Harrison * @create 2022-04-13-14:10 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code03_PavingTile { /* * 2*M铺地的问题非常简单,这个是解决N*M铺地的问题 */ public static原创 2022-04-13 15:58:38 · 461 阅读 · 0 评论 -
状态压缩的动态规划——TSP问题
题目TSP问题,潜台词:任何一个城市出发都一样,其实是个无向图,但是无向图可以理解为互相有方向的有向图!暴力过程存在大量重复解做到记忆化搜索就可以了,本来可变参数的复杂程度超出整型范围就是挺难了,这种题也比较少。这种题的可变参数就是线性结构,表示某个数字存在或者不存在,即非黑即白;可以用位信息来表示线性结构。但是,TSP问题比这还要复杂,每一个位信息上表达的信息并不是非黑即白的;每一个位信息上的信息是某一个范围上的数字!!!。所以做到记忆化搜索就可以了。。。package com.harri原创 2022-04-13 10:43:20 · 1024 阅读 · 0 评论 -
状态压缩的动态规划——CanIWin
题目在 “100 game” 这个游戏中,两名玩家轮流选择从 1 到 10 的任意整数,累计整数和,先使得累计整数和 达到或超过 100 的玩家,即为胜者。如果我们将游戏规则改为 “玩家 不能 重复使用整数” 呢?例如,两个玩家可以轮流从公共整数池中抽取从 1 到 15 的整数(不放回),直到累计整数和 >= 100。给定两个整数 maxChoosableInteger (整数池中可选择的最大数)和 desiredTotal(累计和),若先出手的玩家是否能稳赢则返回 true ,否则返回 f原创 2022-04-13 08:50:05 · 2212 阅读 · 0 评论 -
四边形不等式技巧——K蛋问题(鸡蛋掉落问题)
题目力扣原题链接鸡蛋掉落四边形不等式技巧注意点任何一个普遍位置依赖情况第0行第0列和第1行第1列填写情况代码package com.harrison.class31;/** * @author Harrison * @create 2022-04-12-9:20 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */// leetcode测试链接:https://leetcode.com/problems/super-egg-drop// 方法1和方法原创 2022-04-12 14:27:30 · 329 阅读 · 0 评论 -
四边形不等式技巧——邮局选址问题
题目一条直线上有居民点,邮局只能建在居民点上。给定一个有序正数数组arr,每个值表示居民点的一维坐标,再给定一一个正数num,表示邮局数量。选择num个居民点,建立num个邮局,使所有的居民点到最近邮局的总距离最短,返回最短的总距离。【举例】arr=[1,2,3,4,5,1000],num=2。第一个邮局建立在3位置,第二个邮局建立在1000位置。那么1位置到邮局的距离为2,2位置到邮局距离为1,3位置到邮局的距离为0,4位置到邮局的距离为1,5位置到邮局的距离为2,1000 位置到邮局的距离原创 2022-04-12 09:12:11 · 551 阅读 · 0 评论 -
四边形不等式技巧——分割数组的最大值(画家问题)
题目给定一个整型数组arr,数组中的每个值都为正数,表示完成一幅画作需要的时间,再给定一个整数num,表示画匠的数量,每个画匠只能画连在一起的画作。所有的画家并行工作,请返回完成所有的画作需要的最少时间。【举例】arr=[3,1,4],num=2最好的分配方式为第一个画匠画3和1,所需时间为4。第二个画匠画4,所需时间为4。因为并行工作,所以最少时间为4。如果分配方式为第一个画匠画3,所需时间为3。第二个画匠画1和4,所需的时间为5。那么最少时间为5,显然没有第一种分配方式好。所以返回4。arr=原创 2022-04-11 17:01:54 · 451 阅读 · 0 评论 -
四边形不等式技巧——合并石子问题
四边形不等式四边形不等式技巧特征两个可变参数的区间划分问题每个格子有枚举行为当两个可变参数固定一一个,另一个参数和答案之间存在单调性关系而且往往是反向单调关系枚举加速的位置对:上+右,或者,左+下不要证明!用对数器验证!!!可以把时间复杂度降低一阶题目摆放着n堆石子,现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。求出将n堆石子合并成一堆的最小得分(或最大得分)合并方案。package com.harrison.cla原创 2022-04-11 11:01:56 · 244 阅读 · 0 评论 -
区间划分问题中的划分点不回退现象(2)
题目给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分。每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少?整个过程要求时间复杂度O(N)在上面的基础上,求每一个位置的最优划分。package com.harrison.class31;/** * @author Harrison * @create 2022-04-11-8:57 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。原创 2022-04-11 09:16:57 · 241 阅读 · 0 评论 -
区间划分问题中的划分点不回退现象(1)
题目给定一个非负数组arr,长度为N,那么有N-1种方案可以把arr切成左右两部分。每一种方案都有,min{左部分累加和,右部分累加和},求这么多方案中,min{左部分累加和,右部分累加和}的最大值是多少?整个过程要求时间复杂度O(N)package com.harrison.class31;/** * @author Harrison * @create 2022-04-11-8:37 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Cod原创 2022-04-11 08:55:31 · 193 阅读 · 0 评论 -
卡特兰数应用——二叉树的组成方式
package com.harrison.class30;/** * @author Harrison * @create 2022-04-09-21:42 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code01_DifferentBTNum { // k(0) = 1, k(1) = 1//// k(n) = k(0) * k(n - 1) + k(1) * k(n - 2) + ... + k(n - 2) * k(1) +原创 2022-04-09 21:43:54 · 1089 阅读 · 0 评论 -
PrintStar
题目package com.harrison.class29;/** * @author Harrison * @create 2022-04-09-21:39 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code04_PrintStar { public static void printStar(int N) { int leftUp = 0; int rightDown = N - 1;原创 2022-04-09 21:41:07 · 378 阅读 · 0 评论 -
之字形打印矩阵——ZigZagPrintMatrix
package com.harrison.class29;/** * @author Harrison * @create 2022-04-09-21:27 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code03_ZigZagPrintMatrix { public static void printMatrixZigZag(int[][] matrix) { int tR = 0; int tC =原创 2022-04-09 21:39:26 · 393 阅读 · 0 评论 -
打印螺旋矩阵
package com.harrison.class29;/** * @author Harrison * @create 2022-04-09-21:02 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code02_PrintMatrixSpiralOrder { public static void spiralOrderPrint(int[][] matrix) { int tR = 0; int原创 2022-04-09 21:26:43 · 276 阅读 · 0 评论 -
矩阵旋转,
题目package com.harrison.class28;/** * @author Harrison * @create 2022-04-09-16:22 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code05_RotateMatrix { public static void rotate(int[][] m){ int a=0; int b=0; int c=m.leng原创 2022-04-09 16:33:19 · 343 阅读 · 0 评论 -
子数组累加和长度问题(3)升级版本
题目给定一个数组arr,给定一个值v,求子数组平均值小于等于v的最长子数组长度。package com.harrison.class28;import java.util.TreeMap;/** * @author Harrison * @create 2022-04-09-15:30 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code04_AvgLessEqualValueLongestSubarray { // 暴力解,原创 2022-04-09 15:43:39 · 156 阅读 · 0 评论 -
子数组累加和长度问题(3)
题目给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到 arr 的所有子数组里,哪个子数组的累加和<=K,并且是长度最大的,返回其长度。package com.harrison.class28;/** * @author Harrison * @create 2022-04-09-12:56 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code03_LongestLessSumSubArrayLeng原创 2022-04-09 15:08:42 · 192 阅读 · 0 评论 -
子数组累加和长度问题(2)
题目给定一个整数组成的无序数组arr,值可能正、可能负、可能0。给定一个整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的。返回其长度这个题无法用滑动窗口,因为没有单调性。数组种存在负数,所以,数组长度越长,有可能累加和会变小;当数组长度变小的时候,累加和有可能会变大。package com.harrison.class28;import java.util.HashMap;/** * @author Harrison * @create 2022-04-09-原创 2022-04-09 12:54:11 · 343 阅读 · 0 评论 -
子数组累加和长度问题(1)
题目给定一个正整数组成的无序数组arr,给定一个正整数值K,找到arr的所有子数组里,哪个子数组的累加和等于K,并且是长度最大的,返回其长度。package com.harrison.class28;/** * @author Harrison * @create 2022-04-09-10:32 * @motto 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。 */public class Code01_LongestSumSubArrayLengthInPositiveArray {原创 2022-04-09 10:48:07 · 354 阅读 · 0 评论 -
卡特兰数及其应用
前言A和B是两个毫不相关的集合,但是集合的个数可数。只要能找到某一个映射 f ,让A集合里的一个样本x只对应B集合里的一个样本y;同时能找到一个映射g,让B里的某一个样本只对应A里的某一个样本。其中,f,g,A,B毫无关系,可以得到A的集合数量等于B的集合数量。卡特兰数卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。其前几项为:1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 2原创 2022-04-08 23:49:16 · 1682 阅读 · 0 评论 -
根据数据量猜解法(3),经典分治法
题目牛牛家里一共有n袋零食,第 i 袋零食体积为 v[ ],背包容量为W。牛牛想知道在总体积不超过背包容量的情况下,一共有多少种零食放法。体积为 0 也算一种放法。1<=n<=30,1<=W<=2*10^9v [ i ] ( 0 <= v[ i ] <= 10^9 )牛客在线测试链接:牛牛的背包问题package com.harrison.class27;/** * @author Harrison * @create 2022-04-08-10:5原创 2022-04-08 15:17:25 · 191 阅读 · 1 评论 -
根据数据量猜解法(2)
题目给定一个非负数组arr,和一个正数m。返回arr的所有子序列中累加和%m之后的最大值。根据数据状况猜解法、以及分治面试中的分治的应用场景:数据量整体做尝试可能性太多了,跑不完数据分成多个块(常见是两块)之后,各自的可能性并不算多合并多个块各自信息的整合过程不复杂package com.harrison.class27;import java.util.TreeSet;/** * @author Harrison * @create 2022-04-08-9:20 * @m原创 2022-04-08 11:12:12 · 340 阅读 · 0 评论 -
根据数据量猜解法(1)
题目int [ ] d,d [ i ]:i 号怪兽的能力int [ ] p,p [ i ]:i 号怪兽要求的钱开始时你的能力是0,你的目标是从0号怪兽开始,通过所有的怪兽。如果你当前的能力,小于 i 号怪兽的能力,你必须付出 p [ i ] 的钱,贿赂这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上;如果你当前的能力,大于等于 i 号怪兽的能力,你可以选择直接通过,你的能力并不会下降,你也可以选择贿赂这个怪兽,然后怪兽就会加入你,他的能力直接累加到你的能力上。返回通过所有的怪兽,需要花的原创 2022-04-07 23:42:13 · 194 阅读 · 0 评论 -
根据对数器找规律(3)
题目定义一种数:可以表示成若干(数量>1)连续正数和的数。比如:5 = 2+3, 5就是这样的数;12 = 3+4+5, 12就是这样的数;1不是这样的数,因为要求数量大于1个、连续正数和。2 = 1 + 1,2也不是,因为等号右边不是连续正数。给定一个参数N,返回是不是可以表示成若干连续正数和的数。对数器找规律总结某个面试题,输入参数类型简单,并且只有一个实际参数要求的返回值类型也简单,并且只有一个用暴力方法,把输入参数对应的返回值,打印出来看看,进而优化code代码packa原创 2022-04-07 18:28:16 · 355 阅读 · 0 评论 -
根据对数器找规律(2)
题目给定一个正整数N,表示有N份青草,统一堆放在仓库里。有一只牛和一只羊,牛先吃,羊后吃,它俩轮流吃草,不管是牛还是羊,每一轮能吃的草量必须是:1,4,16,64…(4的某次方)。谁最先把草吃完,谁获胜。假设牛和羊都绝顶聪明,都想赢,都会做出理性的决定。根据唯一的参数N,返回谁会赢。暴力解决// 如果n份草,最终先手赢,返回"先手" // 如果n份草,最终后手赢,返回"后手" public static String whoWin(int n){ if(n<5)原创 2022-04-07 15:28:11 · 142 阅读 · 1 评论 -
根据对数器找规律(1)
题目小虎去买苹果,商店只提供两种类型的塑料袋,每种类型都有任意数量。能装下6个苹果的袋子能装下8个苹果的袋子小虎可以自由使用两种袋子来装苹果,但是小虎有强迫症,他要求自己使用的袋子数量必须最少,且使用的每个袋子必须装满。给定一个正整数N,返回至少使用多少袋子。如果N无法让使用的每个袋子必须装满,返回-1暴力解先用暴力方法解决这个问题public static int minBags(int apple) { if (apple < 0) {原创 2022-04-07 14:46:42 · 176 阅读 · 0 评论 -
有序表改写练习——实现特定要求的结构
想要实现这样的结构,给用户表现得像数组一样,但是要求:在任何一个位置加入一个数的时候,时间复杂度做到O(LogN)在任何一个位置删除一个数的时候,时间复杂度做到O(LogN)读取任何一个位置的数的时候,时间复杂度做到O(LogN)package com.harrison.class25;import java.util.ArrayList;/** * @author Harrison * @create 2022-04-07-9:50 * @motto 众里寻他千百度,蓦然回首,那原创 2022-04-07 10:12:55 · 191 阅读 · 1 评论