自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(88)
  • 收藏
  • 关注

原创 粉刷房子3

问题描述在一个小城市里,有 m 个房子排成一排,你需要给每个房子涂上 n 种颜色之一(颜色编号为 1 到 n )。我们将连续相同颜色尽可能多的房子称为一个街区。(比方说 houses = [1,2,2,3,3,2,1,1] ,它包含 5 个街区 [{1}, {2,2}, {3,3}, {2}, {1,1}] 。)给你一个数组 houses ,一个 m * n 的矩阵 cost 和一个整数 target ,其中:houses[i]:是第 i 个房子的颜色,0 表示这个房子还没有被涂色。已经被..

2021-05-05 00:52:19 201

原创 leetcode 685:去除有向图的冗余连接

题意现在有一个N个点,N条边的有向图,每个节点至少与一条边相连,现在要求删掉一条边,使得有向图成为一棵树,从而可以从一个根节点遍历到其他节点(可能出现多个符合条件的答案,要求去除最后一次出现的边)题解大方向:并查集冗余会出现于什么情况?情况1:一个节点有两个父亲,比如输入边集:[[1,2], [1,3], [2 3]]情况2:一条边的加入导致循环,比如输入边集:[[1,2], [2,3], [3,4], [4,1], [1,5]]如何根据冗余情况找到冗余边?

2020-09-17 13:37:37 431

原创 leetcode 679: 24点(普通回溯)

题意给出若干个数字组成的数组,判断该数组中的所有元素经过加减乘除之后,是否可以拼凑成24点实现难点1:遍历所有可能的加减乘除组合实现1:每次取出列表中的两个元素进行操作,得到结果之后,加入列表尾部,因为有四则运算,所以这里要回溯四种列表,每次回溯的时候把上一次操作的结果剔除。难点2:效率提升,乘法和加法满足交换律,不需要重复匹配实现2:二重循环的时候,如果是加法或者乘法,判断i>j是否成立,如果成立,由于i<j的时候已经操作过一次了,因此此时可以跳过。注意,每

2020-08-23 00:30:01 568

原创 分布式唯一ID

唯一id的四个要求全局唯一性:不能出现重复的ID号,既然是唯一标识,这是最基本的要求。趋势递增:在MySQL InnoDB引擎中使用的是聚集索引,由于多数RDBMS使用B+ tree的数据结构来存储索引数据,在主键的选择上面我们应该尽量使用有序的主键保证写入性能。单调递增:保证下一个ID一定大于上一个ID,例如事务版本号、IM增量消息、排序等特殊需求。信息安全:如果ID是连续的,恶意用户的扒取工作,比如爬订单号,对手可以直接知道我们一天的单量。在一些应用场景下,会需要ID无规则、不规则。UU

2020-08-22 00:17:38 164

原创 TCP之确保传输可靠的答题技巧

可靠性传输丢包发现TCP的报文都是有序列号的如果序列号不按顺序到达,那么可以发现丢包或者乱序一旦检测到乱序,那么就将乱序部分调整,一旦检测到丢包,那么就通知发送方重新传输丢包重传有三种做法一种是亭等协议,就是没法送一个tcp报文,只有当接收方返回ack之后,才会发下一个报文,效率比较低一种是回退n帧协议,也就是一次性发送n个报文给接收方,一旦第k个报文出错,那么从k往后的报文都要重新发送最后是选择重传协议,接收方回发送sack报文,该报文头回添加错误的报文信息,从而通知发送

2020-07-26 18:57:04 122

原创 leetcode 31: 下一个排列(数形结合)

题解题目:给定一个数组,将里面的数字重新排列,求比当前数组中数字连起来的字典序大的最小的排列,比如[1,2,3,4] -> [1,2,4,3] -> [1,3,2,4]。。。,如果已经是最大了,那么就返回最小的字典序,如4,3,2,1 -> 1,2,3,4题解:字典序小,意味着第越大的数字在越后面,因此最小的排列就是从头到尾都是升序的,比如,1,2,3,4,最大的排列就是从头到尾降序,4,3,2,1。经过仔细的思考,我们可以下定结论,在不同前缀的情况下,前缀越大,字典序越大。在

2020-07-12 15:08:52 181

原创 leetcode 32: 最长有效括号(栈方法 和 双指针追逐法)

最长有效括号匹配题解括号匹配充要条件(规律)规律1:在一段长度以内,左右括号数量是相同的规律2:直到最后一个字符为止,每一个前缀的左括号数量都大于右括号的数量题解框架将字符串分割为一系列字串,确保每一段都不会破坏规则题解思路根据规律2,确保当前子串的前缀是左括号更多。我们可以一个个字符串向后遍历,使用一个计数器cnt统计左右括号的差值,当遇到左边括号计数器就+1,右边就-1,cnt<0的时候说明当前子串再向右就一定不合法了,因为至少有一个前缀是不符合规律2的。

2020-07-04 12:33:13 215

原创 剑指offer 33:二叉搜索树后序遍历判断(非递归:反向遍历+单调栈, 递归:找到左右子树)

题解题意:输入一个字符串,判断一下这个字符串是否满足一个二叉搜索树后序遍历的结果题解:非递归:后序遍历的顺序是,left-right-root,这个性质决定了,无论对于树本身,还是子树结构而言,跟节点一定是对应树的后序遍历的最后一位。因为是最后一位,我们可以考虑反向遍历数组,那么此时,遍历顺序就是root - right - left对于二叉搜索树而言,确定了根节点可以帮我们判断左右子树节点的划分位置,即当根节点的值小于某个节点的数据,且大于另一个相邻节点的数据的时候,说明此时从右子树走向

2020-07-02 23:16:36 185

原创 java输入: Scanner用法

产生一个scanner类Scanner scan = new Scanner(System.in)整数读取:int x = scan.nextInt();nextxx:读取空格隔开的数据读取数组:字符串分割,转换成数组形式class Test{ public static void main(String[] arg){ Scanner sc = new Scanner(System.in); String str = sc.nextLine().toString();

2020-06-22 17:54:56 1872

原创 leetcode 124. 二叉树中的最大路径和(巧妙的后序遍历)

题解给定一个非空二叉树,返回其最大路径和。 本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。样例:经过 最长路径是15+20+7=42题解:此题其实有点像动态规划,主要就是从子节点到父节点的一个状态变化记录,而这个变化正好符合后序遍历的规范这里我们需要考虑最大路径和的意义**路径和:**从一个节点到另一个节点的权重之和,途中不一定经过跟节点遍历:一个节点到另一个节点的路径遍历对于树结构来说是无法实现的,因此我们必须从根出发,而左

2020-06-21 23:32:46 317

原创 leetcode 494:目标和(背包)

题解:题意:给定一串数字nums[] 和一个目标值s,在相邻两个数字之间添加+和-号,输出满足nums中的数字进行加减操作之后和为s的方案题解:动态规划,背包问题(最优解不用开二维数组,但是开了更好理解)状态表示dp[i][j]: 表示第i个数字“使用”了之后,截至第i位目标和为j的组合数状态变更:减去当前数字:dp[i][j-nums[i]] += dp[i-1][j]加上当前数字:dp[i][j+nums[i]] += dp[i-1][j]实现,注意,这题j最大值是1

2020-06-17 00:19:17 175

原创 Springboot入门前须知:Spring的完全注解IOC(初学,不含任何原理)

第一步创建一个配置类假如类名为SpringConfig,用@Configuration放在一个类的头上进行标识配置类上再加一个@ComponentScan表示这个类会开启组件扫描,这个注解有多个属性base-package: 表示扫描范围在这个目录下第二步ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class),加载配置类第三步利用配置类对象创建类实例,cont

2020-06-14 22:50:09 199

原创 Spring学习:Bean的生命周期与XML自动装配

Bean是什么?bean是一种规范,bean实例指的是满足这个规范的类对象bean的四大规范所有类成员属性都是private类中必有默认无参构造器类中提供getXxx与setXxx方法,也成为getter和setter实现序列化(serializable)接口,便于从内存到硬盘的持久化。Bean的生命周期执行无参构造函数创造bean实例调用setter,给bean中成员和bean的引用对象赋值在初始化之前调用一个bean后置处理器postProcessBeforeInit

2020-06-14 22:43:33 129

原创 剑指offer19: 正则表达式匹配(序列DP)

题解题意:给定一个正常字符串S以及一个正则字符串P,判断两者是否表示相同的字符串,其中S只包含普通字符,P中可能包含三种类型字符,分别是普通字符, .(匹配任意一个普通字符), *(匹配前面一个字符任意次,包括0次)题解: 分类讨论, 我们利用i, j表示S和P当前位置的字符,假设两者长度分别是n和m若P[j] != . && p[j] != *,那么判断S[0~i]==P[0~j]就转换为S[0~i-1]和P[0~j-1],否则说明直到当前位置的两个字符串是不匹配的若P[j]=

2020-06-13 12:10:39 223

原创 Spring学习:IOC之降低耦合的原因

IOC是什么控制反转,将对象创建交给SpringIOC容器:对象工厂目的:将耦合度尽量降低,当具体类发生改变的时候,只需要修改配置文件,而不是修改对用代码。实现关键原理:XML文件(怎么解析的暂时不用管),工厂模式,反射机制工厂模式将对象创建的过程交由另一个类的getXXX方法来完成,一个简单的例子class UserService{ execute(){ UserDao ud = UserFactory.getDao(); ud.add(); }}class User

2020-06-11 16:52:42 1181

原创 JAVA反射机制:简单解释与小例子

反射机制反射机制的作用在于,利用类编译出来的字节码信息,来动态操作类对象。Class类JAVA之所以能够存在反射机制,是因为实现了Class这个类,这个对象是每一个编译过的类都有的。Class类首先有一个forName(String s)方法,通过传入package.class,也就是对应类的全路径,来获取对应类的Class对象。Class中也有直接的newInstance()方法,故名思意,可以直接创建对应类的对象,但是好像被抛弃了, 不知道什么原因Class可以调用getMehtod

2020-06-11 16:34:22 189

原创 JAVA引用类型:强软弱虚

分类依据根据垃圾回收器的回收情况来分类类型介绍以及用处强引用:普通引用,即Object o = new Object这样的引用的统称,一旦启用垃圾回收器,会对强引用进行可达性分析,只有垃圾对象才会被回收软引用(SoftReference<T>):软引用内部包含一个引用,常用于缓存,淘汰机制有点类似LRU,通过SoftReference<T> m声明的m也是一个强引用,但是m会指向SoftReference中包含的那个软引用,但是强引用指向的是软引用,m可以通过调用get

2020-06-09 12:55:31 232

原创 剑指offer46. 把数字翻译成字符串(斐波那契数列)

题解题意:给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 “a” ,1 翻译成 “b”,……,11 翻译成 “l”,……,25 翻译成 “z”。一个数字可能有多个翻译。现在给定一个输入是一个int数字num,编程计算一个数字有多少种不同的翻译方法。输入: 12258输出: 5解释: 12258有5种不同的翻译,分别是"bccfi", “bwfi”, “bczi”, “mcfi"和"mzi”题解:这题和斐波那契数列有点类似,为了方便,我们利用num[i]表示第i位数字当nu

2020-06-09 01:09:12 221

原创 Leetcode 990. 等式方程的可满足性(并查集判断是否处于同一连通分量)

题解题意:给定一个由表示变量之间关系的字符串方程组成的数组,每个字符串方程 equations[i] 的长度为 4,并采用两种不同的形式之一:“a==b” 或 “a!=b”。判断关系数组中的所有字符串是否能够形成一个合理的方程式: 比如,输入["a==b","b==c","a==c"],输出true,输入["a==b","b!=c","a==c"],输出false题解:这题关键在于分开遍历==和!=所对应的方程式,如果一个等式全都是不等式或者等式,那么这个逻辑一定是正确的。因此只需要考虑同时存在

2020-06-08 10:45:55 300

原创 剑指offer 29. 顺时针打印矩阵(模运算模拟转向,思路清晰)

题解题意:给定一个矩阵,要求从外围内内围顺时针打印里面的每一个数据。输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]题解:这题我们使用一个指针模拟顺时针的顺序,因此需要注意到什么时候指针要换方向。从左上角开始,顺时针移动的方向有哪些?右 - 下 - 左 - 上,因此可以利用两个数组来表示这几个方向dy[]={1,0,-1,0}, dy[] = {0,1,0,-1},然后移动就是nx = x + dx[x], n

2020-06-05 09:54:50 124

原创 Leetcode 238. 除自身以外数组的乘积(左右扫描)

题解题意:给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 res,其中 res[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。输入: [1,2,3,4]输出: [24,12,8,6]题解:想要题目的意思,我们可以考虑对每个数字求它左边和右边的数据的乘积。因此最直观的做法就是利用一个L数组保留第i个数字之前的所有数字的乘积,利用R数组保留第i个数字之后所有数字的乘积,然后再遍历一次,让res[i]=L[i]*R[i]即可实现class

2020-06-04 11:20:41 154

原创 837. 新21点(概率DP)

题解题意:题目是一个摸牌游戏,牌的数字都在某个范围内,规则是玩家一直摸牌,当累计数值比预先给定的阈值大的时候,就停止摸牌,加上最后一个数值之后,如果大于一个目标值那么就算输,否则,就算赢。 现在给定三个数字,N, K, W,N是目标值,W是牌的最大数值,换句话说就是牌堆的数值都在[1,W]范围内,K是给定的阈值,即累计数字大于K的时候停止摸牌,求玩家赢的概率。K<=N<=10000,W<=10000K<=N<=10000, W<=10000K<=N<=10

2020-06-03 12:44:38 436

原创 Thinking in JAVA:类型信息(1)

RTTI:运行时的对象类型信息识别,大方向可以分为两种最传统的RTTI就是静态识别,程序编译之后,编译器就知道该对象的类型信息运行时识别,需要用到反射机制Class对象每个类都拥有一个Class对象,这个Class对象会被存储到与类名相同的.class文件里面为了生成某个类的对象,JVM将使用其中的类加载器类加载器首先检查对应类的Class对象是否已经加载,如果没有,默认的加载器就会根据类名查找.class文件(字节码)。当Class对象被加载到内存的时候,就会被用来创建这个类的

2020-05-31 23:59:51 106

原创 Thinking in java: 通过异常来处理错误(1)

抛出异常的作用通过规定某种必须保证的形式来防止随心所欲的编程导致的问题,降低处理代码错误的复杂度。异常是对一种“知道这么做不对,但是代码无法立马解决的”情况的描述异常将每件事都当做一个事务,作为每个事务的底线维护它们的逻辑稳定性。一旦异常发生,就不允许程序按照正常模式执行下去。基本异常使用throw 抛出异常对象的引用,异常对象的名字一般以Exception结尾抛出异常之后,会发生什么?使用new在堆上创建异常对象停止当前执行路径,抛出异常对象的引用异常机制接管程序,在异常处理程

2020-05-31 14:18:06 238

原创 Leetcode 101: 对称二叉树(非正常顺序BFS)

题解题意:给定一个二叉树,检查是否对称。题解:首先,直观上,二叉树对称就是将二叉树根据根节点对折之后,左右子树能否完全重合,想要左右子树完全重合,就是要左子树的左儿子等于右子树的右儿子,且左子树的右儿子等于右子树的左儿子,因此递归比较好写,就是针对左右子树的孩子节点进行一个dfs即可。不过这里有一个比较特殊的情况,就是既然是关于根节点镜像对称,根节点的左右儿子也必须相等,不过有意思的是,把root节点既当作左树,又当作右树,那么判断上面的条件,就等于判断root的左右儿子是否相等。递归版本实现

2020-05-31 13:14:41 152

原创 Thinking in java: 异常处理(2)

异常说明java强制让函数名后面接上throws+异常类型明示这个方法可能抛出的所有异常类型,比如f()中可能在某些判断体内会有TooBig, TooSmall, DivZero这些类型的异常,那么代码在实现的时候,就需要加上 void f() throws TooBig, TooSmall, DivZero{...}只有RuntimeException类型的异常是可以不显示表示的如果f()潜在一些异常,但是却没有被告知,那么f()将会被编译器提醒要检查异常可以在异常说明中写上该方法可能不

2020-05-30 16:30:52 186

原创 Leetcode 84: 柱状图中的最大矩形(扩散+单调栈)

题解题意:给定数组heights[],包含n个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积,矩形中间不能为空,样例,给定数组heights = [2,1,5,6,2,3], 输出10,即阴影部分的面积:题解:首先考虑什么情况下可能围成最高的矩形?自然是要么够宽,要么够高,但是这两个并没有依赖性,因此需要共同考虑,而暴力做法在有两个自由变量的时候,复杂度都是O(n2)O(n^2)O(n2),不合适,我们要考虑如何减少没必要的状

2020-05-30 12:31:27 281

原创 Leetcode 198, 213, 337:打劫家舍系列

题解打劫家舍 1(01背包)题意:村里的房屋成一字排列,现在给定一个数组nums里面每个数据代表对应编号房屋中的财产。有一个强盗想在这个村庄中打劫,但是如果连续打劫两家相邻的房屋,会导致系统报警,请设计一个算法,在不出动警报的情况下让强盗获取最大金额题解:很直接的01背包问题,因为要表示最大值,我们首先考虑针对每个房屋的状态表示。我们可以利用dp[i]表示第i家房屋之前,最多能够打劫多少金额,那么如果下次打劫如果用上了dp[i],就不用考虑i之前的状态了。现在考虑dp[i]是如何通过上一个状态转

2020-05-29 11:44:44 345

原创 394. 字符串解码(辅助栈+字符串栈)

题解题意:字符串的编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。 给定一个经过编码的字符串,返回它解码后的字符串样例s = “3[a]2[bc]”, 返回 “aaabcbc”.s = “3[a2[c]]”, 返回 “accaccacc”.s = “2[abc]3[cd]ef”, 返回 “abcabccdcdcdef”.题解:无疑,越是嵌套在里面的括号,要被重复的次数就越多,一定是越里层括号

2020-05-28 12:05:33 180

原创 Think in java: 什么是java内部类(1)

内部类是什么类中定义的类(隐藏名字)仅对包含该内部类的’外部类’可见静态方法必须通过外部类.内部类的方式来调用 (是因为没有this指针?)外部类能够访问内部类的一切对象,包括private链接到外部类内部类能访问所有制造它的外围对象的成员引出设计模式之一:迭代器模式,将某个数组以类的形式包装起来,并设计诸如add(). next(), end()等方法的形式对数组进行修改与访问的操作:interface Selector{ boolean end(); Object c

2020-05-27 16:36:29 152

原创 leetcode 974:和可被k整除的子数组(同余定理+哈希记录)

题解题意:给定一个整数数组 A,返回其中元素之和可被 K 整除的(连续、非空)子数组的数目。其中k<=10000, A.length <= 10000题解:连续非空的元素之和,最容易想到的就是求前缀和,利用pre[r]-pre[l]的方式得到区间内满足条件的子数组和。然而前缀和遍历所有情况需要o(n^2)的复杂度,因此,很多情况下,包括此题,这都是不可能直接做的,因此我们需要表示状态,然后进行状态的压缩整除的状态:一般而言,只要是要求不能遍历所有数据的,都是存在一个规律使得不需要遍历所

2020-05-27 11:27:36 395

原创 leetcode 287. 寻找重复数(数组中的快慢指针)

题解题意:给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。要求时间复杂度是o(n)且额外空间复杂度只能是o(1)题解:在介绍此题之前,先介绍一个非常相似的题目:数组中重复的数字数组中的重复数字数组中重复的数字:一开始看错题,以为思路和这个一样。此题是利用原地桶排序的思想,因为数组中的数据范围都在(0,n-1),小于等于数组的长度,那么如果每个元素不重复,那在正常排序

2020-05-26 15:18:37 349

原创 Leetcode 146:LRU缓存机制(哈希+双向链表,终于自己写出来了没bug的版本)

题解设计和实现一个 LRU (最近最少使用) 缓存机制,(如果不懂LRU机制的,需要先学习操作系统的LRU调度算法,先从理论上知道实现方式才行),支持以下操作: 获取数据 get 和 写入数据 put ,且两个操作都需要在O(1)复杂度下完成LRU算法大意:给定一个固定大小的容器,容器中的事物代表需要使用的事物,以及一系列事物,每个事物都有自己的key, value值,其中key用来识别自身的身份,value则是内容。在容器没有满的时候,事物会不断向容器里面添加,容器满的时候,就把最早添加到容

2020-05-25 11:44:01 194

原创 Leetcode 4. 寻找两个正序数组的中位数 (数组划分+中位数位置搜索)

题解题意:给定两个大小为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出这两个正序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。题解:此题主要是找到两个数组的中位数位置,不断地在两个数组中寻找合理的分割线位置。中位数位置:(m+n)偶数:(m+n+1)/2的左右两边,m+n奇数:(m+n+1)/2所处元素。对于奇数来说,就是划分成两堆数据之后,奇数长度数组的中位数就在元素多一个的那边(如9个元素,划分成5+4,中位数就在5那一堆)在两个数组

2020-05-24 12:24:38 320

原创 Leetcode 76. 最小覆盖子串(滑动窗口+文本距离)

题解题意:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串,顺序可以不一样。如果S并没有包含T的子串,那么返回"",否则,样例的S只会包含唯一的一个最短覆盖子串。T中可能包含重复字符,比如输入: S = “ADOBECODEBAANC”, T = “AABC”输出: “BAANC”题解:这题思路其实比一些中等题目简单(当然我是看题解才做出来的),查找字符串字串的题型考的最多的就是双指针滑动窗口的思路,但是这题还有一个点在于使用汉明距离来表示两个两

2020-05-23 14:49:59 232

原创 Leetcode 105:前序与中序遍历序列构造二叉树(递归+哈希提升效率)

题解题意:根据一棵树的前序遍历与中序遍历(所有节点的数值唯一)构造二叉树。如给定前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回 3/ \9 20 / \ 15 7题解:我们知道前序遍历是根-左-右的顺序进行的,而中序遍历是左-根-右的顺序。两个遍历对确认节点的位置各有帮助,是两个工具序列其中,前序遍历用于找到根节点的位置,因为对于任何一颗子树的前序遍历,根节点都是第一个

2020-05-22 11:34:56 149

原创 leetcode 5: 最长回文子串(中心扩展算法)

题解题意: 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。题解:虽然长度是1000,但是如果暴力求每个子串的翻转来判断,那似乎是O(n^3)的复杂度,因此不可取。个人认为中心扩展算法是解决最长回文子串问题的最容易掌握的方法,这种算法时间复杂度是O(n^2),空间复杂度是O(1)(但是不是复杂度最优的算法,最优的算法是Manacher算法,时空复杂度都是O(n),但是比较复杂,需要经常看才能掌握)中心扩展算法:巧妙的利用了回文串的特点,就是从中心到两

2020-05-21 10:28:15 262

原创 leetcode 1371. 每个元音包含偶数次的最长子字符串(哈希+状态压缩表示)

题解题目:给你一个字符串 s ,请你返回满足以下条件的最长子字符串的长度:子串中包含的元音字母,即 ‘a’,‘e’,‘i’,‘o’,‘u’ ,在子字符串中都恰好出现了偶数次。(字符串长度最大是 5*10^5)题解:最简单的做法就是两重循环,遍历所有子串,但是这明显是不行的,因为数据长度限制了O(n^2)的做法。那么如何优化复杂度,官方题解给了两个方向。状态记录:使用二重前缀和pre[i][k]:保留第i个字符前面的字符串中,第k个元音字符出现的次数,这样一来,每个字符出现的次数就可以通过pre[r

2020-05-20 12:27:53 230

原创 leetcode 152: 最大乘积数组(动态规划)

题解题意:给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。题解:此题要求找到连续乘积最大的子数组,连续数组的意义是什么,一个最直观的想法就是,如果前面的乘积在乘了元素i之后变大了,那么就把元素i加入到子数组中,否则,则从第i项开始,再进行记录。但是这会遇到一个问题,正数如果乘以负数,那么就是变小了,此时如果抛弃掉前面的项,很明显是不对的,因为后面如果又遇到一个负数,那么最小值又变成最大值了,因此我们不能因为乘以了一个负数,

2020-05-18 11:19:58 226

原创 java可变参数列表

利用... args作为形参,如下例所示,可变参数列表可以随便接受任何类型的变量: public class NewVarArgs{ static void printArray(Object... args){ for (Object obj:args){ System.out.print(obj+" "); } System.out.println(); } } public static void main(String[] args){ printAr.

2020-05-17 23:11:34 97

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除