![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
leetcode
reachwang
这个作者很懒,什么都没留下…
展开
-
leetcode_79:单词搜索
这个题目就是典型的回溯法,然后我只会用一种比较耗时的回溯法,主要耗时或者耗费内存的地方在于对于访问标志数组的创建,因为每次走都是要新建一个访问标志数组的: public boolean exist(char[][] board, String word) { //boolean[][] visit = new boolean[board.length][board[0].l...原创 2020-03-25 18:11:00 · 171 阅读 · 0 评论 -
leetcode_50:Pow(x,n)
这个题目说实话刚开始感觉棘手,后来如果用心想发现没那么难,当然暴力法在此我们就不多接赘述了。1. 递归法就是将问题分解成小问题,也叫快速幂法,代码如下。一定要注意的就是对于n<0时的处理情况,将其变为n>0的情况进行处理。class Solution { public double myPow(double x, int n) { if(n == 0) r...原创 2020-03-08 21:38:04 · 118 阅读 · 0 评论 -
leetcode_263:丑数(丑数II)
给了我们一个丑数的概念,真是为了考验我们什么手段都能使出来。首先说一下第一个题目,判断一个数是不是丑数,就是不断地去除5、除3、除2就行了,当然除之前看看余数是不是0,否则的话说明已经不能被这三个数整除了,直接结束: public boolean isUgly(int num) { boolean flag = true; while(num != 1 &a...原创 2020-03-04 19:25:16 · 140 阅读 · 0 评论 -
leetcode_198:打家劫舍
这个问题的话,我觉得应该是属于贪心算法,反正思路上很明确。假设我们有一个数组flag用来存储各个位置的最大值,且数组长度大于2,那么我们在求第i个最大值时只与两个值有关:第i-1个值和第i-2个值。且flag[i] = Math.max(flag[i-1], flag[i-2]+nums[i]),因为当前的最大值要不然就是前一个的最大值,要不然就是前两个的最大值加上当前的值,只能是这两种情况。所以...原创 2020-03-02 21:38:28 · 129 阅读 · 0 评论 -
leetcode_128:最长连续序列
1. 双向寻找我也不知道我这种解法具体叫什么,思路就是:先把所有数字放到一个HashSet里然后对里面的每个数据都去双向的扩展,然后在HashSet里面去找查找的过程记录下数量,同时从HashSet里删除避免重复查找最后其实我们对于所有的连续数列只查找了一遍,时间复杂度O(n),空间复杂度O(n)代码如下: public int longestConsecutive(int...原创 2020-02-28 22:48:13 · 71 阅读 · 0 评论 -
leetcode_139:单词拆分
1. 递归+回溯这种思路比较容易想到,对于每个位置如果包含这个字符串,就去递归地判断后面的字符串。当最后的下标位置为字符串长度时,说明正好判断完,返回true。public class Solution { public boolean wordBreak(String s, List<String> wordDict) { return word_Brea...原创 2020-02-28 21:15:10 · 93 阅读 · 0 评论 -
leetcode_84:柱状图中的最大矩形
1. 暴力法这个暴力法基本上没什么难度,就是每到一个柱状就要扩展地向两边遍历,而且要保证两边的柱子都比它短才可以得到以这个柱子为中心的长方形,至于比它小的柱子我们在遍历小柱子的时候就已经考虑到了。所以核心就是要找两边都比它大的柱子。代码如下: public int largestRectangleArea(int[] heights) { int result = 0, ...原创 2020-02-26 18:35:53 · 121 阅读 · 0 评论 -
leetcode_100:相同的树
这个题目很容易想到使用递归的方法去解决,如果两个树它们的值相等,则去递归的判断它们的左子树和右子树,且要同时满足左子树和右子树都相等。当两个根节点都为null是返回true;如果只有一个为null,则返回false;如果两个根节点的值都不相等,直接返回false。代码如下: public boolean isSameTree(TreeNode p, TreeNode q) { ...原创 2020-02-26 16:14:39 · 69 阅读 · 0 评论 -
链表环的问题
1.判断一个链表有没有环这个题目很经典,剑指offer和leetcode141上都有原题,核心思想就是快慢指针,当两个指针相遇的时候说明是有环的。代码如下: public boolean hasCycle(ListNode head) { if (head == null || head.next == null) return false; ...原创 2020-02-24 22:12:00 · 150 阅读 · 0 评论 -
leetcode_146:LRU缓存机制
这个题目不用多说,就是手撕LRU。实现原理基本上就是哈希表+双向链表。但是这个结构刚开始其实挺难理解的,就是如何把他们连接在一起会感觉有点乱。其实不用想的那么复杂,这样想我们的既然是cache,那么首先有个HashMap(HashTable)来存储数据,key作为数据,value作为...原创 2020-02-23 08:44:57 · 105 阅读 · 0 评论 -
leetcode_206:反转链表
这个题目可以说是很经典了。当然思路也不难,主要分两种。递归法和迭代法,先说一下比较容易理解的迭代法。1.迭代法使用三个指针pre、cur、next,然后每次都是更新cur让其next指向pre,然后next则用来保存下一个cur的位置,更新规则如下:cur.next = pre; pre = cur; cur = next;而且每次循环的开始或者说更新前都要记住最新的next,即next =...原创 2020-02-20 08:03:41 · 75 阅读 · 0 评论 -
leetcode_238:除自身以外数组的乘积
1.左右乘积列表这个题目当然也是剑指offer里的题目,方法就是构造一个左乘积数组left,构造一个右乘积数组right,然后对于每一个i,它的结果就应该是left[i-1] * right[i+1]。思想比较好理解直接上代码: public int[] productExceptSelf(int[] nums) { if(nums.length < 2) ...原创 2020-02-19 23:32:45 · 80 阅读 · 0 评论 -
leetcode_236:二叉树的最近公共祖先
这个题目我不会,直接看的别人的解法,是递归。解释都很清晰,试着理解然后记住吧…。我看了一会,貌似理解了其中的核心:只要找到了p或者q就要返回。当然这是句废话,但也不是,因为很多句子都是为它服务的。譬如说代码(1)处,只要遇到p或者q那我这次递归就结束了,返回到上一层,上一层也就是代码(2)和(3)处然后我们看返回到(2)(3)后发生了什么,如果左和右都不为空,说明两个分支都找到了,那公共的...原创 2020-02-19 23:00:26 · 96 阅读 · 0 评论 -
leetcode_106:相交链表
1.计数法我们知道如果两个链表listA和listB,长度分别为lengthA和lengthB,则一个较长的节点只需要先走lengthA-lengthB步,就能保证他俩在某个地方相遇。代码如下: public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode pA = headA; ...原创 2020-02-19 22:06:01 · 94 阅读 · 0 评论 -
leetcode_155:最小栈
这个问题当然也是leetcode上的原题,无非就是使用一个额外的栈来存储最小值,每次入栈的时候进行判断就行了。但是如果要求空间复杂度为O(1)呢,即不使用额外的空间该怎么办。答案就是栈不存储元素,而是存储差值。总体来说就是:入栈的时候将元素x与当前最小值min的差值x-min入栈出栈的时候判断一下栈顶,如果栈顶大于等于0,那就是当前的最小值min加上栈顶。因为我们入栈的时候x-min大于0且...原创 2020-02-19 20:50:48 · 819 阅读 · 1 评论 -
leetcode_49:字母异位词分组
这个题目我是直接看的答案,其实考察的就是我们如何来表达两个词确实是异位词:首先要保证长度相等其次就要保证每个字符出现的次数一样所以我们主要还是从第二点出发。如下1. 将字符串中字符排序重组这个思路就是对于一个字符串里的所有字符进行排序然后重组,那异位词肯定是相同的。代码如下:class Solution { public List<List<String>...原创 2020-02-18 23:32:02 · 85 阅读 · 0 评论 -
leetcode_703:数据流中的第K大元素
这个题目反正我是只通过了九个测试用了,而且感觉自己的好像还挺对的。但是最后那个很长的就是通不过,说一说思路吧。这个题目一看就能看出来,使用小根堆。代码如下:class KthLargest { //维持一个大小为k的最小堆 int[] heap; public KthLargest(int k, int[] nums) { heap = new int[k...原创 2020-02-18 22:05:38 · 97 阅读 · 0 评论 -
leetcode_43:字符串相乘
一、无脑竖式法这种方法就是按照我们通常的思路,让一个数和另一个数的每一位相乘,然后把结果加起来。其中我用到了两个辅助函数:字符串相加。也就是两个字符串相加得到一个结果一个字符串和一个字符相乘,得到一个字符串但是我写的代码有问题,就是当一个数为0的情况时,会返回多个0。但看通过率的话我只有5个测试用例没有通过,也就不想改了。毕竟时间太紧张,没时间了。代码如下:class Solutio...原创 2020-02-09 20:01:25 · 248 阅读 · 0 评论 -
leetcode_143:重排链表
这个题目思路就是:先把链表分成两个长度相等(奇数的时候后半部分少一个)的子链表然后将后面的链表进行反转最后将两个链表合并,后面的链表总是插入到前面链表的后面public void reorderList(ListNode head) { if (head == null || head.next == null) //有0个或1个结点,直接返回 ...原创 2020-02-08 21:51:35 · 109 阅读 · 0 评论 -
leetcode_71:简化路径
此题主要考察的是栈,所以定义一个辅助栈;先把字符串以"/“为分隔符分割成数组,此时数组有 [“路径”],[”"],["."],["…"]这四种情况;遍历数组,当s[i].equals("…")并且栈不空时pop,当!s[i].equals("") && !s[i].equals(".") &&!s[i].equals("…"),即s[i]是路径入栈;栈空,返...原创 2020-02-08 16:08:36 · 94 阅读 · 0 评论 -
leetcode_23:合并K个排序链表
一、暴力法暴力法不用做太多解释,代码也不写了,主要是两个暴力法:每次都合并两个链表到一个上面,再用这个新链表继续和另一个链表进行合并。这样需要合并n-1次。逐一比较的方法,就是每次从这K个链表的头结点中选一个最小的,然后加到新建的链表中,重复下去。二、优先级队列(小顶堆)其实就是上面暴力法2的一个变种,我们如何从K个链表的头结点中选一个最小的。方法就是建立一个小顶堆,然后每次从堆顶就...原创 2020-02-08 15:29:41 · 178 阅读 · 0 评论 -
leetcode_3:无重复字符的最长子串
一、暴力法暴力法很简单,就是双指针。一个指针left指向起始位置,另一个指针right向后查找,每当子串s.subString(left, right-1)中不包含right所指字符s.charAt(right),就将当前的字符放到此字符串中,即长度加1。直到最后找出最长的那一个,代码如下:class Solution { public int lengthOfLongestSubst...原创 2020-02-08 11:26:59 · 83 阅读 · 0 评论 -
leetcode_560:和为K的子数组
1. 使用累加和顾名思义就是使用累加数组sums[i],每个位置上的元素就是此位置及前面所有元素之和。然后针对其中的每个元素right,求它与前面每个元素left之差,这个差就是中间元素right-left的和。这样就能求得所有的可能解: public int subarraySum(int[] nums, int k) { int[] sums = new int[nu...原创 2020-01-30 23:06:10 · 144 阅读 · 0 评论 -
leetcode_617:合并二叉树
这个题目不难,能够想到使用递归的方法去解决,最好的方法不是新建一棵树,而是把所有的改变都放在一棵树上。此处我将合并后的改变都放在了树t1上了。两棵树同时开始并按照相同的方式遍历,当两个根节点都不为null时,就将两个根节点的值加到树t1上,然后递归合并两个根节点的左子树和右子树。合并完后可能会出现有一个根节点的左子树或右子树为null的情况,此时就要进行判断,并调整。调整策略看代码注释。publ...原创 2020-01-30 16:49:43 · 167 阅读 · 0 评论 -
leetcode_647:回文子串
1. 暴力法这个题目暴力法很简单,也就是官方解法的第一种,无非就是从中间向两边扩展,然后判断对应的子串是不是回文字符串。当出现不相等的时候,就继续下一个位置的判断,重复过程。代码如下:class Solution { public int countSubstrings(String S) { int N = S.length(), ans = 0; f...原创 2020-01-30 15:09:09 · 167 阅读 · 0 评论 -
leetcod_215:数组中的第K个最大元素
这个题目是典型的用堆来解决的。关于堆无非就是有两个算法:在尾部插入元素的时候,需要自底向上的去寻找插入位置在顶部插入元素的时候,需要自顶向下的去寻找插入位置代码如下:class Solution { public int findKthLargest(int[] nums, int k) { if (nums.length < k) ...原创 2020-01-11 20:37:04 · 311 阅读 · 0 评论 -
leetcode_46:全排列
全排列,出了名的回溯法解决。不多说了,直接上代码吧:class Solution { public List<List<Integer>> permute(int[] nums) { List<List<Integer>> result = new LinkedList<>(); int[] fl...原创 2019-12-19 20:59:31 · 268 阅读 · 0 评论 -
leetcode_33:搜索旋转排序数组
这个题目的话关键在于找出旋转后数字的排列规律来。其实一个排好序的数组经过某一个点的旋转后,有一个特点就是在某个点为界限,左边是升序,右边是降序。我们其实利用一个折线图更容易理解些,如下这个点为7,其实就是最大值。那么我们既然时间复杂度是 O(log n) ,那肯定是二分法查找,只是这个求出mid后更新left和right的判断方法变了。假如我们现在就是上面的这一组数据,target为0。那么...原创 2019-12-19 20:40:12 · 282 阅读 · 0 评论 -
leetcode_131:分割回文串
遇到这个题目,我真的是头大。还是硬着头皮往下看,嗯,典型的回溯法。就写吧,回溯法我也讲不明白说实话,只是做了几道题然后慢慢找到了规律就会了。先上代码(代码花费的时间好多啊!!): public List<List<String>> partition(String s) { List<List<String>> result ...原创 2019-12-17 21:39:16 · 328 阅读 · 0 评论 -
leetcode_179:最大数
这个题目我是想到了使用自定义排序,而且要注意的是,我们是比较数字的字符串形式,因为这样容易直接从数字的高位开始比较。我们仔细想能找出构造最大数的规律:如果两个数字的位数相同,我们只需要那个最大的在前面,较小的再后面就可以了。如果两个数字位数不同,那么就要从头开始比较,哪个高位大,哪个就在前面,一直到最后。如果到了最后还没有比较出来(比如说345和3456),那么就要看较长数字的后面和开头数...原创 2019-12-17 20:42:36 · 303 阅读 · 0 评论 -
leetcode_162:寻找峰值
这个题目主要是弄懂峰值出现的时候会有哪些情况。原创 2019-12-17 19:39:42 · 322 阅读 · 0 评论 -
leetcode_739:每日温度
1. 暴力破解法这个题目本身来说直接暴力根本不难,只是暴力的话时间复杂度相对较高。暴力也就是遍历每一个元素,然后从目标元素触发向后找,找到第一个比他大的数字位置,然后用此位置减去目标元素所在的位置就是两者的间隔。代码如下: public int[] dailyTemperatures(int[] T) { int[] result = new int[T.length];...原创 2019-12-14 22:34:17 · 307 阅读 · 0 评论 -
leetcode_230:二叉搜索树中第K小的元素
这个题目我知道可以使用前序的非递归遍历,然后遍历的过程中改变k,直到找到为止。中序的遍历的非递归实现其实不难,我们只要缕清中序遍历的过程就很好写,前序遍历也就是左—>根—>右的顺序,那么我们可以先将根节点和其左子树进栈,然后在出栈的时候看看它的右子树是不是空,不为空则把右子树作为根节点进栈,并将此根节点的所有左子树进栈。这样就完成了先遍历左子树,然后根节点,最后右子树的过程。代码如下:...原创 2019-12-13 19:13:55 · 281 阅读 · 0 评论 -
leetcode_73:矩阵置零
这个题目不难,看题目最后的说明,说可以用O(mn)空间来解决,也可以用O(m+n)空间来解决。说白了这个问题就是记录每行或每列是否有0的问题,有零则设置一个标志。那么O(mn)的不用说了,就是每个位置都记录,然后用记录的标志去更新原数组。接下来说一下O(m+n)的情况:O(m+n)则是以行或者列为单位来记录,申请一个标志数组flag[rows+cols],遍历matrix的时候可以得到一个元素所...原创 2019-12-12 22:02:56 · 279 阅读 · 0 评论 -
leetcode_78:子集
这个题好意外啊,一顿分析猛如虎,一看战绩零杠五。其实我的思路是对的,只是在递归的时候没有想好参数,接下来说一下解题思路。首先看到这个题目的话,应该能想到就是使用回溯法,也就是使用递归。在我们想到要用回溯法的时候,一般递归的参数里面都会有一个层数来告诉我们什么时候返回。这里也不例外,我们这里的层数指的就是数组的下标。首先我们针对数组中的每个元素,把它构造成一个集合,并加到结果集中。针对每个元...原创 2019-12-12 21:28:15 · 308 阅读 · 0 评论 -
leetcode_61:旋转链表
这个题目也不难,只要分析出来旋转的规律就比较简单了。我看到的规律有两点:旋转了k次,其实就是对链表旋转了k % 链表长度次。旋转其实就是求倒数第k个节点,然后让这个节点及后面的节点接到头部。有了这两点,代码上可能就是要保存的变量比较多,还是要尝试写一下,但思路不难: public ListNode rotateRight(ListNode head, int k) { ...原创 2019-12-07 17:52:11 · 278 阅读 · 0 评论 -
leetcode_30:串联所有单词的子串
先看一下我的战况,看看那三个七分钟…,没办法着急了受,其实大部分时间就是花在了调边界条件上了。然后说一下思路吧:其实就是使用空间换取时间,但是我的时间没有很低,反而空间比我想象的要低一些。步骤如下:我们把words中的所有单词放到哈希表中,其中的键为每个单词,值为单词的次数。然后我们遍历这个字符串s,而且每次遍历的子串长度都应该和words数组中所有字符串长度的总和一样,即words.l...原创 2019-12-07 17:19:17 · 328 阅读 · 0 评论 -
leetcode_19:删除链表的倒数第N个节点
这个题目其实比较简单,我们都知道怎么做。无非就是先让一个指针tail指向开头pre(初始为head)的后面的第n个位置,然后pre和tail同时向后移动,tail为空的时候,pre指向的就是要删除的节点。但是我却错了很多次,当然原因就是因为边界条件,即如果只有一个节点怎么办?如果删除的是第一个节点怎么办?然后考虑了还是错。但其实并没有考虑的那么复杂,只要涉及到需要改变头结点的题目,我们只需要再加一...原创 2019-12-05 11:41:23 · 280 阅读 · 0 评论 -
leetcode_117:填充每个节点的下一个右侧节点指针 II
这个题目和leetcode_116是类似的,但是这个题目不能其中的第二种解法,因为它并不是一个完全二叉树。但是第一种解法是可行的(原谅我第一种写法写的有点冗余,但是也不想改了,算是留着个教训吧)。查看当前节点是父节点的左子节点还是右子节点。如果是左子节点则查看右子节点是否为空:不为空则让左子节点的next指向右子节点;为空则顺着父节点的next指针向下找,直到找到一个有孩子节点的树,如果没找...原创 2019-12-04 20:35:15 · 353 阅读 · 0 评论 -
leetcode_75:颜色分类
这个题目一开始并不会做,但是后来硬着头皮还是做了出来(傲娇脸!!)。咋个说呢,思路比较容易想到,就是把0放左边,2放右边,那么中间自然就是1了。我也是这样想的,我也是这样做的,哈哈。下面说一下大体思路。首先有两个指针p0和p2,它们分别从最左端和最右端出发,而且分别始终指向第一个不为0和不为2的值。然后在设置一个指针p从p0触发,直到小于等于p2.如果p所指的数字为0(当然一开始不可能,因...原创 2019-12-02 21:32:55 · 349 阅读 · 0 评论