LeetCode
小青蛙lz
Stay Hungry. Stay Foolish.http://www.bewindoweb.com/dwg.php
展开
-
128. 最长连续序列
题目给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。算法思路此题难度定位为hard,实则没这么困难,难就难在题目要求时间复杂度必须为O(n),也就是最多遍历一遍。既然有时间复杂度的要求,说明需要额外的空间,通过牺牲空间来换取时间。此处数组不好删除,所以,引入一个集合HashSet,存放数组元素,然后遍历每个元素,先前和向原创 2020-05-26 13:59:03 · 171 阅读 · 0 评论 -
58. 获取最后一个单词的长度
题目给定一个仅包含大小写字母和空格 ’ ’ 的字符串 s,返回其最后一个单词的长度。如果字符串从左向右滚动显示,那么最后一个单词就是最后出现的单词。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例:输入: “Hello World”输出: 5算法思路方法一: 直接通过库函数split(),将字符串以空格符分割为字符串数组,然后字符串数组最后一个字符串的长度即可。此方法时间和空间复杂度都是O(N),效率不算高,但是比较实用。方原创 2020-05-23 16:13:45 · 160 阅读 · 0 评论 -
394. 两个数组的交集
题目给定两个数组,编写一个函数来计算它们的交集。示例 1:输入: nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2] 示例 2:输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4]这是一个典型的数组类型题目,并且解题方法多样,主要分三种方法:哈希表,双指针,二分查找。哈希表首先定义两个哈希表 HashSet,第一个用于保存nums1数组中每个元素值;然后再依次遍历nums2中的每个元素,如果nums2中的元素原创 2020-05-14 16:09:28 · 177 阅读 · 0 评论 -
152.乘积最大子数组
题目LeetCode 152 题给你一个整数数组 nums ,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。示例 1:输入: [2,3,-2,4]输出: 6解释: 子数组 [2,3] 有最大乘积 6。示例 2:输入: [-2,0,-1]输出: 0解释: 结果不能为 2, 因为 [-2,-1] 不是子数组。算法思路最开始我用一个二维数组存放nums[i,j]的乘积,将所有i到j的乘积都计算出来存放在二维数组中,这样时间复杂度很高,会超原创 2020-05-13 10:20:44 · 190 阅读 · 0 评论 -
回文串系列
目录导言单一回文串最长回文子串中心扩展法动态规划导言回文,顾名思义就是正着读倒着读都是一样的,回文字符串系列问题在字符串问题中占了很大的比重,通过回文串可以延伸出很多相类似的题目,会用到不同的算法,各有千秋,例如动态规划、分治、回溯、双指针、递归等算法。下面就从最简单的回文字符串开始一步步深入讨论。单一回文串一个最简单的题目就是给出一个字符串,判断是否是回文串,其中这个字符串只包含连续的字...原创 2020-05-08 17:27:21 · 888 阅读 · 0 评论 -
动态规划(Dynamic Programming)
目录导言什么是动态规划??动态规划的思考步骤能用动态规划解决问题的特点实例Problem【爬楼梯】【不同路径I II】导言对于动态规划,一直都是算法笔面试中的重难点,并且动态规划是通过牺牲空间来换取时间的方式解决实际问题,本文旨在说明什么是动态规划,以及面对动态规划问题,一般的思考步骤以及注意事项等,并通过一些题目结合起来。什么是动态规划??【维基百科】动态规划(Dynamic progr...原创 2020-05-05 14:33:39 · 555 阅读 · 0 评论 -
跳跃游戏 I II
55.跳跃游戏 I算法思路我们的目标就是看每次的数字加上本省的位置是否能够到达最后的位置,可以通过贪心算法来进行求解。首先我们分析一下整体的过程,我们就是从每一个位置跳,如果能跳到最后的位置,那就说明可以到。我们就直接计算每一个位置能够跳的最远的距离,记录下来,之后全局来看最远的距离是不是能够到最后的位置或者超过最后的位置即可。主要分两部分:首先要看能不能跳到下一个位置其次记录每个位置...原创 2020-05-04 10:15:54 · 172 阅读 · 0 评论 -
72.编辑距离(动态规划)
题目72.编辑距离动态规划首先来说是动态规划(Dynamic Programing),说实话,我以前真没有完全理解并运用它,只是简单看了点皮毛,但在最近刷题时,发现很多题目运用动态规划很简单就解决了,也就激发了我学习并写这篇文章的兴趣。我在网上看有大佬说过90%的字符串类型的问题都可以运用动态规划解决。下面就说说动态规划的几大要素,动态规划就是用历史记录来解当前的解,避免重复计算,而...原创 2020-04-30 16:31:07 · 260 阅读 · 0 评论 -
只出现一次的数字系列
题目给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例 :输入: [1,2,1,3,2,5]输出: [3,5]算法思路此题看是简单,首最暴力的解法就是直接运用双层循环,此方法的时间复杂度为O(N^2),复杂度最高,效率低。方法二: 是运用map来解题,此种方法时间复杂度为O(N),但引入了map,空间复杂度为O(N),...原创 2020-04-28 11:54:07 · 142 阅读 · 0 评论 -
30.串联所有单词的子串
题目给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考虑 words 中单词串联的顺序。示例输入:s = “wordgoodgoodgoodbestword”,words = [“word”,“good”,“best”,“word”]输...原创 2020-04-27 11:21:17 · 214 阅读 · 0 评论 -
199.二叉树的右视图
题目给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]算法思路本题的最终目的就是求二叉树每一层最右边的那个节点的值。既然是求每层的最后一个节点,可以采用DFS深度优先算法和BFS广度优先算法来进行求解。DFS我们按照 「根结点 -> 右子树 -> 左...原创 2020-04-23 17:43:47 · 146 阅读 · 0 评论 -
21.合并两个有序链表
题目将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4本题在链表题目中是简单题目,实现起来也不难,可以通过两种方法来实现。一、递归法这道题可以使用递归实现,新链表也不需要构造新节点,递归三个要素:终止条件...原创 2020-04-23 16:56:40 · 122 阅读 · 0 评论 -
1248.统计「优美子数组」
题目给你一个整数数组nums 和一个整数 k。如果某个 连续 子数组中恰好有 k 个奇数数字,我们就认为这个子数组是「优美子数组」。请返回这个数组中「优美子数组」的数目。示例 1:输入:nums = [1,1,2,1,1], k = 3输出:2解释:包含 3 个奇数的子数组是 [1,1,2,1] 和 [1,2,1,1] 。示例 2:输入:nums = [2,4,6]...原创 2020-04-22 11:06:36 · 163 阅读 · 0 评论 -
20.有效的括号
算法思路本题堪称经典,使用了Map,List两个集合类,同时引入栈来处理,使问题简单化。首先定义HashMap用于存放一对括号的键值对; 如果首字母不是左括号,直接返回false; 在声明一个LinkedList,用于对输入的字符串处理,由于会频繁的向集合中插入,删除集合,所以使用LinkedList而不是用ArrayList,ArrayList在查询时效率更高,这里还可以用St...原创 2020-04-20 16:14:39 · 101 阅读 · 0 评论 -
17.电话号码组合
思路算法:由于每次输入的数字组合个数不同,通过暴力解法当数字个数太多时,会有多层循环,效率低下,可以采用递归回溯法。回溯法代码开着简单,要明白原理结合图更好理解,递归结束条件是非常重要的一环,不能够让其进入死循环。本题解题思路:...原创 2020-04-20 11:32:41 · 183 阅读 · 0 评论 -
8.字符串转换整数(atoi)
思路本题看似简单,实现起来比较困难,有许多细节需要注意:字符串前面的空格处理去除前面的空格后,当前第一个字符正负号的处理去除空格后,需要重新判断当前字符串的长度是否为0当首字符中间有非数字是,要跳出循环返回符号乘以结果要先判断结果是否超出界限Interger.MAX或Interger.MIN,再更新res的值,否则当输入值为max-1时会输出错误的值max;具体步骤通过字符串...原创 2020-04-20 10:58:14 · 92 阅读 · 0 评论 -
11.盛最多水的容器
算法思路此类问题用双指针法,效率最高。双指针,顾名思义就是使用两个指针变量,分别初始化为开始位置和末尾位置,在条件适合时,i++或j–;直到i和j相等,循环结束。矩阵的面积与两个因素有关:矩阵的长度:两条垂直线的距离矩阵的宽度:两条垂直线其中较短一条的长度因此,要矩阵面积最大化,两条垂直线的距离越远越好,两条垂直线的最短长度也要越长越好。设置两个指针 left 和 right,分别指向...原创 2020-04-18 10:03:34 · 111 阅读 · 0 评论 -
55.跳跃游戏
算法思路:看似简单,实则也简单,思路很重要。方法一 :首先定义一个最大值maxRight用于存放每次循环的索引i位置能够到达的最远位置,每循环一次更新,如果在i时,maxRight的值比 i 小,则说明false,若当i的值为length-1时,maxRight的值仍大于等于i,则为true。方法二:***贪心算法***局部最优达到全局最优。每个位置都计算自己能达到的最远距离,同时每个位置要...原创 2020-04-17 17:23:23 · 77 阅读 · 0 评论 -
56.合并区间
解题思路:首先将二维数组进行排序,按照每个区间的第一个数字排序,再新建一个List<int[]> res用于存放结果集。先把排序好的第一个区间加入res中,intervals从第二个区间开始遍历,依次判断intervals对应的首位值和res中的最后一个区间的末位值,如果首位值比末位值大,将此次intervals的区间加入res中,否则将res最后一个区间的末位值更新为interva...原创 2020-04-16 16:43:14 · 126 阅读 · 0 评论 -
445.两数相加 II
算法由于链表数据相加是逆序的,可以通过栈来存储链表数据,栈是先进后出,顺序就变成了从末位相加,其实本题难度不大,就是不太容易想到使用栈来存数据计算。代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNod...原创 2020-04-14 16:54:24 · 96 阅读 · 0 评论 -
19.删除链表的倒数第N个节点
Leecode 19.删除链表的倒数第N个节点算法方法一:遍历两次,一种是遍历两次,第一次求链表的size,第二次遍历将倒数第N个节点转换为正数第L-N+1个节点,L是链表的长度,这种方法好理解,也易实现;方法二:遍历一次,首先我们将添加一个哑结点作为辅助,该结点位于列表头部。需要使用两个指针start和end,初始start和end都是head的值;end先向前移动n+1(多了一个哑结点)...原创 2020-04-14 14:15:45 · 82 阅读 · 0 评论