自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 leetcode第647题回文子串

leetcode第647题回文子串一、dp数组的下标和含义:​ dp【i】【j】:字符串区间【i j】之间的子串是回文子串二、确定递归公式整体上是两种:相等和不相等不相等的时候,一定是false相等的时候: 1. 只有一个字符:为回文子串 2. i和j相差为1,也是回文子串 3. 相差大于以的时候,看中间的字符串是不是回文串通过递推公式确定遍历的顺序​ dp【i】【j】 是通过dp【i + 1】【j - 1】也就是左下角,从后往前遍历。class Solution {

2022-02-05 14:59:21 429 1

原创 leetcode第337题打家劫舍III

leetcode第337题打家劫舍III**思路:**动态规划,分别记录偷和没偷的情况,比较。**后序遍历的由来:**需要知道子节点偷没偷,子节点偷了,当前节点就不能偷,当前节点要偷,左右子节点都不能偷。和监控二叉树挺像的,感觉。每个节点只有偷和没偷两种状态,所有dp的初始化为第三,在递归的过程中,栈会保存每一层递归的参数。再递归的过程中,无论偷或者不偷,最大的利润为0举例推导dp数组,这一环是很重要的,可以正确验证状态转移方程的正确性。 //这种题目,我好想明白了,但是又好像没有明白,我应

2022-01-26 17:22:59 379

原创 leetcode第198题打家劫舍

leetcode第198题打家劫舍思路分析:**dp数组的定义:**对数组中0 - i中的位置进行打劫,能够打劫到的最大利润为dp[i]**状态转移方程的推导:**状态就是只有一种,当前房屋盗或是不盗,如果盗,能够获得的最大利润为dp【i - 2】 + nums[i] dp[i - 1]肯定没盗如果不盗,能够获得的最大利润为 dp【i - 2】如何在这两种状态中进行选呢? 去两中状态的最大值**dp数组的初始化:**dp【0】的定义为:对下标为0的位置进行打劫,能够得到的最大利

2022-01-26 12:38:11 533

原创 leetcode滑动窗口总结

力扣滑动窗口总结(438 76 567)下述三题均用labuladong滑动窗口的代码框架:这是java版本第438题class Solution { public List<Integer> findAnagrams(String s, String p) { ArrayList<Integer> list = new ArrayList<>(); HashMap<Character, Integer> need

2022-01-26 10:46:48 198

原创 leetcode第139题单词拆分

leetcode第139题单词拆分经典完全背包,动态规划:**dp数组的定义:**以j结尾的字符串是否可以被拆分**dp数组的初始化:**dp【0】:空串可以被拆分么,可以,这样来表述可能勉强,但是只这这样来,现在i到了指向字符串中的c list中包含leet,dp【0】就应该为true**状态转移方程:**leetcode可以被拆分,i初始化定义为1,里面都要进行i - 1会是我需要指定的数字。还要注意substring()是左闭又开区间,j必须从0开始遍历。class Solution {

2022-01-25 21:40:02 76

原创 leetcode第279题完全平方和

leetcode第279题完全平方和好明显的完全背包:这不是和兑零钱是一样的么, 找兑换该钱最小的纸币数,这不也是一样的?只是货币的价值没有直接给出,但是依旧可以依靠索引获取当前的纸币面值思路分析:dp数组的定义:和为j的完全平方和的最小数量为dp【j】dp数组的初始化:任意一个数都设为Integer.MAX_VALUE dp【0】 = 0状态转移方程:dp【j】 = Math.min(dp[j],dp[j - i * i] + 1);class Solution {

2022-01-25 20:37:32 194

原创 leetcode第377题组合总数

leetcode第377题组合总数**思路:**动态规划一眼看上去就是动态规划完全背包问题,凑零钱里面说到先遍历物品在遍历背包是求组合先遍历背包在遍历物品是求排列没什么可说的,还算是比较合适吧!class Solution { public int combinationSum4(int[] nums, int target) { //找组合的个数,完全背包 int[] dp = new int[target + 1]; dp[0] =

2022-01-25 15:03:36 114

原创 leetcode第518零钱兑换

leetcode第518零钱兑换题目类型:完全背包求种类的个数二维dp:​ 分析:完全背包dp数组的定义:0 - i个物品,放在容量为j的背包中,有多少种形式dp数组的初始化,物品数量为0的时候,不管容量为多大,均为0,背包容量为0的时候,我只有一种方式,就是不往背包里面放状态转移方程的推导:如果当前背包的容量没有钱币的数值大,背包里面就放不进去,可是背包的容量没变啊,只能看这个物品的前面的物品放在当前背包的情况是怎么样的,如果当前背包的容量大于等于当前的货币,背包里面放的进去,现在背包的容量

2022-01-25 12:26:09 165

原创 leetcode第494目标和动态规划

leetcode第494目标和动态规划动态规划:这个题目的思路很奇特,寻找一个正子集和一个负子集,两者相加为数组之和,两者相减为target可以解出正数组之和,就转换成了01背包,每个数字只能用一次。题目就转换为了,装满容量为正数组之和有几种情况,也可以说是一种全排列。记住在装满背包有几种情况下,dp【j】 = dp【j - nums[i]class Solution { public int findTargetSumWays(int[] nums, int target) {

2022-01-24 18:30:28 227

原创 leetcode第70场双周赛

leetcode第70场双周赛第一题[2144. 打折购买糖果的最小开销]贪心:要使得花费的钱最少,就要尽可能的免费拿到价格高的糖果class Solution { public int minimumCost(int[] cost) { //这感觉是贪心算法 if (cost.length == 2){ return cost[0] + cost[1]; } Arrays.sort(cost)

2022-01-24 14:34:16 302

原创 leetcode第1049题 最后一块石头的重量

leetcode第1049题 最后一块石头的重量身为菜鸡的感慨:这是怎么想到用背包问题的啊!巧夺天工啊!思路:一堆子石头,两个两个一起碰,求最后剩下的最小的石头重量dp数组的定义:容量为j的背包可以容纳的石头的最大重量,剩下的石头重量就是sum - dp【sum / 2】 石头一起碰撞,两者相减,就是最后剩下的最小的石头的重量,比较典型的01背包的问题。class Solution { public int lastStoneWeightII(int[] stones) {

2022-01-22 21:52:52 472

原创 leetcode第343题整数拆分

leetcode第343题整数拆分自底向上 + 双层for循环:分析:(以5为例子)可以分为:1 + 1 + 1 + 1 + 1 结果为11 + 2 + 1 + 1 结果为21 + 3 + 1 结果为31 + 4 结果为 42 + 3 结果为6**dp数组的定义:**拆分以i结尾的数字,得到最大的乘积为dp【i】状态转移方程: dp【i】其实是上一层j循环得到的结果,里面的数加起来和也是i i - j × j 就是对当前i 和 j 的情况作出的处理 dp【i - j】 × j也

2022-01-22 11:40:13 549

原创 leetcode第986题监控二叉树

leetcode第986题监控二叉树贪心:思路比较好理解,对二叉树的所有操作都是基于三种遍历方式,第一步就要想到,按照计算机的思维如何才能往里面放入相对少的摄像头,肯定是从叶子节点的父节点开始安装摄像头,所用的摄像头最少,整体最优,:摄像头所用的摄像头开始的,将二叉树分为三层,0,1,2,数字代表各自覆盖子树的层数为0时,相当于叶子节点,当前节点的左子节点和右节点均为2为1时,下面是覆盖了一层树的时候,就需要往这里放摄像头承上启下为2时,下面是覆盖了一层2层树,也不要进行处理,为

2022-01-21 10:42:55 204

原创 leetcode第738题单调递增的数字

leetcode第738题单调递增的数字**贪心:**这个题目贪心的思路我是真找不见,和贪心相关联的地方在哪里呢?class Solution { public int monotoneIncreasingDigits(int n) { //这个题目我真的不知道他为什么可以用贪心,还是认真做吧! String nums = n + ""; char[] num = nums.toCharArray(); int flag = num

2022-01-20 19:00:45 329

原创 leetcode第763题划分字母区间

leetcode第763题划分字母区间**实话:**不看题解根本做不出来,一看题解,好巧妙啊!我真的是蠢货。思路:找出每个字母最迟对应的下标,放在对应的hash表中,最大范围覆盖,如果中间发现还有比这个字母靠后的,分割,继续往后走,贪心是在这里体现的。找最后的值对应。class Solution { public List<Integer> partitionLabels(String s) { // 贪心的思路是真的不好想 int[] ed

2022-01-19 21:06:26 282

原创 leetcode用数量最少的箭引爆气球

leetcoded第452题用数量最少的箭引爆气球贪心:贪心体现的点,就在排序,为了让气球尽可能的重叠,需要对数组进行排序。当气球出现重叠,一起射,所用的弓箭最少。这样设计,我一开始是没有想到的,直接从下标为1的位置开始遍历。比较,对当前的位置的下标为1的的元素进行收缩。class Solution { public int findMinArrowShots(int[][] points) { //一定是需要排序的 Arrays.sort(points

2022-01-19 17:28:51 268

原创 leetcode第406题根据身高重建队列

leetcode第406题根据身高重建队列贪心:当有两个维度需要进行处理是,先想如何确立一个维度,然后按照另外一个维度重新排列,需要注意的一点是两个维度一起考虑一定会顾此失彼第一次排序按照身高,一定是按照从小到大排列,身高相同的话则k小的站在前面,让个子高的站在前面。按照身高排序结束之后按照k进行排序,毕竟身高已经排好了,小的身高插在大的身高不会对大身高的k值产生影响。class Solution { public int[][] reconstructQueue(int[][] p

2022-01-19 14:45:15 111

原创 leetcode第860题柠檬水找零

leetcode第860题柠檬水找零贪心:列举情况,当nums[i] == 5 的时候,我只需要收钞票,不需要找零当nums【i】== 10的时候,收到一张10元的,找零一张五元的。当收到20元的时候,收到20的一张,找零15元 可能是一张10元,两张五元,也可能是三张五元。找零的时候优先处理10元的,贪心的思路就体现在这里。class Solution { public boolean lemonadeChange(int[] bills) { //试着坐一坐吧!见多

2022-01-19 11:14:05 178

原创 leetcode第135题,分发糖果

leetcode第135题,分发糖果。**贪心:**局部最优找见全局最优。只要右边评分比左边大,右边的孩子就要比左边的孩子多一个糖果,体现的全局最优的思路:相邻孩子中,评分高的有孩子获得比左边孩子更多的糖果。在确定左孩子大于右孩子的情况,只比较左边孩子评分比右边大的情况。这样从局部最优推出了全局最优:即相邻孩子中评分高的孩子获得更多的糖果。class Solution { public int candy(int[] ratings) { //利用的两次贪心,

2022-01-19 10:50:45 497

原创 leetcode第45题,跳跃游戏

leetcode第45题,跳跃游戏**动态规划:**还算是思路比较简单吧。dp数组的定义:到达以i结尾的位置所需要的最小步数。dp数组的初始化:我其实位置就是下标为0的位置,dp【0】 = 0;一点一点推导,以示例一所示,到达最后一个位置,是我从3一步跳过去的,dp【nums。length - 1】 = 数组中是3的位置 + 1,而不是从前一个数开始加所以dp【i】 = dp【j】 + 1,即使break,在当前位置可以蹦到想要的位置,那么下一个也可以。class Solution {

2022-01-18 22:38:12 3144

原创 leetcode第55题,跳跃游戏

leetcode第55题,跳跃游戏贪心:如何判断是否可以到达最后一个下标所处的位置呢?nums[i] > nums.length - i,就说明我一定可以到了最后的位置,换到了程序里面,就是利用原本fast的值和nums[i] + i,进行比较,更新对应的fast如果发现从这个位置可以直接到达最后的一个位置,我就直接返回true,我不需要看后面是不是依旧可以到达我想要的那个位置。class Solution { public boolean canJump(int[] nu

2022-01-18 21:03:48 2333

原创 leetcode第53题,最大子数组之和

leetcode第53题,最大子数组之和**第一种解法:**贪心贪心的地方在于,发现当前和为负值的时候,立刻放弃当前数值,从下一个开始计算,因为负数只会拉低总和。class Solution { public int maxSubArray(int[] nums) { //贪心:如果发现当前值为负数,我就从下一个开始算 int res = Integer.MIN_VALUE; int sum = 0; for(int i =

2022-01-18 11:45:59 148

原创 leetcode第51题n皇后

leetcode第51题n皇后思路:n皇后是很经典的回溯问题,难就难在怎样进行设计,方法的划分也体挺关键的。根据n创建一个chessboard 初始化全为’.’;回溯的参数,分别是 n chessboard row 当n == row的时候,row - 1 行中的皇后已经填充完毕,说明我们找到了一种合理的情况,可以添加到结果集中。回溯的过程就是从第一行开始放第一个皇后的,放在第一行的第一个位置,回溯,往第二行的第一个位置放,发现当前的位置无效,i++ 放在第二行的第二个位置,

2022-01-17 20:29:37 4147

原创 leetcode第332题重新安排行程

leetcode第332题重新安排行程思路:Map<String,Map<String,Map>> map = new Map<起始地,<目的地,机票的数量>>() 记录机票之间的映射关系从JFK开始枚举,利用映射关系得到我要去的目的地和这张机票有几个,到了目的地之后,对应的机票减一,从结果的容器中在拿到起始地,减机票。当我发现当前道路行不通的时候,remove已经加进去地点,从map里的map重新开始取出来,利用for循环,在找一遍合适的道路。

2022-01-17 19:16:52 3437

原创 leetcode第491题递增子序列

leetcode第491题递增子序列第一版的错误代码:思路:子集的去重+特殊条件(路径的长度>2 并且 当前值要大于 路径的最后一个值)这个思路看起来没什么错的,绝大部分的测试用例也过的去,一起来分析一种,1,2,3,1,1,第一个1在回溯的过程中,会合后面的两个1,一一进行匹配,当我们回溯到第二个1的时候,3的used数组已经变为了false,nums【i - 1】 != nums【i】,也会进行匹配,子集中的去重是排序之后的,数字之间是连续的,不会和现在一样,1 和 1 之间还有比1

2022-01-17 11:23:57 110

原创 leetcode第93题复原ip地址

leetcode第93题复原ip地址思路:回溯,一个一个开始截取,对截取的字符串进行验证判断字串是否合法段位开头为0的数数字不合法,段位里有非正整数不合法段位如果大于255了不合法class Solution { List<String> res; public List<String> restoreIpAddresses(String s) { //比较重要的一点是我们需要找到相关的问题出处? res = ne

2022-01-15 11:11:18 733

原创 leetcode第131题,分割回文串

leetcode第131题,分割回文串对于回溯来讲,最重要的就是分清树枝和树层。通过控制startindex 和for循环i截取字符串,字符串验证的区间,为左闭右闭。字符串分割的区间,为左闭右开,当验证字符串为合法的回文串,加入到相应的路径中,每次进入一个递归树,都是从当前字符串一个一个开始验证,每次进入一个递归树时,步长均为1。比如aa是一个回文字符串,路径中添加aa字符串,index指向了b的索引,发现b是回文字符串,加入b,如果b后面还有,继续进入下一层递归树。class Solution {

2022-01-15 11:02:11 3544

原创 leetcode216题组合总数III

leetcode216题组合总数III思路:递归树还是从浅到深,从深到浅。剪枝的部分。if(sum > n) 直接返回已经选择的个数 path.size();还需要元素个数 k - path.size()在集合n中之多要从该其实位置:n - (k - path.size())+ 1开始遍历。class Solution { //还是回溯比较标准的一个格式 List<List<Integer>> res; LinkedLi

2022-01-14 21:09:56 117

原创 leetcode第77题组合优化

leetcode第77题组合优化优化思路(剪枝):如果for循环选择的起始位置的元素已经不足我们需要的元素个数,那么就没有必要搜索了。已经选择的元素个数:k - path.size();在集合n至多要从该起始位置:n - (k - path.size()) + 1,开始遍历感觉回溯好不容易啊!我粗俗的理解为,for循环套递归,递归树的由浅入深,再由深入浅。class Solution { List<List<Integer>> res; LinkedL

2022-01-14 21:08:54 290

原创 leetcode第275次周赛ac代码

leetcode第275次周赛ac代码第一题:思路分析:​ 按照行遍历一次,在按照列遍历一次,如果发现了不符合条件的值,直接返回false,已经走过的数字,可以保存在map里面,其实也可以保存在boolean数组(充当hash表的作用)里面,class Solution { public boolean checkValid(int[][] matrix) { //先试着坐一坐 int len = matrix.length; for(int

2022-01-10 00:14:26 138

原创 leetcode第222题完全二叉树的节点个数

leetcode第222题完全二叉树的节点个数介绍完全二叉树和满二叉树:完全二叉树是介于普通二叉树和满二叉树之间的。简单来说,普通二叉树节点可以任意排列,满二叉树一定是一个三角形,第k层的节点数量为2k - 1 总数量为2k -1个完全二叉树,要不就是一颗满二叉树树,要不就是一颗满二叉树缺了一个小角,所以我们可以分开计算,当他为满二叉树的时候,可以根据公式算出来,也就是,只要他是完全二叉树,即使它不是满二叉树,他的左子树也会是一颗满二叉树,我们在计算左子树的中节点数量的时候,就可以利用公式。这种技

2022-01-07 15:36:46 513

原创 leetcode第239题滑动窗口的最大值

leetcode239题滑动窗口的最大值基于单调队列,单调栈需要自己实现,单调队列:队列中维护的是一个最大值,当需要加入的数比这个数小时候,加入队列的尾部,反之,移开单调队列中所有比这个数小的数,然后从数组里面一个一个取出来,放在单调队列里面。java中deque的说明:deque是一个双端队列的接口,继承自Queue接口,deque的实现类是LinkedList ArrayQueue 等 LinkedList是最常用的作为队列时add方法等于addLast 将数据添加到队列的尾部r

2022-01-04 11:16:10 178

原创 leetcode第150题逆波兰表达式

leetcode第150题逆波兰表达式class Solution { public int evalRPN(String[] tokens) { //逆波兰表达式求值 感觉还可以接受 //自己试着做一做吧 //为什么我觉得这个题目考查的点反倒不是计算式 而是对字符串的处理 Stack<Integer> stack = new Stack<>(); for (String token : token

2022-01-03 12:17:49 847

原创 leetcode第17题 电话号码的组合

leetcode第17题 电话号码的组合思路:还是很典型的回溯思路,穷举,列出所有的代码组合画出递归树,一层一层的遍历,遇到合适的情况,加入到结果集里面。柑橘和全排列有一点像,可以类比这看一看。class Solution { HashMap<Integer, String> map; public List<String> letterCombinations(String digits) { map = new HashMap<&g

2021-12-21 20:04:08 1482

原创 leetcode第700题 二叉搜索树的搜索

leetcode第700题 二叉搜索树的搜索思路:递归条件:当我找不见的时候,返回ull将当前节点的值和和val进行比较.当前节点的值 > val 我们到左子树进行寻找当前节点的值 < val 我们到有子树进行查找class Solution { public TreeNode searchBST(TreeNode root, int val) { if(root == null){ return null; }

2021-12-21 20:03:39 63

原创 leetcode第50题 Pow(x,n)

leetcode第50题 Pow(x,n)for循环形式:class Solution { public double myPow(double x, int n) { //这个题目还是出的挺好的 double res = 1.0; for(int i = n;i != 0;i /= 2){ if(i % 2 != 0){ res *= x; } x *= x; }

2021-12-20 16:29:40 72

原创 leetcode第372题 超级次方

leetcode第372题 超级次方做题的过程中发现问题:做过的题目,有印象,但是相同的代码还是写不出来,思路梳理的不是很清晰很久以前的时候 就做过 pow这个题目,但是第一次想如何求幂的时候,还是会for循环一个一个的乘,刷题太少了,还是需要多做题,感觉才会更加的强烈.举例 3 的 152次方思路:3 的 一次 等于 33 的 15 次 等于 3的10次 乘 3的5次3的152次等于 3的150次乘以 3的2次func superPow(a int, b []int) in

2021-12-20 16:27:20 1679

原创 leetcode第139题 单词的拆分

leetcode第139题 单词的拆分**需求:**给定义一个字符串和一个字符串数组,看看字符串是不是可以由空格拆分成一个或者是多个在字典中出现的单词**思路:**暴力破解从0开始一个一个的列举,假如匹配到了一个数组中的字符串,我就继续匹配,如果接下来的也能够匹配成功,返回true用了一个备忘录记录我已经匹配的结果start代表的是节点的状态用一个数组,存储计算的结果,下次遇到相同的子问题,直接返回命中的缓存值,就不用调重复的递归DFS+记忆化代码func canBreak(start

2021-12-18 20:20:35 88

原创 leetcode第146题 LRU缓存机制

leetcode第146题 LRU缓存机制思路:map + 双向链表使得查找的时间复杂度o(1)。LinkedHashMap有相应的api可以实现顺序的删除和添加。记住一个核心的原理:最大次频优先map有一个size,在get的时候,makeRecentlyput的时候,如果原来有这个键值对,删除然后添加,makeRecentlymakeRecently 得到原来的oldval,删除相应的k值,进行添加。class LRUCache { //一定要注意刷题,你知道吗

2021-12-17 16:35:10 739

原创 leetcode第221题 最大的正方形

leetcode第221题 最大的正方形思路:创建长和宽都比原来大一,争取遍历一次原来的数组就可以得到所需要的答案。明确dp数组的定义:位置 ij 最大的正方形的边数。就给自己设定死吧!创建dp数组的时候一定格子数多一点。func maximalSquare(matrix [][]byte) int { //为什么就是找不见定义了 row := len(matrix) cal := len(matrix[0]) dp := make([][]int,row +

2021-12-17 16:19:44 89

空空如也

空空如也

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

TA关注的人

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