自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 LeetCode137 只出现一次的数字 II

此题常规思路为遍历一次使用哈希表记录每个数字出现的次数,然后在哈希表中找到出现次数为一次的数字。此方法时空复杂度都是O(n)还可使用位运算。常见的位运算符号如下:符号 描述 运算规则 & 与 两个位都为1时,结果才为1 | 或 两个位都为0时,结果才为0 ^ 异或 两个位相同为0,相异为1 ~ 取反 0变1,1变0 << 左移 各二进位全部左移若干位,高位丢弃,低位补0 &g...

2022-03-06 20:54:29 191

原创 二叉树前中后序遍历的迭代方式

前序遍历:前序遍历顺序为 中 左 右,因此迭代方法可使用一个栈先存储根节点,在弹出结点的同时记录此节点,并不断弹入此节点的右子节点和左子节点,循环即可class Solution { //前序遍历的迭代 用一个栈 分别对右 左 结点入栈,循环即可 public List<Integer> preorderTraversal(TreeNode root) { List<Integer> res=new ArrayList<>();

2022-02-13 20:31:39 427

原创 LeetCode 377&518

377. 组合总和 Ⅳ给你一个由 不同 整数组成的数组 nums ,和一个目标整数 target 。请你从 nums 中找出并返回总和为 target 的元素组合的个数。题目数据保证答案符合 32 位整数范围。518. 零钱兑换 II给你一个整数数组coins表示不同面额的硬币,另给一个整数amount表示总金额。请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回0。假设每一种面额的硬币有无限个。题目数据保证结果符合 32...

2022-02-10 11:04:49 6218

原创 LeetCode1447 最简分数

今天新学了个gcdclass Solution { public int gcd(int a,int b){ if(a%b==0) return b; else return gcd(b,a%b); } public List<String> simplifiedFractions(int n) { List<String> res=new ArrayList<>(); ...

2022-02-10 10:43:34 178

原创 LeetCode 416分割等和子集

本题其实就是选取一个子集,使子集的和等于数组和的一半 若能得到此子集,则存在对于每个数,都有两种状态,分别是选与不选,目的是为了填满

2022-02-09 19:15:15 5897

原创 LeetCode 343. 整数拆分

本题可采用动态规划做动态规划题前 一定要想清楚dp数组所表示的含义 。动态规划类题目,其实就是由前一步的状态来推断出后一步的状态,因此在编写程序之前,要先想清楚怎么由前一步的状态的处后一步的状态,也就是状态方程,然后还要注意初始值的选取对于此题,dp数组定义为当前索引的数字的拆分后最大乘积从提示中可看到 给定数字是大于2的 而对于1和0是无法拆分的 因此dp[0]和dp[1]直接设置为0即可而状态方程要怎么求?先看代码 for(int j=1;j<i;j++){ ..

2022-02-07 16:44:34 154

原创 LeetCode62 不同路径

此题可采用动态规划方法求解首先构造一个dp数组 与此网格大小完全相同然后来判断数组构造条件,设数组中的每个值表示从起点到该点有多少种路径,这样循环至终点即可得出答案 。由题可看到 ,机器人只能向下或者向右走,因此对于第一列和第一行都可以全部置为1,因为只有一种路径。而对于剩下的点,也可看出某点可从他上面一点到达或者从他左边一点到达即dp[m][n]=dp[m-1][n]+dp[m][n-1];class Solution { public int uniquePaths(i..

2022-02-07 16:13:23 556

原创 LeetCode 746 使用最小花费爬楼梯

动态规划题目,需要定义一个dp数组用于记录爬到某层台阶的最小花费首先需要得到dp数组的递推公式,由于每次可以爬1或2个台阶,因此直接选择花费最小的那个台阶 再加上当前层台阶的花费也就是dp[i]=Math.min(dp[i-1],dp[i-2])+cost[i] ;题目规定了给定数组cost的最大索引大于等于2,因此在初始化过程中直接把cost[0] 和cost[1]赋给dp数组即可在考虑返回值时,由于最后一步可以走1或2个台阶,因此应该取较小的值进行返回class Solutio..

2022-02-07 15:48:03 389

原创 LeetCode763 划分字母区间

本题的思路为通过一次遍历用一个大小为26位大小的数组 存储每个字母最后出现的位置然后第二次遍历中 设置一个end变量记录已遍历过的字符串中的字符出现的最后位置若end等于循环变量i时,说明已到达分割点,为了记录长度,还需要一个start变量记录分割字符串的起始位置class Solution { public List<Integer> partitionLabels(String s) { int[] re=new int[26]; ..

2022-01-27 20:41:09 119

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

本题为贪心算法,贪心在一定存在某最优解 使所有的箭都在气球的右边界处射出具体思路为 对所有气球按照右边界进行排序,设置一个pos变量记录第一个气球的最右位置,然后循环遍历其他气球,判断其他气球的左边界是否小于第一个气球的右边界. 若小于,说明此气球可与上一气球使用同一支箭引爆若不小于,则对箭的数量先自增一次,然后重置pos变量为当前气球的最右边界,继续循环class Solution { public int findMinArrowShots(int[][] points)...

2022-01-26 13:49:10 368

原创 LeetCode406根据身高重建队列

本题的思路是先根据身高(h)对people数组进行降序排序,若某两人身高相同,则对k进行升序排序。对本题而言排序后的数组为[[7,0],[71],[6,1],[5,0],[5,2],[4,4]]然后按索引逐个插入即可。插入过程为第一次:[[7,0]]第二次:[[7,0],[7,1]]第三次:[[7,0],[6,1],[7,1]]第四次 :[[5,0],[7,0],[6,1],[7,1]]第五次:[[5,0],[7,0],[5,2],[6,1],[7,1]]第六次:[[..

2022-01-26 13:25:01 161

原创 LeetCode135分发糖果

设ratings=[1,2,3,4,5,3,2]初始可对所有人先发一个糖果res=[1,1,1,1,1,1,1]如果想两边同时比较在判断糖果数量显然是有点困难的,因此可以先从左往右遍历判断分发糖果数量,再从右往左遍历判断从左往右遍历:若i+1处的评分高于i处的,res[i+1]=res[i]+1;即res=[1,2,3,4,5,1,1]从右左遍历: 若i-1处的评分高于i,res[i-1]=res[i]+1;即res=[1,2,3,4,3,2,1]注意到此时res[4]处的结果明显错..

2022-01-23 21:05:01 294

原创 LeetCode134 加油站

若gas数组和小于cost数组和,则证明汽车无法环绕一周,直接返回false即可若gas数组和大于cost数组和,则说明可以完成环绕注意一下:假设cur变量用于计算当前汽车的剩余量,若cur在某一步小于0,那么在汽车走过的点中,从任何一点出发都无法环绕一周。(因为cur总是大于等于0的)所以到遇到cur小于0的情况时,可直接把start变量(用于从第几个加油站开始可以循环一周)加1class Solution { public int canCompleteCircui..

2022-01-23 20:03:05 207

原创 LeetCode55 跳跃游戏

本题可使用一个cover变量对跳跃最远距离进行记录,从第一个数开始,for循环遍历,遍历终止条件就是cover的最大范围,在循环体中,对cover进行取最大值更新即可,如果cover超过最后一位,即可返回为trueclass Solution { public boolean canJump(int[] nums) { if(nums.length==1) return true; int cover=0; //跳跃可到达的最大范围 for(int i...

2022-01-22 11:40:29 2103

原创 LeetCode1005 K次取反后的最大数组和

本题可采用先对数组进行排序,为了使数组值最大,则可循环判断每个值是否满足值小于0并且k大于0,如果满足即可对其进行翻转并使k-1,若不满足则不操作。在遍历完成后,若k有剩余,说明次数数组已经全为大于等于0 的数,可再次对数组进行一次排序,判断此时的k为奇数还是偶数,若为偶数,则可通过重复翻转不改变数组和。若为奇数,则需要把和减掉2倍的最小值。class Solution { public int largestSumAfterKNegations(int[] nums, int k) ..

2022-01-22 11:28:43 148

原创 Leetcode47 全排列2

此题与全排列1的不同在于 :有重复数字因此首先需要对数组进行排序 然后对同一树层的数字去重class Solution { List<List<Integer>> res=new ArrayList<>();//结果数组 LinkedList<Integer> path=new LinkedList<>(); //路径数组 public List<List<Integer>> permut

2022-01-09 19:25:37 465

原创 Leetcode46 全排列

本题采用回溯算法,其实就是一个横向遍历+纵向递归,还需要用一个used数组记录一个数字是否被使用过。构造res数组记录最终结果 path数组记录过程数组在递归函数中,首先判断终止条件,当过程数组的大小等于给定数组时,即把过程数组加入到结果数组中,然后返回。for循环函数用来横向遍历数组,如果当前数字未被使用,则加入过程数组中,并继续递归如果当前数字已经使用 则继续下一次循环。在递归后则需要重置used数组,并且由于path数组重复使用 因此在每次递归返回后需要移除数组中最后一个元...

2022-01-09 19:07:33 319

原创 Leetcode 450 删除二叉树中的结点

class Solution { public int rightmMIn(TreeNode root){ //找到根节点右子树的最小结点值 root=root.right; while(root.left!=null) root=root.left; return root.val; } public TreeNode deleteNode(TreeNode ro...

2021-12-25 11:25:39 145

原创 LeetCode699 修剪二叉搜索树

class Solution { public TreeNode trimBST(TreeNode root, int low, int high) { if(root==null) return null; if(root.val<low) //如果当前节点值比最小值小 { TreeNode right=trimBST(root.right,low,high); //修剪他的右子树,返回右子树(同时忽略了root即自...

2021-12-25 11:22:15 259

原创 Leetcode面试题02.07.链表相交

这个题的思路还是很巧妙的,可以使用双指针同时从两个链表头开始遍历,当某个指针遍历到链表末尾时,此时可把这个指针指向另一个结点头。这样当一个指针遍历到公共结点的时候,另一个指针也会与这个结点相遇。对上图来说,设t1指针指向A链表,t2指针指向B链表,那么当t1指针第二次指向c1时,t1经过的距离为5+3=8,t2经过的距离为6+2=8. 故终止条件为t1==t2.而如果两个链表没有公共结点,那么当t1遍历完B链表时,t2也刚遍历完A链表,且两个指针同时指向null,返回即可public c...

2021-12-17 15:39:38 306

原创 Leetcode 19删除链表的 倒数第N个结点

本题可采用双指针的解法,两个指针可同时指向头结点,第一个指针先向前移动n步,然后第二个指针与第一个指针同时移动,当第一个指针指向链表末结点的时候,第二个指针就可以指向需要被删除的结点了。但是有几个细节需要注意,第一个就是如果需要删除的是头结点,操作起来就比较麻烦,所以可以先设置一个虚拟头结点指向头结点。第二,第二个指针不需要直接指向被删除的结点,而应该指向被删除结点的前一个结点,这样可以直接把这个结点的next指针指向下下一个结点即可。class Solution { public ...

2021-12-17 15:02:50 245

原创 Leetcode209长度最小的子数组

本题可采用双指针的解法,把左右指针同时设置在数组开始位置,随着右指针向后移动,对经过的值进行求和,当和大于等于目标值时,先记录当前的长度并判断是否要更新。如果当前长度小于最小长度,就进行更新。然后从sum中减去左指针的值,同时左指针向前移动,不断循环找出长度最小的数组。时间复杂度为O(n),较暴力破解有很大的提升.class Solution { public int minSubArrayLen(int target, int[] nums) { int ...

2021-12-17 12:22:03 40

原创 LeetCode236 二叉树的最近公共祖先

首先此题应该采用递归遍历的方式。对于遍历到的每个节点,判断节点值是否等于p和q,如果等于,那么直接返回此节点即可

2021-12-16 12:48:01 335

原创 LeetCode501二叉搜索树中的众数

给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树例如:给定 BST [1,null,2,2] 1 \ 2 / 2返回[2]常规思路可以使用一个Map集合用来存储结点值和出现次数,然后取最大次数的数字放置在结果数组里即可,使用此思路可使用任何一种遍历方式。不过

2021-12-04 11:11:29 281

原创 LeetCode530 二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点root,返回树中任意两不同节点值之间的最小差值。差值是一个正数,其数值等于两值之差的绝对值。输入:root = [4,2,6,1,3]输出:1跟二叉搜索树有关的题目可联想到用中序遍历,因为中序遍历构成的数组是一个有序数组,构造为有序数组后,判断最小差值就很容易了。class Solution { int res=Integer.MAX_VALUE; int pre=-1; public int getMinimumDif...

2021-12-03 21:38:13 304

原创 LeetCode106 从中序和后序遍历构造二叉树

根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。例如,给出中序遍历 inorder =[9,3,15,20,7]后序遍历 postorder = [9,15,7,20,3]返回如下的二叉树: 3 / \ 9 20 / \ 15 7class Solution { int p_index; int[] inorder; int[] postorder; Map<Intege...

2021-12-02 22:32:21 52

原创 LeetCode113 路径总和

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。示例 1:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22输出:[[5,4.

2021-12-01 11:50:19 347

原创 LeetCode 404左叶子之和

计算给定二叉树的所有左叶子之和。示例: 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24要判断某个结点是否为左叶子节点,则需从他的父节点开始判断。判断函数如下: if(root.left!=null&&root.left.left==null&&root.left.right==null) m=root.left.val;然后则递归循坏遍历整...

2021-12-01 10:33:21 140

原创 leetcode 572 另一棵树的子树

给你两棵二叉树 root 和 subRoot 。检验 root 中是否包含和 subRoot 具有相同结构和节点值的子树。如果存在,返回 true ;否则,返回 false 。二叉树 tree 的一棵子树包括 tree 的某个节点和这个节点的所有后代节点。tree 也可以看做它自身的一棵子树。示例1:输入:root = [3,4,5,1,2], subRoot = [4,1,2]输出:true这道easy题最简单的思路就是暴力深搜,遍历每个节点,逐个判断以该结点为根的子树与已..

2021-11-30 17:05:48 272

原创 LeetCode 257

给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例 1:输入:root = [1,2,3,null,5]输出:["1->2->5","1->3"]class Solution { List<String> res=new ArrayList<>(); public List<String> binaryTreePaths(TreeNo...

2021-11-30 16:06:58 151

原创 leetcode 110 平衡二叉树的判定

(初学者,简单解释官解)给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过 1 。 此题可以设计一个计算树的高度的递归函数:判断是否平衡: 若此树不平衡,则返回-1即可。 int l=height(root.left); int r=height(root.right); if(l==-1||r==-1||Math.abs(l-r)>...

2021-11-30 15:25:59 42

空空如也

空空如也

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

TA关注的人

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