自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java类型

Java 标志符的命名:由字母、数字、下划线和$组成,其中数字不能开头。Java所有的关键字都是小写的。变量的类型:基本类型、引用类型基本类型:boolean类型和数值类型。数值类型:整数类型:byte 、short 、int 、long 、char 浮点类型:float 、 double引用类型:类、接口、和数组类型在通常的情况下,直接给出一个整数值默认就是int类型。如果使用一个巨大的整数值,java不会自动把这个整数值当成long来处理,需要在末尾加上L。如果直接就将较小的数值赋值给by

2020-05-30 20:06:10 183

原创 通配符匹配

判断两个可能包含通配符“?”和“*”的字符串是否匹配。匹配规则如下:‘?’ 可以匹配任何单个字符。‘*’ 可以匹配任意字符串(包括空字符串)。两个串完全匹配才算匹配成功。这道题比正则匹配简单一些。*自己就能匹配了不用依靠前面的字母。与正则的思想是一样的。public class Solution { /** * @param s: A string * @param p: A string includes "?" and "*" * @return: is

2020-05-29 18:28:13 622

原创 10. 正则表达式匹配

给你一个字符串 s 和一个字符规律 p,请你来实现一个支持 ‘.’ 和 ‘*’ 的正则表达式匹配。‘.’ 匹配任意单个字符‘*’ 匹配零个或多个前面的那一个元素分析:分两种情况。p的最后一个字符不是*,这种情况比较好处理,如果是 . 就一定没问题因为可以匹配任意的字符,或者s[i - 1] == p[j - 1],这时就看前 i-1和 j-1的情况。第二种情况是最后一个字符是‘’,可能是匹配零个字符,这时候f[i][j] = f[i][j - 2] 。或者匹配多个字符这时候 f[i][j] = f[

2020-05-29 18:22:15 191

原创 一和零

在计算机世界中, 由于资源限制, 我们一直想要追求的是产生最大的利益.现在,假设你分别是 m个 0s 和 n个 1s 的统治者. 另一方面, 有一个只包含 0s 和 1s 的字符串构成的数组.现在你的任务是找到可以由 m个 0s 和 n个 1s 构成的字符串的最大个数. 每一个 0 和 1 均只能使用一次思路:动态规划,我们用一个三维的数组来存储状态。public class Solution { /** * @param strs: an array with strings i

2020-05-29 18:03:45 171

原创 309. 最佳买卖股票时机含冷冻期

给定一个整数数组,其中第 i 个元素代表了第 i 天的股票价格 。​设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票 (即冷冻期为 1 天)。思路:这道股票的题多了一个冷冻期。因此可以将状态给分为三类。 第一类是不持有股票,但是不在冷冻期,说明股票不是在今天给卖的;第二类是持有股票;第三类是不持有股票但是在冷冻期,说明股票是在今天给卖的。class S

2020-05-25 22:39:37 125 1

原创 股票问题Ⅳ

给定数组 prices, 其中第 i 个元素代表某只股票在第 i 天第价格.你最多可以完成 k 笔交易. 问最大的利润是多少?思路:这个与Ⅲ是类似的, 就是将只能交易2次,变成了可以交易k次。思路是一样,有2k + 1种情况。然后我们也是分别列举就可以了。需要注意的是,当 k 大于数组长度的一半时,就可以转为普通的不计次数的情况来进行操作。class Solution { public int maxProfit(int k, int[] prices) { int n = p

2020-05-25 22:32:30 113

原创 解码方法

有一个消息包含A-Z通过以下规则编码‘A’ -> 1‘B’ -> 2…‘Z’ -> 26现在给你一个加密过后的消息,问有几种解码的方式思路:是一个动态规划的题型。一个位置可能是自己一个数进行解密,也可能是两个数字一其解密。有两种情况,我们要一一计算。public class Solution { /** * @param s: a string, encoded message * @return: an integer, the number

2020-05-25 10:52:53 152

原创 不同的路径 II

现在考虑网格中有障碍物,那样将会有多少条不同的路径?网格中的障碍和空位置分别用 1 和 0 来表示。思路:这个题与之前的题有相似的思路。就是在网格上面多了一个障碍物的设定。基本的思路还是一样的,即到达 (i,j)这个位置,我们需要的是(i - 1,j)与(i,j - 1)这两个位置的信息。只是在这之前我们需要首先判断一下这个位置是否有障碍,如若有障碍物的情况下,就代表了这个位置是不能够到达的,我们直接记为0就可以了,因为下面或者右面的位置,也不可能通过这个格子到达他们。public class Sol

2020-05-25 10:11:07 62

原创 乘积最大子序列

找出一个序列中乘积最大的连续子序列(至少包含一个数)。这种找最大连续子序列的一般都是动态规划。由于我们不知道数的正负,因此我们要用两个数组来进行存储,一个用来存储最大值,一个用来储存最小值。如果当前的值为负数,那么它的最最大值可能是自己,也可能是和前面最小值得乘积。如果是正数的话,那就是当前数,或者和前面最大数的乘积。public class Solution { /** * @param nums: An array of integers * @return: An in

2020-05-25 09:56:01 106

原创 连续的子数组和

给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。思路1: 这个题我们可以直接暴力的做,先用一个sum数组来记录前i项的和,之后直接进行暴力的解答,求出每个子数组的和,然后判断是否满足是k的倍数,同时要保证长度大于等于2. 这里有一个特殊情况,即当k为0的时候,0是不能作为除数的,因此我们要进行特别的判断。思路2:我们可以使用一个Map来进行存储信息,将前 i 项和对k取余数的结果给

2020-05-21 23:08:29 554

原创 股票问题Ⅳ

给定数组 prices, 其中第 i 个元素代表某只股票在第 i 天第价格.你最多可以完成 k 笔交易. 问最大的利润是多少?思路:这道股票题与股票问题三相比,将只能买卖两次的规则给改成了k次,思路是一样的状态一共有2 * k + 1种,与之前的分析是一样的。 只是如果k的值大于给定数组长度的一半时,这道题就转化成了股票问题2,相当于可以无限次的进行买卖。因为获得最优解的的次数,最多就是今天买,明天卖,最多是不会超过 n / 2 次的。public class Solution { /**

2020-05-20 18:01:21 94

原创 买卖股票的最佳时机Ⅲ

假设你有一个数组,它的第i个元素是一支给定的股票在第i天的价格。设计一个算法来找到最大的利润。你最多可以完成两笔交易。这题与前面的题相比多了一个限定的条件,即我们只能完成两笔交易。用动态规划来做的时候,我们需要记录上当前的状态。一共有五个状态,1,3,5代表了手中是没有股票的,2,4代表了手中有股票。1是没有进行过交易的,所以其值只能是0。 要达到3和5有两种情况,一是在前一天就没有股票,因此这个值就直接等于前一天的值,二是前一天有股票,今天没有了,说明今天将股票给卖了,值是前一天的值加上今天和昨天股票

2020-05-20 17:38:45 96

原创 炸弹袭击

定一个二维矩阵, 每一个格子可能是一堵墙 W,或者 一个敌人 E 或者空 0 (数字 ‘0’), 返回你可以用一个炸弹杀死的最大敌人数. 炸弹会杀死所有在同一行和同一列没有墙阻隔的敌人。 由于墙比较坚固,所以墙不会被摧毁.思路:爆炸会分为四个方向,因此我们可以将四个方向的杀敌数目都给求出来。当我们遇到墙的时候,因为无法穿透,所以这个位置可以杀死的敌人计为 0,同时不用再加上上一个的位置,一位墙过不去。遇到的位置如果是空位,我们就先将当前的位置计为 0,然后加上前面位置的数字, 遇到敌人的话就将当前的位置计

2020-05-19 22:17:00 125

原创 计算房屋染色的最小花费

这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小,返回最小的费用。费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。思路:动态规划,我们需要用dp来记录当前的最小花费。由于有三种颜色,并且相邻的房子染色不能相同。因此我们在用红色染房子时,需加上前面蓝色和绿色染房的钱数,并找出最小花费。public class So

2020-05-19 16:31:31 213 1

原创 不同的路径Ⅱ

给定一个网格,0代表可以通过,1代表有障碍物,不能通过,求出有多少路径。思路: 这是之前路径问题的升级版,我们首先要判断一下当前的网格是否有障碍,如果有障碍的话就将当前的dp记为0,因为不可能到达这里。然后将开始的位置00 记为 1,如果在第一行或者是第一列就只需要其前面或者上面的信息,否则是可以在上边或者左边两个地方过来的。public class Solution { /** * @param obstacleGrid: A list of lists of integers

2020-05-19 16:08:10 74

原创 152.乘积最大的子序列

给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。思路:对于以 i 结尾的子数组,如果 arr [i] 是正数,最大的连续子数组应该是乘上 i - 1位置的最大数或者其本身,如果 i 是负数,最大的连续子数组应该是乘上 i - 1 位置的最小数或者其本身。因此我们需要两个数组来保存变量,一个保存最大值,另外一个保存最小值。class Solution { public int maxProduct(int[] nums)

2020-05-19 15:43:56 83

原创 换硬币问题

给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1.思路:这是一个动态规划的题。假设coins 有3种,要想得到 i 这个金额, 有三种方法可以到达i,选取三种方法中最小的那个然后加1. 初始化的时候0的方案数是0,然后其他的方案数都先给初始化为无穷大,然后在做。public class Solution { /** * @param coins: a list of integer

2020-05-19 11:20:02 157

原创 拼接字符使其具有最低的字典序

给定一个字符串类型的数组strs,找到一种拼接方式,使得把所有字 符串拼起来之后形成的字符串具有最低的字典序。思路:这是一道贪心题。如果先将数组给排序之后然后加起来是不对的。比如b < ba,但是bba,是大于bab的。 这道题的贪心策略是(a + b)< (b + a)的话就将a排在b的前面。因为加起来之后字符串的长度就是一样的了,将数组排序贪心这种贪心策略不对的原因是如果字符串的长度不一样的话,短字符长度为len1,长字符长度为len2。如果前len1的字符都一样的话,这是就是短字符排在

2020-05-17 19:10:56 229 1

原创 可以进行的最多宣讲次数

一些项目要占用一个会议室宣讲,会议室不能同时容纳两个项目的宣讲。 给你每一个项目开始的时间和结束的时间(给你一个数组,里面 是一个个具体的项目),你来安排宣讲的日程,要求会议室进行 的宣讲的场次最多。返回这个最多的宣讲场次。思路:这是一个贪心题。这道题我们贪心的策略是找到最早结束的宣讲会来进行选择。因为如果一个项目结束的较晚,其后面可以做的项目,在其之前结束的宣讲是一定可以做的,因此选择结束早的宣讲这样可以选择的次数一定是大于等于选择晚结束的次数的。package Code07;import jav

2020-05-17 19:00:19 266

原创 一个数据流中,随时可以取得中位数

思路:这题的思路就是利用两个堆来做。一个大根堆用来储存比较小的数据,以及一个小跟堆用来储存较大的数据。package Code07;import java.util.PriorityQueue;public class Code04_MedianQuick { public static void main(String[] args) { MedianHolder m = new MedianHolder(); m.addNumber(3);

2020-05-17 18:56:46 168

原创 可以获得的最大钱数

输入: 参数1,正数数组costs 参数2,正数数组profits 参数3,正数k 参数4,正数mcosts[i]表示i号项目的花费 profits[i]表示i号项目在扣除花费之后还能挣到的钱(利润) k表示你不能并行、只能串行的最多做k个项目 m表示你初始的资金说明:你每做完一个项目,马上获得的收益,可以支持你去做下一个 项目。输出: 你最后获得的最大钱数。思路:这是一个贪心的问题,我们可以先将花费小于等于m的所有项目给找出来,然后挑选里面利润最大的项目做,做完之后加上利润,我们在将总的资金可以做

2020-05-17 18:55:06 166

原创 切金条所需的最小代价

一块金条切成两半,是需要花费和长度数值一样的铜板的。比如长度为20的 金条,不管切成长度多大的两半,都要花费20个铜板。一群人想整分整块金 条,怎么分最省铜板?例如,给定数组{10,20,30},代表一共三个人,整块金条长度为10+20+30=60. 金条要分成10,20,30三个部分。 如果, 先把长度60的金条分成10和50,花费60 再把长度50的金条分成20和30,花费50 一共花费110铜板。但是如果, 先把长度60的金条分成30和30,花费60 再把长度30金条分成10和20,花费30 一共花

2020-05-15 17:03:33 215

原创 前缀树

前缀树是将之前的信息给存到一棵树中,然后当下一个字符串加进来的时候,将其转化为字符数组,看看当前字符是否在这个前缀树中,若存在就经过那条路径,然后路径上的path加1,若不存在就新建一条路径。package Code07;public class Code01_TrieTree { public static class TrieNode{ public int path; public int end; public TrieNode[] ne

2020-05-15 10:25:24 55

原创 求完全二叉树的节点个数

已知一棵完全二叉树,求其节点的个数要求:时间复杂度低于O(N),N为这棵树的节点个数因为是完全二叉树,除了最后一层都是填满的,因此我们可以利用这个性质。首先求出这个二叉树最大的高度,然后求其右子树的最大高度,如果两者是相等的,就说明左边是填满的,我们可以直接计算数量,否则的话就说明右面的最大高度是h - 1,同时在h - 1层右子树的高度也是填满的。然后就进行递归来做。package Code04;public class Code08_NodeNumber { public stat

2020-05-13 18:23:36 576

原创 完全二叉树

完全二叉树是每层结点都完全填满,在最后一层上如果不是满的,则只缺少右边的若干结点。因此我们在判断是否是完全二叉树的时候我们可以分情况来进行讨论。一个节点有右孩子而没有左孩子 这显然是错的。当一个节点的孩子为空时,这时在同一层的后面的节点,如果有节点的孩子不全为空,则不是完全二叉树。package Code04;import java.util.LinkedList;import java.util.Queue;public class Code07_IsBSTAndCBT {

2020-05-13 17:42:46 2394

原创 搜索二叉树

判断一棵树是否为搜索二叉树搜索二叉树的特点是当前节点的值大于左子树的值,小于右子树的值。即中序遍历的结果为升序。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { pu

2020-05-13 17:18:15 93

原创 二叉树的遍历

用递归的方式可以很方便的打印二叉树,因为在递归的调用中每个节点都会经过三次,根据到达节点的先后顺序我们就可以进行打印。用非递归的方式打印。先序遍历的时候,我们用一个栈来存储节点。如果一个节点存在右孩子我们就将右孩子给加进去,然后如果存在左孩子,就将左孩子给加进去。这样可以保证在弹出的时候是先弹出左孩子的,然后才是右孩子。后序遍历与先序遍历是相似的,需要将先序遍历的顺序给换过来,先加左孩子在加右孩子,然后用一个额外的栈去存储。中序遍历:也是用一个栈来存储节点。如果一个节点不为空就将这个节点给加..

2020-05-13 09:32:23 79

原创 1025.除数博弈

爱丽丝和鲍勃一起玩游戏,他们轮流行动。爱丽丝先手开局。最初,黑板上有一个数字 N 。在每个玩家的回合,玩家需要执行以下操作:选出任一 x,满足 0 < x < N 且 N % x == 0 。用 N - x 替换黑板上的数字 N 。如果玩家无法执行这些操作,就会输掉游戏。只有在爱丽丝在游戏中取得胜利时才返回 True,否则返回 false。假设两个玩家都以最佳状态参与游戏。思路:这是一个偶数必赢的游戏。倒数第二个数为2的时候,爱丽丝选择1,鲍勃就无法操作了。因此只要爱丽斯保证给鲍

2020-05-12 21:59:05 99

原创 爬楼梯升级版

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007这题是之前每次可以爬两层的升级版很明显若到达第 i 阶,可能的结果是从 i - 3, i - 2, i - 1,这三层台阶过来的,因此我们只需要将这三种情况的可能加起来就好了。还有就是我们需要开一个long数组,否则会发生越界。class Solution { public int waysToStep(int n) {

2020-05-12 21:17:56 694

原创 桶排序及其应用

桶排序是一种不用比较的排序。适合需要排序的数据的数值不是很大且非负。思路:首先遍历一遍数组arr,将其中的最大值找出来。然后创建一个大小为max+1的数组。然后遍历arr,将arr[i]的值放进到help[arr[i] ]中,同时help的值加一。package Code01;public class Code06_BucketSort { public static void main(String[] args) { int[] arr = {2,7,9,1};

2020-05-12 09:38:37 432

原创 汉诺塔问题

解决汉诺塔问题可以使用递归的方法,将最底下的一根柱子看成一个整体,上面n-1根柱子看成是另外一个整体。然后一直递归到0.非递归版本貌似是用栈来完成,太菜了 目前还不会…然后就是给定一个数组判断它是最优解的第几步。首先我们先看数组的最后一个元素,它只能在from或者是to的位置,因为最开始的时候是将其单独看成一个整体的,目标就是将其移动到to的位置,因此是不可能出现在mid位置。同理前面的元素也是这样的,因此可以一直递归下去。package Demo01;public class Demo02_Ha

2020-05-08 20:33:07 98

原创 122.买卖股票的最佳时机Ⅱ

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。思路:我们一定是在低价格的时候买入股票,然后在高价格的时候卖出去,如果prices[i - 1]的值大于prices[i]的值,那么我们是不会选择prices[i-1]的,...

2020-05-08 11:03:31 99

原创 121.买卖股票的最佳时机

给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。思路:这题里只允许买卖股票一次,因此要此想获得最大的利润,我们一定是在历史最低价格的时候来进行买卖的。如果在第i天卖出股票,那么我们一定在i-1天中的最低价格买入才能够过得最大的利润。class ...

2020-05-08 10:46:13 59

原创 70.爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。思路:这道题与斐波那契数列是一道题,要想到达n,可以是从n-2或者n-1这两层到达的,因此是一样的。class Solution { public int climbStairs(int n) { if(n == 0)re...

2020-05-08 10:09:11 71

原创 509.斐波那契数列

斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.给定 N,计算 F(N)。思路:可以进行暴力递归,遇到1或者2时返回1,还可以用一个一维的数组来进行存储前边的值,然后后面的值就直接计算...

2020-05-08 09:59:02 104

原创 最大子序和

给定一个整数数组nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。思路:动态规划。要求最大和可知,如果前面的i-1个元素和为负数则应该舍弃不要,如果大于0,则前面的和加上当前的数。class Solution { public int maxSubArray(int[] nums) { int sum = 0; int ...

2020-05-03 09:22:56 74

原创 长度最小的子数组

给定一个含n个正整数的数组和一个正整数s,找出该数组中满足其和>=s的长度最小的连续子数组,并返回其长度,如果不存在符合条件的连续子数组,就返回0。思路:这题也是一个关于滑动窗口的题。这题是找出其中满足大于等于的长度,与只等于的解法稍有不同。因为全是正整数,因此我们在向后移动的过程中,sum是一只增大的,当我们找到一个符合条件的子数组了,这时我们就将最左边的那个元素给删去,一直重复删除的操...

2020-05-02 22:23:40 196

原创 无重复字符的最长子串

给定一个字符串,找出其中不含有重复字符的最长子串长度。思路:这是一个滑动窗口的题目。设置两个两个指针来进行操作。一个代表左边界,一个代表右边界。左边界每次移动一个位置,找到这个左边界所包含的最长子串。然后在继续左边界。`class Solution { public int lengthOfLongestSubstring(String s) { if(s == n...

2020-05-02 21:43:35 87

原创 925. 长按键入

你的朋友正在使用键盘输入他的名字name。偶尔,在键入字符c时,按键可能会被长按,而字符可能会被输入1次或多次。检查键盘输入的字符typed,如果它对应的可能是你的朋友的名字(其中一些字符可能会被长按),那么就返回True。思路:该题使用了双指针的思想。考虑题意是某个字符可以长按而不是可以按错字符,出现名字中没有的字符,这样是错误的。我们首先判断键入的第一个字符,要是不相等的话说明是错的就没有...

2020-05-01 11:01:56 71

原创 21. 合并两个有序的链表

将两个升序链表合并为一个新的升序链表并返回。思路: 因为链表是有序的,我们分别遍历两个链表,如果l1的值大于l2的值就把l2当前节点加入到我们新建的节点中去,然后l2向后移动,否则的话就将l1的当前节点加入进去,l1向后移动。一般合并数组的操作,我们都需要建立空的头结点,方便后面我们可以返回链表的头。/** * Definition for singly-linked list. * p...

2020-05-01 10:36:59 54

空空如也

空空如也

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

TA关注的人

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