![](https://img-blog.csdnimg.cn/20201014180756757.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法、数据结构
文章平均质量分 68
探索者FXJ
这个作者很懒,什么都没留下…
展开
-
Leetcode典型题解答和分析、归纳和汇总——T581(最短无序连续子数组)
问题分析:给定一个整数数组,你需要找到一个来连续的子数组,如果对这个子数组进行排序,那么整个数组将会变成升序排序。你要找的子数组应该是最短的,并且可以包括边界等于号。问题分析:我们可以采用双指针的方式来进行求解。【1】用max标记局部极大值的位置,而用end来标记这个局部极大值应该出现的位置;【2】从前往后遍历:如果后面的数比max小,则将end出现的位置记录下来,直到...原创 2020-03-16 16:10:43 · 193 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T538(把二叉树转换为累加树)
问题描述:给定一个二叉搜索树,把他转为累加树,使得每个节点的值都是原来的节点值加上所有大于它的节点值之和。问题分析:注意二叉搜索树具有明显的特征是:左子树的值比右子树上的值要小。class Solution{ private: int val =0; public: TreeNode* convertBST(TreeNode* root) ...原创 2020-03-16 15:15:35 · 177 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T448(找到所有数组中消失的数字)
问题描述:给定一个范围1<a[i]<n的整型数组,数组中的元素一些出现了两次,另一些只出现了一次。找到所有在[1,n]范围中没有出现的数字。注意:时间复杂度为O(n),空间复杂度为O(1)。问题分析:本题是一个简单的数学类型的题目,主要在于如何找到数学关系。【1】确认数组的长度,如果为空,则返回nums即可。【2】非空,则进行遍历操作,遍历数组元素,取得下标,...原创 2020-03-16 14:46:48 · 139 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T347(前K个高频元素)
问题描述:给定一个非空的整数数组,返回其中出现频率前K高的元素。问题分析:这个是必须有时间复杂度要求的,否则我们可以采用暴力法来求解。应该采用堆排序算法。这里我们采用小根堆的方式来进行,因为求前K个大的元素,一般都是采用小根堆的排序方式。具体操作如下【1】遍历数组,采用hash表录入频率。【2】遍历哈希表,维护一个出现频率K多的小根堆;【3】优先队列已经满了,需要判...原创 2020-03-16 11:49:32 · 158 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T337(打家劫舍III)
问题描述:某个小区只有一个入口,称之为根,除了跟之外,每栋楼房有且仅有一个子房与其连接,类似于二叉树。如果两个直接相连的房子在同一天晚上被打劫,房屋将会自动报警,请问:如何在不报警的情况下,使得偷盗金额最大化。问题分析:本题具有最优子结构:即最大值与左右子树的最大值有关,而且是相互独立的,可以采用动态规划算法来进行求解。其状态包括:(1)偷当前节点,则其左右节点不能再偷。(2)...原创 2020-03-16 10:56:09 · 107 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T287(寻找重复数)
问题描述:给定一个包含n+1个整数的数组nums,其数字在1到n之间,可知至少存在一个重复整数,假设只有一个重复的整数,请找出来。问题分析:【1】采用暴力方法:(显然是不符合时间复杂度要求的!!!)class Solution {public: int findDuplicate(vector<int>& nums) { i...原创 2020-03-15 16:36:40 · 185 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T279(完全平方数)
问题分析:给定一个正整数n,找到若干个完全平方数(比如1,4,9,16,...)使得它门的和为n,你需要让其组成的完全平方数的个数最少。问题分析:这是一个典型的动填规划问题。关键在于如何查找动态转移方程,我们假设前面的已经知道最小的个数dp[i],然后继续求解dp[i-j*j]+1这个数的最小值。class Solution {public: int numSqua...原创 2020-03-15 15:11:59 · 138 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T239(滑动窗口的最大值)
问题描述:给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧,你只可以看到在滑动窗口内的K个数字。滑动窗口每次向右只能移动一位,返回滑动窗口中的最大值。问题分析:如果是只要找某个区间内的最大值,那这个过程就比较简单,直接采用遍历的算法即可,但是这个题目要求我们找一个滑动窗口内内的最大值,这就需要我们进行分类讨论了。【1】如果上一个窗口的最大值在最左边...原创 2020-03-15 14:15:46 · 150 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T236(二叉树的最近公共祖先)
问题描述:给定一个二叉树,找到该树中两个指定节点的最近公共祖先。问题分析:我们可以将这两个节点的所处位置进行分类:p、q节点是否处于同一颗子树中。【1】从根节点进行遍历,递归向左右查询节点信息;【2】递归的终止条件:如果当前节点为空或者为p、q节点,则返回当前节点(1)递归遍历左右子树,如果左右子树查到节点都为非空,说明p、q分别在左右子树中,当前节点即为最近的公共...原创 2020-03-15 10:50:18 · 146 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T226(翻转二叉树)
问题描述:翻转一棵二叉树:问题描述:本题很容易想到的思路就是采用递归算法来求解。class Solution{ public: TreeNode *invertTree(TreeNode* root) { DFS(root); return root; } void DFS(TreeNode *root) { if(root)...原创 2020-03-15 09:48:15 · 94 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T208(实现Trie前缀树)
问题描述:实现一个Trie前缀树,包含insert、search和startsWith这三个操作。问题分析:这类的题目与堆栈的最小元素查找类似,将所有功能进行集中处理。首先我们需要明确一下trie树的基本概念:它又称为:字典树、前缀树、单词查找树等。其基本数据结构定义为:与其他普通树的定义存在明显区别。最明显的差别就是Bool型变量来表征其节点是否为结束值,而Tri...原创 2020-03-14 22:03:54 · 132 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T206(反转链表)
问题描述:反转一个单单链表。问题分析:【1】解法1:我们采用双指针的方式来求解。设置一个cur和post指针。当postt指针一直处于非空状态时,进行如下操作:(1)保存post的下一个节点;(2)将post指针的下一个状态指向cur;(3)将cur指针下移到post;(4)将post的指针下移到post->next; ListNode *cur =...原创 2020-03-14 11:50:44 · 85 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T198(打家劫舍)
问题描述:你是一个专业的小偷,计划偷窃房屋内财产。每间房子内藏现金,影响你偷窃的唯一制约因素是防盗系统,如果两间相邻的房屋在统一晚上被小偷入侵,系统会自动报警。给定一个代表每个房屋存放金额的非负整数,计算在不触碰自动报警装置下,能够偷窃到的最大金额。问题分析:这个题目的关键在于如何跨区域寻找最大值。显然这是一个动态规划问题。【1】首先,我们需要定义子问题。就是求n间房子的总...原创 2020-03-14 10:41:04 · 132 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T160(相交链表)
问题描述:编写一个程序,找到两个单链表相交的起始节点。问题分析:本题我们采用双指针的方式来进行求解。即A链表一个指针,B链表一个指针,当两者相遇时,表示找到相交节点。一般而言两者链表程度是不一致的,于是我们采用“轮流替换”的方式。当A指针走完了一条链之后,再回到另外一条链的头部进行走两者经过一轮之后,最终会弥补了这个长度差值而相遇。/** * Definition for ...原创 2020-03-14 09:39:08 · 78 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T153(寻找旋转排序数组中的最小值)
问题描述:假设按照升序排序的数组在预先设定的某个点上进行了旋转,请找出其中最小的数。问题分析:这个可以采用C++库函数直接完成任务,但是为了直观显示这这个查找过程,我们应该要充分利用这个数组的特性,使用二分查找,可以大大提升效率。class Solution {public: int findMin(vector<int>& nums) { ...原创 2020-03-12 11:26:16 · 113 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T151(翻转字符串里面的单词)
问题描述:给定一个字符串,逐个翻转字符串里面的单词。问题分析:本题我们主要采用反转的思路。【1】定位到单词左右两边的第一个非空字母上(left、right);【2】采用反转函数reverse将整个字符串所有字母调转顺序;【3】然后对字符串中的逐个单词进行逆序调整;【4】最后去除掉字符串中多余的空字符。class Solution {public: v...原创 2020-03-12 11:06:40 · 110 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T146(LRU缓存机制)
问题描述:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最...原创 2020-03-11 20:57:31 · 101 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T144(二叉树的前序遍历)
问题描述:给定一个二叉树,返回它的前序遍历。注意:初级版是采用递归算法,进阶版是迭代算法。问题分析:我们可以采用递归算法:构造一个helper()函数。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * Tr...原创 2020-03-11 19:40:32 · 99 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T142(环链表II)
问题描述:给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。说明:不允许修改给定的链表。问题分析:本题在前一题的基础上,增加了关于位置的定义,除了采用双指针可以找到环之外,还需要使用快慢双指针确定环起点。...原创 2020-03-11 17:01:23 · 90 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T139(单词拆分)
问题描述:给定一个非空字符串s和一个包含非空单词列表的字典wordDict,判断s是否可以被空格拆分成一个或多个在字典中出现的单词。问题分析:本题我们可以采用动态规划来进行求解。我们从第一个字母开始进行比对,如果比对成功,则将该组单词剔除,下一个开头字母为这组单词结束的下一个字母开始。继续进行搜索。class Solution {public: bool wordB...原创 2020-03-11 10:49:58 · 110 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T137(只出现一次的数字II)
问题描述:给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现了三次。找出那个只出现了一次的元素。问题分析:这个题目...原创 2020-03-11 09:09:25 · 128 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T136(只出现一次的数字)
问题描述:给定一个非空的整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现一次的元素。注意:算法应该是线性的,并且不可以使用额外的空间。问题分析:由于只有一个数不同,其他都是成对存在的,于是我们可以采用异或方法,一直异或下去,最终剩下的元素就是需要返回的。class Solution {public: int singleNumber(...原创 2020-03-04 15:22:49 · 114 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T134(加油站)
问题描述:在一条环形路上有N个加油站,其中第i个加油站有汽油gas[i]升。你有一辆汽油容量无限的汽车,从第i个加油站开往第i+1个加油站需要耗费油量gas[i]升。假设开始时油箱为空,如果你可以围绕环行路形式一周,则返回出发时加油站的编号,否则返回-1。问题分析:本题是一个典型的求子和最大问题。我们需要对整个序列进行遍历。首先设置一个标志位hasRes,然后再计算启动位置:如果s...原创 2020-03-04 14:58:55 · 213 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T133(克隆图)
问题描述:给你一个无向连通图中的一个节点的引用,请你返回该图的深度拷贝(克隆)。图中的每个节点都包含它的值val和其邻居的列表。问题求解://无向图的简单复制class Solution{ public: Node* cloneGraph(Node* node) { unordered_map<Node*,int> vis; ...原创 2020-03-04 14:17:10 · 75 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T131(分割回文串)
给定一个字符串s,将s分割成一些字串,使每个字串都是回文符串。返回s所有可能的分割方案。问题分析:在这个问题中,我们可以采用回溯方式来进行求解。具体思路:【1】初始化返回结果数组res=[[],[],[],] 和中间返回数组tmp=[]【2】调用深度递归函数DFS(s,tmp,res)【3】回调函数:首先需要判断字符串是否为空(1)如果s=="空", 则表示tm...原创 2020-03-04 13:47:57 · 93 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T130(被围绕的区域)
问题描述:给定一个二维的矩阵,包含X和O。找到所有被X包围的区域,并且将这些区域里面所有的O用X填充。问题分析:这是一个典型是的数学类问题,具有很高的价值,专门来应对二维数组的处理情况。class Solution{ public: int dx[4] = {-1,0,1,0}; int dy[4] = {0,-1,0,1}; void ...原创 2020-03-04 11:57:42 · 117 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T129(求根到叶子节点数字之和)
问题描述:给定一个二叉树,它的每个节点都存放着0~9的数字,每条从根到叶子子节点的路径代表一个数字。例如:从根到叶子节点路径1->2->3代表数字123。计算从根到叶子节点生成的所有数字之和。问题分析:我们可以采用回溯算法实现所有数字的组合,然后将得到的数字进行相加,得到最终的返回结果。class Solution{ public: int...原创 2020-03-04 11:18:18 · 88 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T127(单词接龙)
问题描述:给定两个单词(beginWord和endWord)和一个字典,找到从beginWord到endWord的最短转换序列的长度。转换需遵循如下规则:(1)每次转换只能改变一个字母。(2)转换过程中的中间单词必须是字典中的单词。说明: 如果不存在这样的转换序列,则返回0。所有单词具有相同的长度。所有的单词只能由小写字母组成。字典中不存在重复的单词。你可以假设beginWord和...原创 2020-03-04 11:05:06 · 87 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T125(验证回文串)
问题描述:给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串。问题解析:在这里需要处理大小写字母问题,因此需要进行大小写字母转换。然后利用双指针的方式来实现。双指针的结束条件是左指针位置超越了右指针。class Solution{ public: bool isPalindrome...原创 2020-03-03 21:26:57 · 78 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T122(买卖股票的最佳时机II)
问题分析:给定一个数组,它的第i个元素是一只股票第i天的价格。设计一个算法来计算你能所获得的最大利润。可以尽可能多次地完成更多的交易(即可以多次买卖一支股票)。问题分析:本题如果采用一般的方式来求解:使用贪婪算法,每当遇到下跌的股票日之前,就将其卖掉,这样会挣钱最多。class Solution {public: int maxProfit(vector<...原创 2020-03-03 16:39:25 · 88 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T121(买股票的最佳时机)
问题描述:给定一个数组,它的第i个元素是一支给定股票的第i天的价格。如果你最多允许完成一笔交易(即买入和卖出一只股票),设计一个算法来计算你所能获得的最大利润。注意:不能在买入股票前卖出股票。问题分析:在这个问题中,数据以数组形式存储,我们只需要按顺序找到最大和最小值,相减即可。本题与最高蓄水问题求解类似,采用双指针方式即可实现。class Solution {pu...原创 2020-03-03 16:25:52 · 67 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T120(三角形的最小路径和)
问题描述:给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的节点上。问题分析:在这里,我们考虑采用动态规划算法。数据只能从上往下走,反过来就是自底向上走和最小。即dp(0,0)即为所。动态规划的转移方程为:dp(i,j) = min(dp(i+1,j),dp(i+1,j+1)) + triangle(i,j).运用自底向上的方式进行动态规划编程可得:...原创 2020-03-03 14:59:58 · 80 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T119(杨辉三角II)
问题分析:给定一个非负索引的k,其中K小于等于33,返回杨辉三角的第K行。问题分析:本题我们可以采用先构造原来的杨辉三角res[i][j],然后再根据index在哪个位置,然后再对应返回。class Solution{ public: vector<int> getRow(int rowIndex){ vector<vecto...原创 2020-03-03 14:19:05 · 92 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T118(杨辉三角)
问题描述:给定一个非负整数numRows,生成杨辉三角的前numRows行。问题分析:本题我们采用动态规划方式来进行求解。即在计算当前的值时,利用上一层的保存值进行求解:row[i][j]= row[i-1][j]+row[i-1][j-1]。class Solution {public: vector<vector<int>> g...原创 2020-03-03 11:54:49 · 118 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T116(填充每一个节点的下一个右侧节点指针)
问题分析:给定一个完美二叉树,其所有叶子节点都在同一层,每个父子节点都有两个子节点。二叉树的定义如下:填充它的每个next指针,让这个指针指向其下一个右侧节点,如果找不到下一个右侧节点,则将next指针设置为null。初始情况下所有的next指针都被设置为NULL。问题分析:采用递归的方式进行求解:(1)当根节点或者左子树为空的时候,则直接返回;(2)将root...原创 2020-03-02 21:24:14 · 80 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T114(二叉树展开为链表)
问题描述:给定一个二叉树,原地将它展开为链表。问题分析:首先,依据题目意思,应该为先序遍历方式,然后再用链表来表示(本质还是一颗二叉树)。我们可以使用一个队列来保存签需遍历的结果,然后出队列的第一个元素为temp,使其左子树为空,右孩子指向剩余队列的第一个元素node,完成该操作后将node赋值给tenp,遍历整个队列。/** * Definition for a bina...原创 2020-03-02 21:03:11 · 70 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T113(路径总和II)
问题描述:给定一个二叉树和目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径。问题分析:本题与T112存在显著差别是:(1)需要找出所有的路径,并且需要将数字保存成为数组形式输出。本题很明显可以采用回溯算法,将res作为输出结果,path作为中间可选路径。然后通过入队的方式,判断是否左右子树为空,均为空,则进行回溯。/** * Definition for ...原创 2020-03-02 20:45:50 · 196 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T112(路径总和)
问题描述:给定一个二叉树和一个目标和,判断该树中是否存在根节点到叶子节点的路径,这条路上的所有节点值相加等于,目标和。问题分析:【1】本题可以采用数组分析法,把所有的值都遍历出来,存放于数组中,然后再利用数组相加,看目标值是否在其中,如果在,则表示满足题意,返回true。但在存放数组过程中,应该注意对应的结构。【2】本题还可以采用典型的递归算法,递归函数就是求和函数本身,注意递...原创 2020-03-02 20:31:20 · 146 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T111(二叉树的最小深度)
问题描述:给定一个二叉树,找出其最小深度。最小深度是指从根节点到最近叶子节点的最短路径是的节点个数。问题分析:在进行问题判断的时候,需要找出最先出现的叶子节点,然后再求解左右子树的最小值。class Solution {public: int minDepth(TreeNode* root) { if (root == nullptr) retu...原创 2020-03-02 20:20:15 · 77 阅读 · 0 评论 -
Leetcode典型题解答和分析、归纳和汇总——T110(平衡二叉树)
问题描述:给定一个二叉树,判断它是否为平衡二叉树。问题分析:对当前节点分别求左右子树的深度,判断左右子树的高度差是否小于等于1./** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;...原创 2020-03-02 11:33:50 · 114 阅读 · 0 评论