LeetCode
nguliu
这个作者很懒,什么都没留下…
展开
-
leetcode 146——LRU缓存机制
题目描述:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近...原创 2019-11-18 08:42:15 · 213 阅读 · 0 评论 -
leetcode 76——最小覆盖子串
题目描述:给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字母的最小子串。示例:输入: S = "ADOBECODEBANC", T = "ABC"输出: "BANC"说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。解题思路:题目不难理解,就是说要在 S(source) 中找到包含 T(...转载 2019-11-16 11:03:17 · 465 阅读 · 0 评论 -
leetcode 494——目标和
题目描述:给定一个非负整数数组,a1, a2, …, an, 和一个目标数,S。现在你有两个符号 + 和 -。对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面。返回可以使最终数组和为目标数 S 的所有添加符号的方法数。示例 :注意:数组非空,且长度不会超过20。初始的数组的和不会超过1000。保证返回的最终结果能被32位整数存下。解题思路:原问题等...原创 2019-11-16 09:05:46 · 239 阅读 · 0 评论 -
leetcode 292——Nim游戏
Nim游戏题目描述:你和你的朋友,两个人一起玩 Nim 游戏:桌子上有一堆石头,每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。你们是聪明人,每一步都是最优解。 编写一个函数,来判断你是否可以在给定石头数量的情况下赢得游戏。示例:解题思路:在我赢的情况下,最后一次一定是我拿,那么对手给我留下的一定只能是1~3个石头,那么怎样才能保证对手最多留下3个...原创 2019-11-15 09:31:33 · 329 阅读 · 0 评论 -
leetcode 560——和为k的子数组
题目描述:给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。示例 1 :说明:数组的长度为 [1, 20,000]。数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。解题思路:扫描一遍数组, 对每个元素累加到sum,同时寻找map中是否有 sum-k 的元素,如果有则将答案加上 sum-k 的个数,最...原创 2019-11-13 09:08:32 · 230 阅读 · 0 评论 -
leetcode 416——分割等和子数组
题目描述给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200示例 1:示例 2:解题思路:这道题是0-1背包问题 我用到了动态规划中备忘录的方法 通过记录每种子集的情况来解题(其实就是枚举了所有的情况 不过复杂度没有那么高)首先进行两次特判 即原来数组长度为0,1,2...原创 2019-11-11 08:44:51 · 732 阅读 · 0 评论 -
leetcode 662——二叉树的最大宽度
题目描述:给定一个二叉树,编写一个函数来获取这个树的最大宽度。树的宽度是所有层中的最大宽度。这个二叉树与满二叉树(full binary tree)结构相同,但一些节点为空。每一层的宽度被定义为两个端点(该层最左和最右的非空节点,两端点间的null节点也计入长度)之间的长度。示例 1:示例 3:解题思路:如果是求树中每一层非空节点的最大宽度那么很简单,但这里要算上中间的空节点,因此...原创 2019-11-05 09:26:47 · 421 阅读 · 0 评论 -
leetcode 449——序列化和反序列化二叉搜索树
题目描述:序列化是将数据结构或对象转换为一系列位的过程,以便它可以存储在文件或内存缓冲区中,或通过网络连接链路传输,以便稍后在同一个或另一个计算机环境中重建。设计一个算法来序列化和反序列化二叉搜索树。 对序列化/反序列化算法的工作方式没有限制。 您只需确保二叉搜索树可以序列化为字符串,并且可以将该字符串反序列化为最初的二叉搜索树。编码的字符串应尽可能紧凑。注意:不要使用类成员/全局/静态变...原创 2019-10-31 10:14:42 · 214 阅读 · 0 评论 -
leetcode 501——二叉搜索树中的众数
题目描述:给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树示例:给定 BST [1,null,2,2]解题思路:最简单的方式是中序遍历二叉树,将结果保存到一个数组中,然后转化为求这个数组中的众...原创 2019-10-30 11:44:56 · 197 阅读 · 0 评论 -
leetcode 437——路径总和III
题目描述: 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。示例:解题思路:首先我们想一下,如果是求 “从根节点出发,求根节点到任意节点和为sum...原创 2019-10-30 10:26:37 · 203 阅读 · 0 评论 -
leetcode 124——二叉树中的最大路径和
题目描述:给定一个非空二叉树,返回其最大路径和。本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。示例1:示例2:输出:48解题思路:在示例1中,我们感觉好像就是求子树的最大值,但从示例2中我们可以看出,当左右子树和都大于0的时候,我们只能选择左右子树中和最大的子树去组成更大的子树,于是我们形成以下思路:以后序遍历整棵...原创 2019-10-29 15:26:13 · 230 阅读 · 0 评论 -
leetcode 382——链表中的随机节点(蓄水池抽样法)
题目描述:给定一个单链表,随机选择链表的一个节点,并返回相应的节点值。保证每个节点被选的概率一样。进阶:如果链表十分大且长度未知,如何解决这个问题?你能否使用常数级空间复杂度实现?解题思路:这道题最简单的解法应该是用一个vector保存所有节点的值,然后在vector中求取随机值就相当容易了,但如进阶条件所说,当链表十分大的时候时间复杂度和空间复杂度都是O(n).这时我们就要用到蓄水池...原创 2019-10-26 11:13:47 · 192 阅读 · 0 评论 -
leetcode 378——有序矩阵中第k小的数
题目描述:给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素。请注意,它是排序后的第k小元素,而不是第k个元素。示例:matrix = [ [ 1, 5, 9], [10, 11, 13], [12, 13, 15]],k = 8,返回 13。解释:排序后的数组为{1, 5, 9, 10, 11, 12, 13, 13, 1...原创 2019-10-26 09:33:38 · 636 阅读 · 0 评论 -
leetcode 260——只出现一次的数组III
题目描述: 给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。示例: 输入: [1,2,1,3,2,5] 输出: [3,5]注意:结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?解题思路: 在leetcode136 只出...原创 2019-10-11 10:40:26 · 190 阅读 · 0 评论 -
leetcode 123——买卖股票的最佳时机III
对于121和122思路很简单,请自行解决。对于123,我们最多可以完成两笔交易但不能同时参与两笔交易,因此,对于需要两次交易才能达到最大值时,中间一定有一个分界点,前半段有一个最大值、后半段有一个最大值,两段的最大值即为最大利润,以 [7,1,5,3,6,4] 为例,分界点是5,前半段最大值为4(1, 5),后半段最大值为3(3, 6),因此解题思路如下:// 从前往后遍历求出从第一...原创 2019-09-29 10:56:04 · 105 阅读 · 0 评论 -
leetcode 120——三角形最小路径和
解题思路其实和剑指offer47、leetcode62、leetcode63、leetcode64类似。但这里又稍有不同的是在两边边缘的顶点上一层只有一个顶点,所以两边边缘的顶点没得选择。对于不知边缘的顶点,选择上一层相邻的两个顶点中最小的那个顶点。具体实现如下:class Solution {public: int minimumTotal(vector<vector&l...原创 2019-10-02 10:18:42 · 149 阅读 · 0 评论 -
leetcode 62——不同路径
解题思路其实和剑指offer47、leetcode63、leetcode64、leetcode120类似。解题思路:利用了要达到目标模块可以通过上面和左面的模块到达,从而将目标转移到了上面和左面的模块,并且到达该模块的路径等于到达两个新模块路径条数之和将一行作为一个单位进行扫描,如果是在行首则只能向右走因此只有一种选择,如果在第一行也只有一种选择,如果处于中间的某一块时,等于到达他上面和左面...原创 2019-10-02 10:23:08 · 177 阅读 · 0 评论 -
leetcode 64——最小路径和
解题思路其实和剑指offer47、leetcode62、leetcode64、leetcode120类似。思路不多解释了,实现如下:class Solution {public: int minPathSum(vector<vector<int>>& grid) { if (grid.empty() || grid[0].emp...原创 2019-10-02 10:28:08 · 116 阅读 · 0 评论 -
leetcode 63——不同路径II
解题思路其实和剑指offer47、leetcode62、leetcode64、leetcode120类似。这里为动态规划的思想:若要到达位置[i, j],那么总的路径条数就等于到达[i, j]上面的模块[i-1, j]和左边的模块[i, j-1]路径的总和,从而将目标转移到[i-1,j]和[i,j-1],最终转移到模块[0,0]注意对第一行和第一列的处理和障碍物的阻碍class Solut...原创 2019-10-02 10:28:20 · 162 阅读 · 0 评论 -
leetcode 148——排序链表(对链表进行归并排序)
根据题目要求,我们需要在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。所以我们选择的是二路归并排序/*由于题目要求空间复杂度是 O(1),因此不能使用递归。因此这里使用 bottom-to-up 的算法来解决。bottom-to-up 的归并思路是这样的:先两个两个的 merge,完成一趟后,再 4 个4个的 merge,直到结束。举个简单的例子:[4,3,1,...原创 2019-10-05 09:26:21 · 241 阅读 · 0 评论 -
leetcode 208——字典树实现
思路比较简单,直接上代码了:class Trie { Trie *child[26]; //记录后续字母 bool isWord; //截止到当前的字符是否是一个单词public: /** Initialize your data structure here. */ Trie() { isWord = false; ...原创 2019-10-07 09:11:54 · 133 阅读 · 0 评论 -
leetcode 198——打家劫舍
这是一个简单题,思路为动态规划根据dp方程 dp[i] = max(dp[i-2]+nums[i], dp[i-1]) 进行计算即可//思路为动态规划:dp 方程 dp[i] = max(dp[i-2]+nums[i], dp[i-1])class Solution {public: int rob(vector<int>& nums) { i...原创 2019-10-09 00:24:52 · 136 阅读 · 0 评论 -
leetcode 213——打家劫舍II
这个题和打家劫舍I思路相同,只不过这里分两种情况:盗第一间和不盗第一间(至于最后一间根据dp进行选择)进行dp即可。//思路和198题类似,只不过这里分两种情况讨论:盗第一间和不盗第一间class Solution {public: int rob(vector<int>& nums) { if (nums.empty()) ...原创 2019-10-09 00:29:02 · 106 阅读 · 0 评论 -
leetcode 222——完全二叉树的节点个数
最简单的办法就是递归,代码如下:class Solution {public: int countNodes(TreeNode* root) { if (!root) return 0; return 1 + countNodes(root->left) + countNodes(root->right); }...原创 2019-10-09 09:31:31 · 130 阅读 · 0 评论 -
leetcode 238——除自身以外数组的乘积
题目:给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。示例: 输入: [1,2,3,4] 输出: [24,12,8,6]说明: 请不要使用除法,且在 O(n) 时间复杂度内完成此题。解题思路:两遍dp法dp1[i]保存[0,i)内元素的乘积,dp2[i...原创 2019-10-10 09:48:24 · 104 阅读 · 0 评论 -
leetcode 23——合并k个排序链表
/*解题思路:* 由于每条链表是非递减排列,每次取所有链表的头节点中值最小的节点插入到合并后链表的结尾,因此可以* 利用小根堆的特性,建立 <值, 节点指针> 的映射,对于每条链表将其头结点插入小根堆,每次取堆顶元素* top 插入到新链表即可,如果所取节点 top->next 非空,则应将 top->next 的键值对压入堆。*/算法...原创 2019-05-15 12:50:05 · 132 阅读 · 0 评论