Leetcode题解
文章平均质量分 52
北邮张博
读论文,写程序
展开
-
leetcode题解 滑动窗口总结
—核心:左右双指针(left,right)在起始点,right向右逐位滑动循环。——核心:左右双指针(left,right)在起始点,right向右逐位滑动循环。如果:窗口内满足条件,right向右扩大窗口,并更新最优结果。如果:窗口元素满足条件,left向右缩小窗口,并更新最优结果。如果:窗口元素不满足条件,right向右扩大窗口。如果:窗口元素不满足条件,left向右缩小窗口。滑动窗口使用思路(寻找最长)滑动窗口使用思路(寻找最短)——right到达结尾。——right到达结尾。原创 2023-08-27 14:17:33 · 205 阅读 · 0 评论 -
leetcode题解-27. Remove Element
解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。输入:nums = [0,1,2,2,3,0,4,2], val = 2。元素的顺序可以改变。输入:nums = [3,2,2,3], val = 3。输出:5, nums = [0,1,4,0,3]原创 2023-03-04 17:49:15 · 651 阅读 · 0 评论 -
leetcode题解-704. 二分查找
if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1。我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] (这个很重要非常重要)。输入: nums = [-1,0,3,5,9,12], target = 9。输入: nums = [-1,0,3,5,9,12], target = 2。原创 2023-03-04 16:29:31 · 449 阅读 · 0 评论 -
leetcode题解-141. Linked List Cycle
题意:判断一个单链表是否存在环分析: 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环,两个指针必定相遇 。 时间复杂度:O(n)代码:/** * Definition for singly-linked list. * class ListNode { * int val;原创 2017-12-11 22:11:15 · 280 阅读 · 0 评论 -
leetcode题解-138. Copy List with Random Pointer
题意:深拷贝一个链表,链表除了含有next指针外,还包含一个random指针,该指针指向字符串中的某个节点或者为空。节点定义为:// Definition for singly-linked list. public class RandomListNode { int label; RandomListNode next, random; RandomListNod原创 2017-12-11 21:54:09 · 391 阅读 · 0 评论 -
leetcode题解-25. Reverse Nodes in k-Group
题意:把原始链表k个k个的反转,如果最后剩余的不到k个结点,那么保持不变。例子: 给定链表: 1->2->3->4->5 如果 k = 2, 返回链表: 2->1->4->3->5 如果 k = 3, 返回链表: 3->2->1->4->5分析:前两天十大上有师兄分享17年算法岗面经时提到了本题,因此在做本题的时候也格外认真。晚上洗澡的时候理了一下思路,然后手写代码bug-free,还是很开心原创 2017-12-11 21:43:22 · 689 阅读 · 0 评论 -
leetcode题解-92. Reverse Linked List II
题意:把链表中m到n的部分反转(1<=m<=n<=length)。 注意要求:在原地反转,也就是不能申请额外的空间,且只能遍历一遍。例子: 链表 1->2->3->4->5->NULL, m = 2 and n = 4, 返回 1->4->3->2->5->NULL.解析: 参考最高票的discuss,我们模拟一下逆置的过程: 1-2-3-4-5 先把3放2前面变成 1-3-2-4-5原创 2017-12-10 14:23:27 · 592 阅读 · 0 评论 -
leetcode题解-24. Swap Nodes in Pairs
题意:给定一个链表,交换相邻的两个结点,返回交换之后的头结点。例子:给定链表 1->2->3->4, 返回链表 2->1->4->3.分析:关键在于分析循环的结束条件。以例子来说明: 设置三个指针pre,leftNode,secondNode。初始值如下, pre = dummyNode; leftNode= 节点1; secondNode = 节点2;循环条件为while(right.ne原创 2017-12-11 20:47:17 · 499 阅读 · 0 评论 -
leetcode题解-19. Remove Nth Node From End of List
题意:给一个链表和数字n,移除倒数第n个数,返回head。例子: 给定链表 1->2->3->4->5, 并且n = 2. 返回链表 1->2->3->5.原创 2017-12-11 20:15:04 · 478 阅读 · 0 评论 -
leetcode题解-61. Rotate List
题意:给出一个列表,往右旋转 k 个位置。例子:给定链表 1->2->3->4->5->NULL 并且 k = 2, 返回链表 4->5->1->2->3->NULL.分析:题目比较简单,分为三个部分来做。 1、计数,得到链表的长度。 2、找到新链表头部节点在旧链表中的前置节点,如上述例子中的节点3,同时节点3也是新链表的尾部。 3、进行对顺序变换的操作: 如果以fastNode指代节点5原创 2017-12-11 20:05:53 · 444 阅读 · 0 评论 -
leetcode题解-147. Insertion Sort List
题意:使用插入排序,将链表的值从小到大排列。分析:Insertion Sort就是把一个一个元素往已排好序的list中插入的过程。忘记插入排序过程的同学可以看插入排序维基百科初始时,sorted list是空,把一个元素插入sorted list中。然后,在每一次插入过程中,都是找到最合适位置进行插入。因为是链表的插入操作,需要维护pre,cur和next3个指针。pre用来发现合适的插入位置,cu原创 2017-12-19 21:42:21 · 494 阅读 · 0 评论 -
leetcode题解-2. Add Two Numbers
题意:给你两个表示两个非负数字的链表。数字以相反的顺序存储,其节点包含单个数字。将这两个数字相加并将其作为一个链表返回。例子:输入: (2 -> 4 -> 3) + (5 -> 6 -> 4) 输出: 7 -> 0 -> 8 解释:342 + 465 = 807.分析:这道题比较简单,两个链表相加的问题,思路很明确,就是按照位数读下去,维护当前位和进位,时间复杂度是O(n),空间复杂度是O(1)原创 2017-12-10 14:03:45 · 589 阅读 · 0 评论 -
leetcode题解-82. Remove Duplicates from Sorted List II
题意:本题是83题(Remove Duplicates from Sorted List)的拓展,这次重复的元素一个都不保留。例子: 给定链表 1->2->3->3->4->4->5, 返回链表 1->2->5. 给定链表 1->1->1->2->3, 返回链表 2->3.思路:道理还是和83题一样,只是现在要把前驱指针指向上一个不重复的元素中,如果找到不重复元素,则把前驱指针指向该元素,否则删原创 2017-12-10 15:31:21 · 367 阅读 · 0 评论 -
leetcode题解-83. Remove Duplicates from Sorted List
题意:给定一个单向已排序的链表,删除链表中重复的元素使每个元素只出现一次。 例子: 1->1->1->2,返回1->2 1->1->2->3->3->,返回1->2->3 思路:两个指针 ,分别从头开始,如果下一指针指向的元素与上一指针指向的元素相同则只将下一指针后移;否则两指针同时后移。class Solution { public ListNode deleteDuplicate原创 2017-12-10 15:16:29 · 379 阅读 · 0 评论 -
leetcode题解-86. Partition List
题意:给定一个单链表和一个x,把链表中小于x的放到前面,大于等于x的放到后面,每部分元素的原始相对位置不变。例子: 给定链表 1->4->3->2->5->2 并且x = 3, 返回链表 1->2->2->4->3->5.思路:其实很简单,遍历一遍链表,把小于x的都挂到left后,把大于等于x的都放到right后,最后再把大于等于的链表挂到小于链表的后面就可以了。/** * Definitio原创 2017-12-10 15:11:47 · 369 阅读 · 0 评论 -
leetcode题解-142. Linked List Cycle II
题意:判断一个链表是否有环,有环的话返回环的起始节点,无环的话返回NULL。分析:此题是141. Linked List Cycle的follow up。因此是剑指offer的原题,因此这里不再选用其他方法,直接采用剑指offer的方法。总共分为三步: 1、得到环的长度circleLen。 2、设置fast节点和slow节点,初始值都为head。先将fast节点走circleLen个长度。 3原创 2017-12-11 22:33:31 · 428 阅读 · 0 评论 -
leetcode题解-143. Reorder List
题意:给定一个链表,把最后一个结点插入到第1个结点后,倒数第二个结点插入到第2个结点后,倒数第三个结点插入到第3个结点后,以此类推……注意:需要在原数组上进行操作,同时不能改变链表的value。例子: 给定链表: L0→L1→…→Ln-1→Ln, 返回链表: L0→Ln→L1→Ln-1→L2→Ln-2→…给定链表 1->2->3->4->5->6 返回链表 1->6->2->5->3->4分析原创 2017-12-12 20:58:37 · 385 阅读 · 0 评论 -
leetcode题解-6. ZigZag Conversion
题意:将字符串按照锯齿形排列,然后把从上到下把所有行顺序输出,组成新的字符串。例子: Input: s = “PAYPALISHIRING”, numRows = 3 Output: “PAHNAPLSIIGYIR” Example 2:Input: s = “PAYPALISHIRING”, numRows = 4 Output: “PINALSIGYAHRPI” Exp...原创 2018-08-28 15:42:26 · 526 阅读 · 0 评论 -
leetcode题解-3、Longest Substring Without Repeating Characters
题意:给定一个字符串,求最长不重复子串(非子序列)。例子: Input: “abcabcbb” Output: 3 分析: “abc”, 它的长度为 3.Input: “bbbbb” Output: 1 分析: “b”, 它的长度为 1.Input: “pwwkew” Output: 3 分析: The answer is “wke”, with the lengt...原创 2018-08-27 15:12:02 · 562 阅读 · 0 评论 -
最长公共子序列、最长连续公共子序列、最长递增子序列
面试中除了排序问题,还会经常出现字符串的子序列问题,这里讲解使用动态规划解决三个常见的子序列问题: 1、最长公共子序列问题(LCS,longest-common-subsequence problem) 2、最长连续公共子序列问题 3、最长递增子序列(LIS,longest-increment-subsequence)最长公共子序列问题LCS问题描述:给定两个序列X=&l...原创 2018-04-04 17:49:02 · 11064 阅读 · 0 评论 -
面试中常用的排序算法
排序算法是算法的入门知识,其经典思想可以用于很多算法当中。因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题。但万变不离其宗,只要熟悉了思想,灵活运用也不是难事。一般在面试中最常考的是快速排序和归并排序,并且经常有面试官要求现场写出这两种排序的代码。对这两种排序的代码一定要信手拈来才行。还有插入排序、冒泡排序、堆排序、选择排序、基数排序、桶排序等。面试官对于这些排序可能会要原创 2017-12-29 11:47:13 · 2479 阅读 · 0 评论 -
leetcode题解-23. Merge k Sorted Lists
题意:合并k个有序的链表,分析描述算法的复杂度。分析:这道题目在分布式系统中非常常见,来自不同client的sorted list要在central server上面merge起来。解法就是有点类似于归并排序的思路,就是分治法,不了解归并排序的朋友,请参见归并排序-维基百科,是一个比较经典的O(nlogn)的排序算法,还是比较重要的。思路是先分成两个子任务,然后递归求子任务,最后回溯回来。这个题目也原创 2017-12-18 22:34:50 · 442 阅读 · 0 评论 -
leetcode题解-21. Merge Two Sorted Lists
题意:合并两个排好序的链表,并返回这个新链表。新链表应该由这两个链表的节点拼接而成。例子:给定链表 l1: 1->2->4, l2: 1->3->4 返回链表: 1->1->2->3->4->4分析:本题是简单题,但是我做出来却花费约四十分钟。因为感觉两个链表节点的大小关系不好定。做完以后我看了一下discuss,基本上都是使用递归来做的,我个人不喜欢用递归,因为空间的消耗量太大。因此就写出了原创 2017-12-18 21:48:31 · 358 阅读 · 0 评论 -
leetcode分类题解
leetcode的题解专栏多如牛毛,但很少有系统的全面的专栏。在专栏里,按照如下的分类方式进行刷题,从暴力解-&amp;amp;gt;优化解-&amp;amp;gt;最优解三个层次来分析题目,希望能够帮助到找工作的你。数组Remove Duplicates from Sorted Array Remove Duplicates from Sorted Array II Search in Rotated Sorted Array Sea原创 2017-12-18 19:45:00 · 4569 阅读 · 1 评论 -
leetcode题解-88. Merge Sorted Array
题解:给定两个排序的整型数组nums1和nums2,将nums2合并到nums1成一个排序数组。你可以假设nums1中有足够的空间(空间大于或等于m+n)来存放来自nums2的额外元素。nums1和nums2的初始空间分别是m和n。分析:题目本身比较简单,要求in-place处理数组,因此不能另外申请一个m+n的数组nums3。好在nums1有足够的空间,但是如果从数组头部开始merge的话,可能会原创 2017-12-18 16:53:31 · 637 阅读 · 0 评论 -
leetcode题解-150. Evaluate Reverse Polish Notation
题意:这道题是逆波兰式的求解,不了解逆波兰式的朋友可以参考一下逆波兰表示法 - wiki。例子: [“2”, “1”, “+”, “3”, ““] -> ((2 + 1) 3) -> 9 [“4”, “13”, “5”, “/”, “+”] -> (4 + (13 / 5)) -> 6逆波兰式有个优点就是他不需要括号来表示优先级,直接根据式子本身就可以求解。思路是维护一个运算数栈,读到运算数的原创 2017-12-16 17:37:29 · 661 阅读 · 0 评论 -
leetcode题解-84.Largest Rectangle in Histogram
题解:给出的n个非负整数表示每个直方图的高度,每个直方图的宽均为1,在直方图中找到最大的矩形面积。例子:给定数组: height = [2,1,5,6,2,3],返回 10 (5 * 2) 分析:总体来说首先很自然会想到暴力法解决,但是优化的方式不容易想到。自己看了网上的答案都特别抽象,看了一个多小时最后靠举例子才勉强明白怎么优化。1、暴力法 首先,可以使用暴力破解法。以每一个数字作为高度,遍历原创 2017-12-16 16:39:49 · 1078 阅读 · 0 评论 -
leetcode题解-32. Longest Valid Parentheses
题意:给定一个括号组成的字符串,要求求出最长的合法括号长度。例子: 输入: s = “(()” 输出: 2输入: s = “)()())” 输出: 4分析:一开始我想的是,当遇到”(“时,将”(“入栈;遇到”)”时,如果栈不为空,那么弹出一个”(“,然后最大长度加2;如果栈为空,就说明count需要重新计数。即:for(int i = 0; i < len; i++){ if(s.原创 2017-12-15 10:28:32 · 554 阅读 · 0 评论 -
leetcode题解-20. Valid Parentheses
题意:给出一个只包含 ‘(‘, ‘)’, ‘{‘, ‘}’, ‘[’ 和 ‘]’ 的字符串,判断它的输入是否是有效的。例子:括号必须是以正确的顺序关闭的, “()” 和 “()[]{}” 都是有效的,但是 “(]” 和 “([)]” 是无效的。分析:判断括号匹配的合法性。需要使用一个栈来解决问题。遇到左括号入栈,遇到右括号,检查栈顶的左括号是否匹配,如果匹配,弹栈,如果不匹配,返回错误。 需要注意原创 2017-12-14 09:57:47 · 351 阅读 · 0 评论 -
leetcode题解-146. LRU Cache
题意:本题的题目较难读懂,不过这能考察一个面试者能否短时间内,理解一段未见过的内容的能力。在题目的wiki链接里提供了这样一张图: 缓存的长度(capacity )为4,A、B、C、D首先插入缓存中;插入E时,超过了capacity ,需要覆盖最近最少使用的A;插入F时,超过了capacity ,需要覆盖B。为最近最少使用(LRU)的缓存策略设计一个数据结构,它应该支持以下操作:获取数据(get)原创 2017-12-12 22:22:16 · 1032 阅读 · 0 评论 -
leetcode题解-58. Length of Last Word
题意:给定字符串,求最后一个单词的长度。单词和单词间用空格隔开,若不存在,返回0分析:这道题难度不是很大。先对输入字符串做预处理,去掉开头和结尾的空格,然后用一个计数器来累计非空格的字符串的长度,遇到空格则停止计数。代码如下:class Solution { public int lengthOfLastWord(String s) { int len = s.length原创 2017-11-13 22:54:13 · 368 阅读 · 0 评论 -
leetcode题解-71. Simplify Path
题意:对于给定的类Unix系统的文件路径,对其进行简化。分析:在Unix系统中”.”表示当前路径,”..”表示上一级路径。这道题要使用一个栈,来保存当前的路径状况。我们首先需要按照“/”将地址进行分割,分割出不同的操作: 1、如果是空或者“.”,那么当前没有什么地址变动,地址栈不需要变动 。 2、如果是“..” 则需要出栈(如果栈为空则不操作)因为这是返回上级目录的符号 。 3、其他情况压栈原创 2017-11-13 22:45:41 · 362 阅读 · 0 评论 -
leetcode题解-49. Group Anagrams
题意:给出若干个字符串,将他们按照组成的字符集合进行分组。例子: input:["eat", "tea", "tan", "ate", "nat", "bat"]output:[ ["ate", "eat","tea"], ["nat","tan"], ["bat"]]这道题目的关键之处,其实就是怎么样判断两个字符串拥有相同的“字符集”,这样类型的判断通常有两种方法:第一原创 2017-11-13 22:35:09 · 503 阅读 · 0 评论 -
leetcode题解-31. Next Permutation
题目:对于给定的一个全排列,求解其“下一个”全排列。对于不了解全排列是什么的同学,可以点击此处进行查看全排列-百度百科。例子: 1,2,3 → 1,3,2 3,2,1 → 1,2,3 1,1,5 → 1,5,1题解:这道题让我们求下一个排列顺序,可以分为两种情况。第一种,类似于[6,5,4,3,2,1]这种,这是全排列中最后一个排列,那么直接将数组逆序,返回[1,2,3,4,5,6]即可。第二原创 2017-10-23 20:36:47 · 659 阅读 · 0 评论 -
leetcode题解-27. Remove Element
题意:把数组中与给定值相同的元素删除,在原数组上修改,返回值是最终元素个数。例如:nums = [3,2,2,3], val = 3 将val=3删除完以后,最终元素个数为2,返回2。思路:用一个索引i记录不含给定数字的数组边界,另一个索引j记录当前遍历到的数组位置。只有nums[j] != val时,才会赋值nums[i] = nums[j]。复杂度:时间 O(N) 空间 O(1)publi原创 2017-10-23 19:30:13 · 465 阅读 · 0 评论 -
leetcode题解-128. Longest Consecutive Sequence
题目:给出一个没有排序的整数数组,找出最长的连续元素序列的长度。 例如, 给定[100,4,200,1,3,2], 最长的连续元素序列是[1,2,3,4]。返回它的长度:4。 你的算法应该运行在O(n)的复杂度。分析:将所有数都加入集合或者MAP中,然后再遍历这些数。我们以MAP举例,选取关键元素向上或者向下检查有无连续值。比如选取关键元素4,先往上找,MAP中不存在5。再在MAP中原创 2017-10-13 22:17:59 · 481 阅读 · 0 评论 -
leetcode题解-4. Median of Two Sorted Arrays
本题难度为hard,确实不容易做出来。之前做的时候时间复杂度最差应该是O(m+n),不符合题目要求,因此这次再刷的时候又反复看资料,选择了一个O(log(m+n))的方法。其实还有一个O(log(min(m,n)))的方法在官方的article中,但是不容易理解,并且不具有代表性,因此这里只介绍O(log(m+n))的算法。该问题的核心是将原问题分解成一个寻找第k小数的问题(假设两个原序列升序排列)原创 2017-10-13 21:01:54 · 822 阅读 · 0 评论 -
leetcode题解-135. Candy
题目:给小孩分糖果,每个小孩至少要分一个糖果,如果这个小孩的rating比相邻的小孩高,那么他分的糖果也要比相邻小孩多,问最少需要多少糖果?题目分析:使用额外空间candy[n]表示每个孩子的糖果数,在遍历过程中,如果第i+1位的孩子的ratings大于第i位孩子的ratings,那么给第i+1位的孩子糖果数=给第i位的孩子的糖果数+1。 如果孩子i+1的rate小于等于孩子i 的rate怎么办?原创 2017-10-28 17:35:58 · 555 阅读 · 0 评论 -
leetcode题解-81 Search in Rotated Sorted Array II
本题和上一题Search in Rotated Sorted Array唯一的区别是,这道题目中元素会有重复的情况出现。正是因为这个条件的出现,出现了比较复杂的情况,影响到了算法的时间复杂度。 原来我们是依靠中间和边缘元素的大小关系,来判断哪一半是不受rotate影响,仍然有序的。而现在因为重复的出现,如果我们遇到中间和边缘相等的情况,我们就丢失了哪边有序的信息,因为哪边都有可能是有序的结果。假设原创 2017-10-11 19:09:57 · 848 阅读 · 0 评论 -
leetcode题解-134. Gas Station
题目:环形路线上有N个加油站,每个加油站有汽油gas[i],从每个加油站到下一站消耗汽油cost[i],问从哪个加油站出发能够回到起始点,如果都不能则返回-1(注意,解是唯一的)。题目分析:暴力的方法比较容易想到,就是从每一个站开始,一直走一圈,累加过程中的净余的油量,看它是不是有出现负的,如果有则失败,从下一个站开始重新再走一圈;如果没有负的出现,则这个站可以作为起始点,成功。时间复杂度是O(n^原创 2017-10-27 17:28:24 · 706 阅读 · 0 评论