LeetCode典型题目题解
One Day One Algorithm
整理LeetCode中一些的题目及解答
王文平->Trista_wang
好记性不如烂笔头
知其然,并知其所以然
展开
-
Longest Common Substring---最长公共子串--DP系列
最长公共字串是动态规划的典型题目,下次为小伙伴们整理下动态规划的其他题目题目描述:最长公共字串(不同于最长公共子序列,字串是连续的)str1 = “abcde”str2 = “abcdfe”,最长公共字串是abcd,长度为4思路:首先维护一个二维vector的dp数组dp [i][j] 表示公共子串中A字符串中第i个字符结尾,B字符串中第j个字符结尾的长度,找到重复子问题,判断A的第...原创 2019-08-23 22:08:46 · 268 阅读 · 0 评论 -
Remove Duplicates from Sorted Array---26--有序数组去重
题目描述:有序的数组里面移除重复的数字,并返回数组的长度类似题目还有字符串去重,hash表统计出现次数,详见字符串去重博客Example 1:Given nums = [1,1,2],Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively...原创 2019-08-21 22:32:30 · 249 阅读 · 0 评论 -
Kth Largest Element in an Array--215--找到无序数组中第K大的数字
题目描述:Example 1:Input: [3,2,1,5,6,4] and k = 2Output: 5Example 2:Input: [3,2,3,1,2,4,5,5,6] and k = 4Output: 4思路:好像没啥特殊的,就是排序就可以了,本博客选取的是快排,当然也有堆排快排可以使用库里面自带的sort函数,速度较快,自己写的很慢,我的是88ms,让我想起来研...原创 2019-08-20 20:37:25 · 286 阅读 · 0 评论 -
Reverse Linked List--206--单链表逆序
这是本专栏的第一篇博客,还是要说几句哈。读到博客的小伙伴,我已经默认你有一定的计算机基础(抑或找工作的经验了),所以就不再解释每道题目的含义了,除非特别绕口的,本博客主要是提供一种思路和一个勉强能运行的代码示例,可能不是最优解,所以还想通过博客的方式跟大家一起探讨一二。题目描述:单链表的逆序,就是反转链表Input: 1->2->3->4->5->NULLOut...原创 2019-08-20 17:51:01 · 206 阅读 · 0 评论 -
Linked List Cycle(find the start node)---142--找到环的起始点
题目描述:找到链表中环节点input : 3->2->0->-4 ->2 output : 1思路:找到头节点和相遇点到环起始点的关系,可以证明相遇点到环起始点和头节点到环起始点的距离相等证明:头节点到环节点距离x,环节点到相遇点y,相遇点到环节点z,快指针走的距离是慢指针的2倍S慢 = x + y + nC S快 = 2S慢 = x + y + mC =...原创 2019-09-02 20:40:01 · 452 阅读 · 0 评论 -
Binary Tree Level Order Traversal---102--二叉树层序遍历
题目描述:给出一颗二叉树,返回他的层序遍历,队列的解法input 1,null, 2,3 output {[1],[2],[3]}思路:层序遍历是广度优先的BFS的应用首先建立一个队列,根节点入队队列不为空的情况下,根节点出队,左右子节点入队,此时队列里是下一层的节点for循环遍历这一层的队列,同时再把他们的子节点入队,上一层的节点出队,依次类推就是层序遍历#include &l...原创 2019-09-03 15:04:49 · 181 阅读 · 0 评论 -
Binary Tree Preorder Traversal---144---二叉树前序遍历
题目描述:给出一颗二叉树,返回他的前序遍历input 1,null, 2,3 output 1,2,3思路:两种解法:递归(比较简单)和迭代迭代法:递归问题本质是栈的调用,所以递归写法可以转换为栈写法前序遍历:根-左-右首先把根节点push栈中当栈不为空的情况下,根节点(栈顶元素)出栈,再把右节点入栈,再把左节点入栈为什么先入右再入左,因为栈是先进后出,这样就是先出左后出右#...原创 2019-09-03 15:18:05 · 208 阅读 · 0 评论 -
Binary Tree Inorder Traversal---94--中序遍历
题目描述:给出一颗二叉树,返回他的中序遍历input 1,null, 2,3 output 1,3,2思路:两种解法:递归(比较简单)和迭代中序遍历:左-根-右首先把根节点push栈中,然后不断指向左指针,把所有的左子节点入栈,然后出栈栈顶元素,把指针移到他的右子节点上,继续循环#include <iostream>#include <vector>#i...原创 2019-09-03 16:20:39 · 277 阅读 · 0 评论 -
Binary Tree Postorder Traversal---145---后序遍历
题目描述:给出一颗二叉树,返回他的后序遍历input 1,null, 2,3 output 3,2,1思路:两种解法:递归(比较简单)和迭代迭代法:递归问题本质是栈的调用,所以递归写法可以转换为栈写法后序遍历:左-右-根方法一:比较复杂,要判断左节点右节点是否访问过首先把根节点push栈中,temp为栈顶,如果temp没有子节点或者其中某个子节点被访问过temp就出栈,且hea...原创 2019-09-03 16:39:39 · 147 阅读 · 0 评论 -
Maximum Depth of Binary Tree---104--求二叉树的深度
题目描述:求二叉树的最大深度,深度优先DFS,递归的完美运用方法一:递归遍历方法二:层序遍历增加一个求层数count#include <iostream>#include <vector>#include <queue>using namespace std;struct TreeNode{ int data; TreeNod...原创 2019-09-03 17:46:30 · 178 阅读 · 0 评论 -
Invert Binary Tree---226---反转二叉树
题目描述:反转二叉树,把二叉树变成左右对称的方法一:递归遍历,交换当前左右节点,不断递归调用方法二:类似于层序遍历,根节点入队,保存队首节点并出队交换队首节点的左右子节点,如果左右子节点存在,依次push进队列#include <iostream>#include <vector>#include <queue>using namespace s...原创 2019-09-03 20:23:19 · 203 阅读 · 0 评论 -
Remove duplicates from sorted List---83---删除有序链表的重复元素
题目描述:删除有序链表中的重复元素input:1->1->2->3->3 output: 1->2->3思路:直接判断当前节点和下一个节点值是否相等,相等就越过这个节点,然后依次遍历链表注意当用到next的时候要判断是否还有下一个节点#include<iostream>#include<vector>using name...原创 2019-09-02 14:42:10 · 215 阅读 · 0 评论 -
Sort List---148---链表排序(归并)
题目描述:给链表排序input : 4->2->1->3 output : 1->2->3->4思路:要求在O(nlgn)时间复杂度内,合适的排序方法快排,堆排,归并,还有O(n)的基数排序桶排序链表的特点不能通过下标访问,堆排一般是数组形式,所以最好采用归并排序(递归操作)温故而知新:回顾下归并排序,将两个已经排好序的序列合并成一个有序序列merge...原创 2019-09-02 11:52:03 · 205 阅读 · 0 评论 -
Merge Two Sorted Lists---21---合并有序链表
题目描述:合并有序链表input 1->2->4 , 1->3->4 output 1->1->2->3->4->5思路:先判断两个链表是否有一个为空建立一个虚拟的头节点当两个链表都存在的时候,比较data的值,小的那个节点就放在head后面head节点不断向后增加当有一个节点为空的时候,就把剩余的节点整体移过来,返回虚拟头节点的...原创 2019-09-01 18:45:41 · 191 阅读 · 0 评论 -
Remove Nth Node From end of list---19---删除链表倒数第N节点
题目描述:移除链表的倒数第N个节点input 1->2->3->4->5,n=2;output 1->2->3->5思路:关键在于如何巧妙找到倒数第N个节点,依旧是快慢指针首先要判断链表不为空,head的next至少要存在快指针先走N步此时如果快指针为空,则N为链表长度,返回的是head->next开始的链表反之如果快指针不为空,慢指针...原创 2019-09-01 18:35:32 · 135 阅读 · 0 评论 -
Find All Duplicates in an Array---442---找到数组中的重复元素
找到数组中的重复元素,之前有说过有序数组去重,是删除重复元素(快慢指针,相同元素时快指针走一步,不同元素时快指针慢指针都走一步,此时快指针的值赋给慢指针),现在本题是找到重复元素题目描述:input=[4,3,2,7,8,2,3,1],输出 [2,3],关键在于1<= A[i]<=n思路:正数变负数的方法,关键在于找到数组中的数和下标之间的关系,数组中的数字-1就是新下标根据新下...原创 2019-09-01 16:17:20 · 212 阅读 · 0 评论 -
Two Sum---1---两数之和两种解法
这是Leetcode的第一个题目,同时也让我看到时间复杂度的重要性本文给出两个解法,看下优秀的解法大大提高了时间复杂度题目描述:给一个数组nums=[2,7,11,15],target=9;求出两个数相加和为9的下标方法一:普通方法,循环数组,知道找到另一个数=target-循环数方法二:unordered_map的用法,里面是无序的无重复的元素,底层是hash表,map底层是红黑树#i...原创 2019-09-01 12:06:36 · 220 阅读 · 0 评论 -
Add Strings---415---字符串相加
题目描述:字符串相加“123”+“123”=“246”//思路:不难,一位一位的相加,算和及进位,根据进位情况看是否需要补一个高位//注意:string字符转化为int整数相加,-‘0’,同样int整数,转为string+‘0’//类似的还有:二进制相加,链表相加,字符串加1#include<iostream>#include<string>using nam...原创 2019-08-30 12:16:32 · 302 阅读 · 0 评论 -
Remove Duplicates from Sorted ArrayII---80---有序数组去重2
题目描述:有序数组去重,允许重复次数2思路:同样采用快慢指针的方法,多增加一个count记录还有几次重复,初始值11 一开始快指针指向1,慢指针指向02 如果快慢指针对应值相等即重复,并且count为0,那么快指针走一步3 否则:如果快慢指针对应值相等,即重复一次,那么count减1,否则,不重复,count恢复为1此时,慢指针走一步,把快指针的值赋给慢指针,然后快指针走一步返回慢指针...原创 2019-08-28 21:15:17 · 171 阅读 · 0 评论 -
Remove Duplicate Letters---316--删除字符串中的重复字符
题目描述:删除字符串中的重复字符input="bcabc", output="abc"思路:hash表+visited结合+0字符的巧妙运用1 首先建立一个hash表,里面是所有字符出现的次数2 每个字符默认设为未访问3 结果result增加一个初始值0,为了方便比较4 每循环一次字符,就把hash的次数减1,如果已经访问过,跳出,开始下个字符循环5 如果没访问过,比较这个字符和re...原创 2019-08-28 20:47:19 · 253 阅读 · 0 评论 -
Linked List Cycle---141---单链表是否有环
思路:判断链表是否有环:快慢指针法1. 首先要判断头节点和头节点的next都不为空(这样目的是链表存在环,如果为空,即false,不存在环)2. 快慢指针都指向头节点head3. 循环当fast的next和fast的next的next都存在时,开始走路(确保快指针有后继)4. 快指针每次走两步:fast = fast->next->next;慢指针走一步slow = slow...原创 2019-08-28 15:49:09 · 163 阅读 · 0 评论 -
Swap Nodes in Pairs---24---交换链表相邻节点
题目描述:交换链表中的相邻节点input : 1->2->3->4 output : 2->1->4->3思路: 首先判断有两个节点存在,这样才能完成交换while(pre->next && pre->next->next)找到一个temp节点保存第二个节点的值交换第一个节点和第二个节点pre移到下一个需要交换的地...原创 2019-09-07 17:09:02 · 251 阅读 · 0 评论