LeetCode
主要涉及LeetCode题目的解析
Jaster_wisdom
程序员
展开
-
LeetCode300. 最长上升子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。 你算法的时间复杂度应该为 O(n2) 。题目分析:方法一:动态规划,用dp[i]表示以nums[i]结尾的最长...原创 2018-08-22 15:01:21 · 1455 阅读 · 0 评论 -
LeetCode154. 寻找旋转排序数组中的最小值 II
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。注意数组中可能存在重复的元素。示例 1:输入: [1,3,5]输出: 1示例 2:输入: [2,2,2,0,1]输出: 0题目分析:当没有重复元素的时候,我们只要将中间元素和两端点的元素进行...原创 2018-08-19 16:10:55 · 603 阅读 · 0 评论 -
LeetCode232. 用栈实现队列
使用栈实现队列的下列操作:push(x) -- 将一个元素放入队列的尾部。 pop() -- 从队列首部移除元素。 peek() -- 返回队列首部的元素。 empty() -- 返回队列是否为空。示例:MyQueue queue = new MyQueue();queue.push(1);queue.push(2); queue.peek(); // 返回 1qu...原创 2018-08-20 16:36:34 · 1171 阅读 · 0 评论 -
LeetCode215. 数组中的第K个最大元素
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。方法一:排序后求解...原创 2018-08-20 18:50:32 · 1013 阅读 · 0 评论 -
LeetCode226. 翻转二叉树
翻转一棵二叉树。示例:输入: 4 / \ 2 7 / \ / \1 3 6 9输出: 4 / \ 7 2 / \ / \9 6 3 1代码展示:/** * Definition for a binary tree node. * struct TreeNode { ...原创 2018-08-20 22:22:40 · 482 阅读 · 0 评论 -
LeetCode216. 组合总和 III
找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数,并且每种组合中不存在重复的数字。说明:所有数字都是正整数。 解集不能包含重复的组合。 示例 1:输入: k = 3, n = 7输出: [[1,2,4]]示例 2:输入: k = 3, n = 9输出: [[1,2,6], [1,3,5], [2,3,4]]题目分析:DFS,为...原创 2018-08-21 11:28:20 · 769 阅读 · 1 评论 -
LeetCode200. 求岛屿的个数
给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1示例 2:输入:11000110000010000011输出: 3题目分析:用DFS求解,即求图中连通分...原创 2018-08-14 13:16:14 · 1132 阅读 · 0 评论 -
LeetCode199. 二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。示例:输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释: 1 <--- / \2 3 <--- \ \ 5 4 <---题目分析:本题的大意即求一...原创 2018-08-14 16:23:26 · 629 阅读 · 0 评论 -
LeetCode207. 课程表
现在你总共有 n 门课需要选,记为 0 到 n-1。在选修某些课程之前需要一些先修课程。 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1]给定课程总量以及它们的先决条件,判断是否可能完成所有课程的学习?示例 1:输入: 2, [[1,0]] 输出: true解释: 总共有 2 门课程。学习课程 1 之前,你需要完成课程 0。所以这是可能...原创 2018-08-14 19:37:44 · 605 阅读 · 0 评论 -
LeetCode208. 实现 Trie (前缀树)
实现一个 Trie (前缀树),包含 insert, search, 和 startsWith 这三个操作。示例:Trie trie = new Trie();trie.insert("apple");trie.search("apple"); // 返回 truetrie.search("app"); // 返回 falsetrie.startsWith("app...原创 2018-08-14 20:09:08 · 644 阅读 · 0 评论 -
LeetCode135. 分发糖果
老师想给孩子们分发糖果,有 N 个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。 相邻的孩子中,评分高的孩子必须获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例 1:输入: [1,0,2]输出: 5解释: 你可以分别给这三个孩子分发 2、1、2 颗糖果。示...原创 2018-08-16 09:53:11 · 745 阅读 · 0 评论 -
LeetCode43. 字符串相乘
给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 = "2", num2 = "3"输出: "6"示例 2:输入: num1 = "123", num2 = "456"输出: "56088"题目分析:如果两个字符串中有一个为0,则结果是0;否则的话,将其中一原创 2018-08-08 21:37:00 · 549 阅读 · 0 评论 -
LeetCode442. 数组中重复的数据
给定一个整数数组 a,其中1 ≤ a[i] ≤ n (n为数组长度), 其中有些元素出现两次而其他元素出现一次。找到所有出现两次的元素。你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗?示例:输入:[4,3,2,7,8,2,3,1]输出:[2,3]题目分析:本题关键是条件:a[i]的值在[1,n]之间,那么看序列[4,3,2,7,8,2,3,1],第一个...原创 2018-08-09 21:11:40 · 1050 阅读 · 0 评论 -
LeetCode187. 重复的DNA序列
所有 DNA 由一系列缩写为 A,C,G 和 T 的核苷酸组成,例如:“ACGAATTCCG”。在研究 DNA 时,识别 DNA 中的重复序列有时会对研究非常有帮助。编写一个函数来查找 DNA 分子中所有出现超过一次的10个字母长的序列(子串)。示例:输入: s = "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"输出: ["AAAAACCCCC", "CCC...原创 2018-08-11 21:06:02 · 1721 阅读 · 0 评论 -
LeetCode198. 打家劫舍
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。示例 1:输入: [1,2,3,1]输出: 4解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃...原创 2018-08-11 23:10:25 · 398 阅读 · 0 评论 -
LeetCode845. 数组中最长的山脉
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3 存在 0 < i < B.length - 1 使得 B[0] < B[1] < ... B[i-1] < B[i] > B[i+1] > ... > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)...原创 2018-07-26 20:35:40 · 871 阅读 · 0 评论 -
LeetCode114. 二叉树展开为链表
给定一个二叉树,原地将它展开为链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6题目分析:由题目的例子,我们可以通过以下几步来展开二叉树:1.首先,将根节点的...原创 2018-07-28 10:30:20 · 1475 阅读 · 0 评论 -
LeetCode116. 填充同一层的兄弟节点
给定一个二叉树struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。说明:...原创 2018-07-28 10:54:32 · 353 阅读 · 0 评论 -
LeetCode128. 最长连续序列
给定一个未排序的整数数组,找出最长连续序列的长度。要求算法的时间复杂度为 O(n)。示例:输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, 4]。它的长度为 4。题目分析:由于要求时间复杂度为O(n),所以不能直接进行排序,由此想到用空间换时间,Hash Table实现。将所有的数存进未排序的set, set中的元素是不...原创 2018-07-28 12:16:08 · 1658 阅读 · 1 评论 -
LeetCode129. 求根到叶子节点数字之和
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。示例 1:输入: [1,2,3] 1 / \ 2 3输出: 25解释:从根到叶子节点路径 1->2 ...原创 2018-07-28 14:26:46 · 671 阅读 · 0 评论 -
LeetCode130. 被围绕的区域
给定一个二维的矩阵,包含 'X' 和 'O'(字母 O)。找到所有被 'X' 围绕的区域,并将这些区域里所有的 'O' 用 'X' 填充。示例:X X X XX O O XX X O XX O X X运行你的函数后,矩阵变为:X X X XX X X XX X X XX O X X解释:被围绕的区间不会存在于边界上,换句话说,任何边界上的 'O' 都...原创 2018-07-29 09:39:50 · 632 阅读 · 0 评论 -
LeetCode141. 环形链表
题目大意:判断给定的一个链表是否有环?题目分析:使用快慢指针,快指针每次走两步,慢指针每次走一步,如果存在环的话,那么它们一定会相遇;如果不存在环的话,快指针会先为空。代码展示:class Solution {public: bool hasCycle(ListNode *head) { if(head==NULL || head->next==NUL...原创 2018-07-29 18:58:55 · 331 阅读 · 0 评论 -
LeetCode142. 环形链表II
题目分析:本题是要找到一个环形链表的第一个入环节点,分析:设置快指针每次走两步、慢指针每次走一步,当它们相遇时,表示该链表有环。然后再将slow指针指向头结点,slow和fast同时向前走,下一个相遇的点即是入环节点。证明:代码展示:class Solution {public: ListNode *detectCycle(ListNode *head) { ...原创 2018-07-29 21:00:21 · 739 阅读 · 0 评论 -
LeetCode23. 合并K个排序链表
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。示例:输入:[ 1->4->5, 1->3->4, 2->6]输出: 1->1->2->3->4->4->5->6题目分析:本题首先将每个链表的首元素取出,构建一个最小堆。堆顶则为最小的元素,用最小元素所在的那个链表的第二个元...原创 2018-08-01 16:30:00 · 1163 阅读 · 0 评论 -
LeetCode144. 二叉树的前序遍历
二叉树的前序遍历主要有两种方法实现:1.递归实现:class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; preorder(ans,root); return ans; } ...原创 2018-08-01 17:15:00 · 746 阅读 · 0 评论 -
LeetCode179. 最大数
给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数。示例 1:输入: [10,2]输出: 210示例 2:输入: [3,30,34,5,9]输出: 9534330说明: 输出结果可能非常大,所以你需要返回一个字符串而不是整数。题目分析:首先,将vector内的数都转换成string类型,便于后面的比较大小和输出。然后,定义cmp比较函数,假设有数字m,数字n...原创 2018-08-02 16:46:15 · 682 阅读 · 0 评论 -
LeetCode131. 分割回文串
给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串。返回 s 所有可能的分割方案。示例:输入: "aab"输出:[ ["aa","b"], ["a","a","b"]]题目分析:DFS+回溯代码展示:class Solution {public: vector<vector<string&原创 2018-08-02 19:04:52 · 1268 阅读 · 0 评论 -
LeetCode160. 相交链表
编写一个程序,找到两个单链表相交的起始节点。 例如,下面的两个链表:A: a1 → a2 ↘ c1 → c2 → c3 ↗ B: b1 → b2 → b3在节点 c1 开始相交。题目分析:首先求出链表A和链表...原创 2018-08-04 10:35:12 · 470 阅读 · 0 评论 -
LeetCode167. 两数之和 II - 输入有序数组
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。 你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 15],...原创 2018-08-04 10:51:08 · 438 阅读 · 0 评论 -
LeetCode148.排序链表
在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。示例 1:输入: 4->2->1->3输出: 1->2->3->4示例 2:输入: -1->5->3->4->0输出: -1->0->3->4->5题目分析:对链表进行归并排序,首先,用快慢指针找到链表的中点,然原创 2018-08-04 11:53:42 · 424 阅读 · 0 评论 -
LeetCode151. 翻转字符串里的单词
给定一个字符串,逐个翻转字符串中的每个单词。示例: 输入: "the sky is blue",输出: "blue is sky the".说明:无空格字符构成一个单词。 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。题目分析:首先将原字符串逆转,然后挨个逆转连续的子串,特别要注...原创 2018-08-04 14:35:58 · 1624 阅读 · 0 评论 -
LeetCode153. 寻找旋转排序数组中的最小值
假设按照升序排序的数组在预先未知的某个点上进行了旋转。( 例如,数组 [0,1,2,4,5,6,7] 可能变为 [4,5,6,7,0,1,2] )。请找出其中最小的元素。你可以假设数组中不存在重复元素。示例 1:输入: [3,4,5,1,2]输出: 1示例 2:输入: [4,5,6,7,0,1,2]输出: 0题目分析:旋转数组在某一点旋转之后,一般情况下是前...原创 2018-08-04 15:17:07 · 626 阅读 · 0 评论 -
LeetCode150. 逆波兰表达式求值
根据逆波兰表示法,求表达式的值。有效的运算符包括 +, -, *, / 。每个运算对象可以是整数,也可以是另一个逆波兰表达式。说明:整数除法只保留整数部分。 给定逆波兰表达式总是有效的。换句话说,表达式总会得出有效数值且不存在除数为 0 的情况。示例 1:输入: ["2", "1", "+", "3", "*"]输出: 9解释: ((2 + 1) * 3) = 9示...原创 2018-08-04 21:14:50 · 314 阅读 · 0 评论 -
LeetCode349. 两个数组的交集
给定两个数组,写一个函数来计算它们的交集。例子: 给定 num1= [1, 2, 2, 1], nums2 = [2, 2], 返回 [2].提示:每个在结果中的元素必定是唯一的。 我们可以不考虑输出结果的顺序。题目分析:首先,将num1的元素存进s1,完成了一步去重;同样,将num2的元素存进s2,也完成了一步去重;将所有的元素存进s. 所以s=s1s2,要求的是s1s2. ...原创 2018-08-05 21:28:19 · 640 阅读 · 0 评论 -
LeetCode120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。例如,给定三角形:[ [2], [3,4], [6,5,7], [4,1,8,3]]自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。题目分析:本题自顶向下和自下而上最小路径和是一样的。为了便于分析,我们从倒数第二行的第一个数开始遍历,将每个数的...原创 2018-07-23 16:32:33 · 994 阅读 · 0 评论 -
LeetCode459. 重复的子字符串
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: "abab"输出: True解释: 可由子字符串 "ab" 重复两次构成。示例 2:输入: "aba"输出: False示例 3:输入: "abcabcabcabc"输出: True解释: 可由子字符串 "...原创 2018-07-23 17:19:26 · 506 阅读 · 0 评论 -
LeetCode108. 将有序数组转换为二叉搜索树
将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定有序数组: [-10,-3,0,5,9],一个可能的答案是:[0,-3,9,-10,null,5],它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / / -1...原创 2018-07-24 08:30:02 · 269 阅读 · 0 评论 -
LeetCode72. 编辑距离
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:插入一个字符 删除一个字符 替换一个字符示例 1:输入: word1 = "horse", word2 = "ros"输出: 3解释: horse -> rorse (将 'h' 替换为 'r')rorse -> ros...原创 2018-07-24 08:53:40 · 383 阅读 · 0 评论 -
LeetCode109. 有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 ...原创 2018-07-24 19:28:11 · 783 阅读 · 0 评论 -
LeetCode110. 平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1:给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2:给定二叉树 [1,2,2,3,3,null,null...原创 2018-07-24 20:16:03 · 1166 阅读 · 0 评论