力扣Hot100
Data跳动
专注于数据开发,数仓建设,数据治理以及大数据生态技术
展开
-
【力扣Hot100】2. 两数相加
题目: 2.两数相加思路:设置一个哨兵节点dummy和增长节点cur定义一些辅助变量x,y,flag,sumx表示链表L1当前节点的值,空节点为0;y表示链表L2当前节点的值,空节点为0;sum表示x+y的和;flag表示sum/10,即向十位的溢出值while循环,只要链表L1和链表L2不同时为空,就对L1和L2所指的当前节点作如下处理:计算sum = x + y + flag;计算flag = sum / 10;用sum % 10的值在cur后面创建一个新节点;循原创 2020-09-28 20:56:37 · 244 阅读 · 0 评论 -
【力扣Hot100】3. 无重复字符的最长子串
题目:无重复字符的最长子串思路:定义一个变量maxLen用来记录不重复字符串的最大长度;定义一个哈希表,辅助遍历查询用一对左右指针遍历字符串,对每一个字符c作如下处理:判断该字符在不在map中,若存在 ==> 更新左边界L = max{L , c_index + 1};将该字符以及索引存放在map中;更新maxLen = max{maxLen , R-L+1};返回maxLen。class Solution { public int lengthOfLonges原创 2020-09-28 20:56:14 · 144 阅读 · 0 评论 -
【力扣Hot100】5. 最长回文子串
题目:最长回文子串思路:特判:过滤掉空字符串的情况初始化:定义一个变量maxLen表示最长字符串长度,begin表示最长字符串首字符的位置;定义一个二维动态数组dp,dp[i][j]表示从第i个字符开始到第j个字符结尾的字符串是否为回文字符串,初始条件就是每个字符都是一个回文字符串,也就是dp[i][i] = true;利用i,j两个指针遍历整个字符串,填满整个动态数组的状态值,取值范围为j: [1,len); i: [0,j)s_i 不等于 s_j ==> false;原创 2020-09-28 20:55:55 · 140 阅读 · 0 评论 -
【力扣Hot100】11. 盛最多水的容器
题目:11. 盛最多水的容器解题思路:初始化:定义两个指针i,j,分别首尾位置相对移动定义变量 maxVolume 表示所求的最大值只要满足条件i < j, 那么就要进行如下操作:求i,j所指的两个元素的较小值h更新 maxVolume指向较小值的指针继续前行返回class Solution { public int maxArea(int[] height) { //初始化 int len = height.lengt原创 2020-09-28 20:55:32 · 101 阅读 · 0 评论 -
【力扣Hot100】21. 合并两个有序链表
题目:合并两个有序链表一. 迭代大法好解题思路:定义一个虚拟节点dummy和一个前进节点cur;只要两个指针都不指向空,就遍历两个链表,对两个指针所指节点作如下处理:比较两个节点的值;将较小的节点放在cur后面,然后再将该节点上的指针往前移动一步;cur也往前移动一步;将非空的链表接到cur后面(也可以包含均为空的情况,你品!)只要返回dummy.next即可。class Solution { public ListNode mergeTwoLists(ListNo原创 2020-09-28 20:55:01 · 108 阅读 · 0 评论 -
【力扣Hot100】53. 最大子序和
题目:最大子序和方法一:动态规划思路分析采用动态规划,创建动态数组dp[],关键是要捋清楚dp[i]是啥,如何由之前的dp值来求当前的dp[i]?定义状态:dp[i]表示索引从0到i的元素组成的数组中最大子序和;初始状态:dp数组的第一个元素也就是数组的第一个元素本身,dp[0] = nums[0];状态转移方程:如果dp[i-1]大于0,那么很显然dp[i]的值就是在其基础上再加上一个nums[i];而当dp[i-1]小于0,那么dp[i-1]与nums[i]两者的和显然不如nums[i]原创 2020-09-27 07:48:08 · 221 阅读 · 0 评论 -
【力扣Hot100】70. 爬楼梯
题目:爬楼梯思路分析:本质是在求斐波那契数列,也就是当前值是前两个值之和。初始化cur代表当前i台阶的走法,初始值为1;pre代表i-1台阶的走法,初始值为1;迭代,每求增加一个台阶,就要进行如下操作:更新cur = cur + pre;更新pre = cur - pre;返回curclass Solution { public int climbStairs(int n) { //初始化 int pre = 1;原创 2020-09-27 07:47:26 · 120 阅读 · 0 评论 -
【力扣Hot100】101. 对称二叉树
题目:对称二叉树解题思路对于二叉树的题目,一般都是递归解法。如果题目变成:给两个二叉树,判断这两个二叉树是否为对称二叉树,相信大家很想到用递归来解决,从根节点一直递归到叶子节点进行比较。而对于判断一个二叉树是否对称,不好直接递归判别函数isSymmetric(),需要借助一个辅助函数isSymmetricHelper(),辅助函数是判别两个二叉树是否为对称二叉树。这样思路就很清晰了:首先将要判别的二叉树root作为参数传入判别函数isSymmetric();先判别root是否为null原创 2020-09-27 07:47:01 · 200 阅读 · 0 评论 -
【力扣Hot100】104. 二叉树的最大深度
题目:二叉树的最大深度分析:求一棵二叉树的最大深度,先分别求出左子树和右子树的深度,然后进行比较,结果就是较大的那个+1(根节点)。思路递归终止条件(递归基):越过叶子节点返回0;分别求出左右子树的最大深度leftDepth 和 rightDepth;返回较大值+1;代码class Solution { public int maxDepth(TreeNode root) { //越过叶子节点 if(root == null){原创 2020-09-27 07:46:33 · 65 阅读 · 0 评论 -
【力扣Hot100】121. 买卖股票的最佳时机
题目: 买卖股票的最佳时机分析维护两个变量,只需要一次遍历:最小元素minVal代表着遍历过的元素中最小值;最大利润变量maxPro代表截止目前所能获取的最大利润;思路特判:过滤掉空数组情况;初始化:minVal初始值设置为prices[0],表示初始值为第一天的股票价格;maxPro初始值设置为0,第一天只能买或者不买,不能卖,因此初始值为0;遍历,对数组中的每一个元素e做如下处理:更新minVal更新maxPro = min{maxPro , e-minVal}原创 2020-09-27 07:45:50 · 122 阅读 · 0 评论 -
【力扣Hot100】136. 只出现一次的数字
题目:只出现一次的数字分析异或^运算的特点就是:与0异或等于本身;本身异或等于0;而异或运算又满足交换律,因此可以得出,对数组中所有元素进行异或,凡是出现偶数对的元素均消失;结果便是剩下的出现奇数对的元素之间的异或结果。而本题恰恰说明,只有一个元素是出现奇数次的,其他都是出现偶数次,因此异或的结果就是这个元素。思路题目中说了给的数组为非空,那么也就不需要进行特判了对吧,真好!直接遍历,对所有元素进行累计异或运算;class Solution { public int singleN原创 2020-09-26 16:52:38 · 933 阅读 · 0 评论 -
【力扣Hot100】141. 环形链表
题目:环形链表分析:快慢指针一前一后的遍历,只要存在环,迟早会相遇;思路:特判: 为空或者仅有一个节点的链表肯定没有环,排除!;初始化:慢指针slow指向第一个节点;快指针fast指向slow后面的节点;只要slow和fast不相遇,就进行循环遍历,每次进行如下操作:判断fast是否指向空或者最后一个节点,为什么最后一个节点也要,因为fast每次走两步,如果当前为最后一个节点的话,那么就办法前行了。slow走一步,fast走两步(其实只要两者步伐不一致就可以了)。pu原创 2020-09-26 16:50:37 · 190 阅读 · 0 评论 -
【力扣Hot100】155. 最小栈
题目:最小栈题目要求写一个MinStack的数据结构,实现push,pop,top,getMin等方法;思路分析:成员变量:定义两个队列stackA和stackB构造方法:给两个队列创建对象push: 添加元素e的时候,stackA正常添加,stackB需要比较一下,如果e小于等于栈顶元素的话,就添加,否则,过!!pop: 弹出的时候stackA正常弹出栈顶元素e,如果stackB的栈顶元素和e相同,那么stackB也要弹出栈顶元素;top: 直接读取stackA的栈顶元素;getMi原创 2020-09-26 16:47:22 · 687 阅读 · 0 评论 -
【力扣Hot100】160. 相交链表
题目:相交链表分析创建一个节点,其实是在堆里面创建了一个ListNode对象,而栈里面存放的内容就是这个对象的地址,如下图。题目的要求是要找到A,B指针所指向的两个链表第一次相交的节点,相交节点也就是两个链表共有的节点。我们看到节点1和节点2,虽然他们的val值以及next指向都是相同的,但他们却不是同一个对象,因为他们的地址不一样。而再看看节点3和节点5,无论是在链表A中还是在链表B中,都是同一个地址,因此这俩节点都属于两个链表相交节点。那么第一次相交节点很显然就是节点3了。思路可以借助原创 2020-09-26 16:44:41 · 127 阅读 · 0 评论 -
【力扣Hot100】169.多数元素
题目:多数元素思路初始化:众数mode:初始值设置为数组的第一个元素;票数vote:表示当前众数mode所获得的票数,初始值设置为0;遍历,对每个元素e进行如下操作:判断票数vote是否为0:为0则将当前遍历的元素e设置为众数mode;判断e是否为众数mode:是 ==> vote + 1;否 ==> vote - 1;返回最终选举的众数mode。代码class Solution { public int majorityElement(in原创 2020-09-26 16:37:39 · 1264 阅读 · 1 评论 -
【力扣Hot100】198. 打家劫舍
题目打家劫舍思路状态:dp[i]代表偷窃前i间房屋所能获得的最高金额;边界条件:dp[0] = nums[0], 只有一间屋子时,就只能盗窃这间屋子;dp[1] = max{nums[0] , nums[1]} 如果只有两件房屋,由于不能盗窃相邻的房屋,那么只能取最大的盗。转移方程:盗第i间房屋,dp[i - 2] + nums[0];不盗第i间房屋,dp[i - 1];取较大者,即 dp[i] = max{dp[i - 2] + nums[0] , dp[i - 1]};原创 2020-09-26 16:34:31 · 122 阅读 · 0 评论 -
【力扣Hot100】206. 反转链表
题目:206. 反转链表方法一:迭代法两个指针一前一后,反转三步走,直到后指针遍历完链表:保存后方,反指前方,前进特判:过滤掉空链表或者单节点链表初始化:定义一前一后两个指针pre = null和cur = head,遍历,三步走:保存后方: tmp = cur.next;反指前方:cur.next = pre;前进: pre = cur; cur = tmp;最后pre落在了原来链表的最后一个节点上,所以要返回pre;class Solution { public原创 2020-09-26 16:29:16 · 158 阅读 · 0 评论 -
【力扣Hot100】226. 翻转二叉树
题目:翻转二叉树思路判断传进来的节点是否为空;因为不为空才有左右子树,即使左右子树可能为null;分别调用此方法,翻转左右子树;把结果交换下左右位置;代码class Solution { public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode left = invertTree(root.le原创 2020-09-26 08:37:26 · 86 阅读 · 0 评论 -
【力扣Hot100】234. 回文链表
题目:回文链表思路:特判:过滤掉空链表或者单节点链表的情况,这两情况都属于回文链表;寻找中间节点,如果为偶数个节点就取右中位数位置节点为midNode;对midNode进行反转,怎么反转还记得么?,结果为subHead;对head和subHead进行遍历比较:如果值不相等的节点,就返回false;遍历结束后,说明为回文链表;class Solution { public boolean isPalindrome(ListNode head) { if (h原创 2020-09-25 11:49:18 · 137 阅读 · 0 评论 -
【力扣Hot100】283. 移动零
题目:移动零废话(可跳过)回顾下学习JVM时垃圾回收的标记整理法,首先将存活的对象进行标记,然后把标记好的对象向一端进行移动,然后将端界限之外的非标记对象全部清理掉。再看这道题,是不是很像,把非0的数字往前移动,最终将0和非0的数组化为两段。题目源于工程开发,平时多刷刷题目,对日后的工作开发大有裨益啊。分析这道题如果不要求空间复杂度O(1)将会很简单,创建一个等长的新数组,遍历一遍,遇到非0的元素就放在新数组里。而要求O(1)也就说,只能在原数组内活动,那么我们只需要一个指针,来记录遇到的非0元原创 2020-09-25 11:46:09 · 178 阅读 · 0 评论 -
【力扣Hot100】448. 找到所有数组中消失的数字
题目:找到所有数组中消失的数字分析根据题目特点,可以把数组中的元素与索引建立一一对应的关系。因为索引是确定的0到n-1,一个也不缺,而数组的元素不确定,少了哪个也不知道。既然两者是一一对应的关系,那么我们对数组中的每个元素对应的索引做个标记;然后再对索引进行一次遍历,那么不存的元素就不会对它对应的索引进行比较,由此可查找出这些不存在的元素。思路遍历每个元素,对索引进行标记将对应索引位置的值变为负数;遍历下索引,看看哪些索引位置上的数不是负数的。位置上不是负数的索引,对应的元原创 2020-09-25 11:43:01 · 116 阅读 · 0 评论 -
【力扣Hot100】461. 汉明距离
题目:汉明距离分析两个数的汉明距离,就是这两个数进行异或运行,然后统计结果x的二进制中1的个数。重点就是怎么求二进制中1的个数,可以通过循环,对x不断进行<<1,来统计末位1的个数。介绍另一种求法, x & (x -1 )的结果表示去掉x中最右边的1之后数。思路求出两个数的结果r;对r进行 r = r & (r -1 ) 的操作,统计r = 0执行的次数;class Solution { public int hammingDistance(in原创 2020-09-25 11:34:49 · 214 阅读 · 0 评论 -
【力扣Hot100】581. 最短无序连续子数组
题目:最短无序连续子数组分析我们可以假设把这个数组分成三段,左段和右段是标准的升序数组,中段数组虽是无序的,但满足最小值大于左段的最大值,最大值小于右段的最小值。那么我们目标就很明确了,找中段的左右边界,我们分别定义为begin和 end;分两头开始遍历:从左到右维护一个最大值max,在进入右段之前,那么遍历到的nums[i]都是小于max的,我们要求的end就是遍历中最后一个小于max元素的位置;同理,从右到左维护一个最小值min,在进入左段之前,那么遍历到的nums[i]也都是大于min原创 2020-09-25 11:31:57 · 137 阅读 · 0 评论 -
【力扣Hot100】538. 把二叉搜索树转换为累加树
题目:把二叉搜索树转换为累加树分析对如下只有三个节点的搜索二叉树而言,计算结果就是,右子节点保持不变,中间节点的值是其本身与右子节点相加的和,左子节点的值是其本身与中间节点、右子节点三者的累计之和。也就是说,若求中间节点的值必须要先遍历完右子节点,而若求左子节点的值必须要遍历完中间节点和右子节点。因此,我们只需要进行一次反向中序遍历(即遍历顺序为右子树–>根节点–>左子树),在遍历过程中需要将已经遍历的节点的值进行累加,然后再赋值给当前节点。思路定义一个全局变量sum,用于存储遍历的原创 2020-09-25 11:13:09 · 122 阅读 · 0 评论 -
【力扣Hot100】104.二叉树的深度
题目:二叉树的深度思路递归终止条件: 如果越过了叶子节点,节点为null,那么则返回0;调用递归,求左子树的最大深度;调用递归,求右子树的最大深度;返回两者的最大值,由于还有根节点所以再+1;代码class Solution { public int maxDepth(TreeNode root) { //越过叶子节点 if(root == null){ return 0; } int left原创 2020-09-25 11:06:38 · 93 阅读 · 0 评论 -
【力扣Hot100】543.二叉树的直径
题目:二叉树的直径分析:还记不记得如何求二叉树的最大深度,那么如何求穿过根节点的直径,很显然答案就是将左子树的最大深度 + 右子树的最大深度;但是题目中要求最大直径,也就是说最大直径路径不一定是穿过根节点的,所以要设置一个变量max,用来记录所有的子树的直径,然后更新最大值。思路:设置一个全局变量max;对root进行求最大深度,调用下maxDeepth方法;越过叶子节点,返回0;计算左子树最大深度left;计算右子树最大深度right;(在这个位置:计算直径 = left + r原创 2020-09-25 09:11:07 · 138 阅读 · 1 评论 -
【力扣Hot100】617.合并二叉树
题目:合并二叉树思路:假设我们要把t1和r2两棵树都合并到t1上。特判:如果t1为空,直接返回t2如果t2为空,直接返回t1递归调用,合并t1.left和t2.left,结果放在t1.left上;递归调用,合并t1.right和t2.right,结果放在t1.right上;返回t1;class Solution { public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { if (t1 == null)原创 2020-09-25 09:05:27 · 89 阅读 · 0 评论 -
【力扣Hot100】20. 有效的括号
题目: 有效的括号思路:特判:过滤空字符串创建一个辅助栈:遍历,对每一个字符进行如下操作:若为左括号,则往栈中存放右括号若为右括号,如果 栈为空 或者 该右括号与取出的栈顶元素不一样,则返回false;返回栈是否为空的状态;class Solution { public boolean isValid(String s) { //1.特判 if(s.isEmpty()) return true; //2.创建辅助栈原创 2020-09-24 23:17:32 · 106 阅读 · 0 评论 -
【力扣Hot100】1. 两数之和
题目思路:创建一个存放结果的数组创建一个哈希表: key存元素,value存元素的索引遍历,对每一个元素e作如下处理:作差:tmp = target - e;判断:tmp是否存在map中若存在 --> 把tmp与e的索引取出,返回res若不存在 --> 把e以及索引存放在map中遍历完之后,如果存在也会在遍历中把结果返回,如果不存在就会直接throw异常或者返回空数组resclass Solution { public int[] twoSum(in原创 2020-09-22 10:44:19 · 195 阅读 · 0 评论