自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(98)
  • 收藏
  • 关注

原创 Leetcode热题Hot100+Top面试题-数组

题目:给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。示例 1:输入:nums = [2,7,11,15], target = 9输出:[0,1]解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。示例 2:输入:nums = [3,2,4], target

2021-10-20 17:12:27 4232

原创 leetcode-完全二叉树

完全二叉树

2022-07-14 00:41:52 262 1

原创 leetcode-Hot100+Top面试-字符串

14-最长公共前缀编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “”。方法一:横向扫描依次遍历字符串数组中的每个字符串,对于每个遍历到的字符串,更新最长公共前缀,当遍历完所有的字符串以后,即可得到字符串数组中的最长公共前缀。如果在尚未遍历完所有的字符串时,最长公共前缀已经是空串,则最长公共前缀一定是空串,因此不需要继续遍历剩下的字符串,直接返回空串即可。class Solution {public: string longestCommonPrefi

2022-05-04 11:50:09 218

原创 leetcode-双指针

283-移动零给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。方法一:双指针使用双指针,左指针指向当前已经处理好的序列的尾部,右指针指向待处理序列的头部。右指针不断向右移动,每次右指针指向非零数,则将左右指针对应的数交换,同时左指针右移。注意到以下性质:1.左指针左边均为非零数;2.右指针左边直到左指针处均为零。因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未

2022-04-27 08:17:10 234

原创 leetcode-并查集

定义并查集是一种树型的数据结构,用于处理一些不相交集合(disjoint sets)的合并及查询问题。并查集通常包含两种操作查找(Find):查询两个元素是否在同一个集合中合并(Union):把两个不相交的集合合并为一个集合注意:双亲结点就是父结点399-除法求值给你一个变量对数组 equations 和一个实数值数组 values 作为已知条件,其中 equations[i] = [Ai, Bi] 和 values[i] 共同表示等式 Ai / Bi = values[i] 。每

2022-04-24 21:26:57 635

原创 leetcode-图

797-所有可能的路径给你一个有 n 个节点的 有向无环图(DAG),请你找出所有从节点 0 到节点 n-1 的路径并输出(不要求按特定顺序)graph[i] 是一个从节点 i 可以访问的所有节点的列表(即从节点 i 到节点 graph[i][j]存在一条有向边)。方法一:图的深度优先搜索我们可以使用深度优先搜索的方式求出所有可能的路径。具体地,我们从 0号点出发,使用栈记录路径上的点。每次我们遍历到点 n−1,就将栈中记录的路径加入到答案中。特别地,因为本题中的图为有向无环图(DAG),搜索过

2022-04-05 23:24:03 633

原创 leetcode-背包问题

416-分割等和子集给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。方法一:动态规划这道题可以换一种表述:给定一个只包含正整数的非空数组 nums[0],判断是否可以从数组中选出一些数字,使得这些数字的和等于整个数组的元素和的一半。因此这个问题可以转换成「0−1 背包问题」。这道题与传统的「0−1 背包问题」的区别在于,传统的「0−1 背包问题」要求选取的物品的重量之和不能超过背包的总容量,这道题则要求选取的数字的和恰好等于整个

2022-04-03 09:52:40 1422

原创 算法技巧-前缀和数组

560-和为K的子数组给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。方法二:前缀和+哈希表优化我们可以基于方法一利用数据结构进行进一步的优化,我们知道方法一的瓶颈在于对每个 i,我们需要枚举所有的 j 来判断是否符合条件,这一步是否可以优化呢?答案是可以的。我们定义 pre[i] 为[0…i] 里所有数的和,则 pre[i] 可以由pre[i−1] 递推而来,即:那么[j…i] 这个子数组和为 k ,这个条件我们可以转化为简单移项可得符合条

2022-03-24 20:45:46 1067

原创 leetcode347-前k个高频元素

给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。方法一:哈希表+排序将数组中每个元素出现的次数存入哈希表中,对哈希表进行排序,取前k个元素即为题目要求的前k个高频元素。class Solution {public: vector<int> topKFrequent(vector<int>& nums, int k) { int count=0; vector&l

2022-03-22 19:51:10 1117

原创 leetcode-字母异位词

241-有效的字母异位词给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。方法一:数组 bool isAnagram(string s, string t) { if(s.size()!=t.size()) return false; int num[128];//ASCALL码共128个 for(int i=

2022-03-18 10:42:40 831

原创 Leetcode-括号相关问题

20-有效的括号给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。方法:栈判断括号的有效性可以使用「栈」这一数据结构来解决。我们遍历给定的字符串 s。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。当我们遇到一个右括号时,我们需要将一个相同类型的左括号闭合。此时,我

2022-03-07 20:06:33 667

原创 面试题33-栈的压入、弹出序列

题目输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。方法:辅助栈建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈中弹出数字。class Solution {public: bool validateStackSe

2022-03-06 20:36:40 316

原创 面试题55-判断二叉树是否是平衡二叉树

题目:输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。自底向上的递归由于自顶向下递归,对于同一个节点,会重复遍历同一个节点,导致时间复杂度较高。如果使用自底向上的做法,则对于每个节点,只被遍历一次自底向上递归的做法类似于后序遍历,对于当前遍历到的节点,先递归地判断其左右子树是否平衡,再判断以当前节点为根的子树是否平衡。如果存在一棵子树不平衡,则整个二叉树一定不平衡。class Solution {public:

2022-03-04 00:27:01 385

原创 面试题37-序列化二叉树

题目请实现两个函数,分别用来序列化和反序列化二叉树。你需要设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串反序列化为原始的树结构。方法一:深度优先搜索二叉树的序列化本质上是对其值进行编码,更重要的是对其结构进行编码。可以遍历树来完成上述任务。众所周知,我们一般有两个策略:广度优先搜索和深度优先搜索。广度优先搜索可以按照层次的顺序从上到下遍历所有的节点深度优先搜索可以从一个根开始,一直延伸到某

2022-03-02 00:21:05 449

原创 面试题34-二叉树中和为某一值的路径

题目:给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。叶子节点 是指没有子节点的节点。方法一:深度优先搜索注意到本题的要求是,找到所有满足从「根节点」到某个「叶子节点」经过的路径上的节点之和等于目标和的路径。核心思想是对树进行一次遍历,在遍历时记录从根节点到当前节点的路径和,以防止重复计算。我们可以采用深度优先搜索的方式,枚举每一条从根节点到叶子节点的路径。当我们遍历到叶子节点,且此时路径和恰为目标和时,我们就找到

2022-02-27 23:20:55 172

原创 二叉树递归类题目

题目给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。方法:分别用递归、BFS、DFS/** * 递归方式遍历反转 */ public TreeNode invertTree(TreeNode root) { if (root == null) { return null; } TreeNode temp = root.left; root.left = root.

2022-02-24 16:11:58 785

原创 面试题33-二叉搜索树的后序遍历序列

class Solution {public: vector<int>arr1,arr2; bool verifyPostorder(vector<int>& postorder) { int n=postorder.size(); return helper(postorder,n); } bool helper(vector<int>& postorder,int n) {

2022-02-23 08:08:49 397

原创 二叉树的深度和直径等

题目给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7],方法一:深度优先搜索思路与算法如果我们知道了左子树和右子树的最大深度 l和 r,那么该二叉树的最大深度即为 max(l,r)+1而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度

2022-02-21 23:32:39 931

原创 面试题28-对称的二叉树

题目请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。解题思路我们定义一种对称的遍历算法,即先遍历父节点,再遍历它的右子节点,最后遍历它的左子节点。通过比较二叉树的前序遍历序列和对称前序遍历序列来判断二叉树是不是对称的。如果两个序列是一样的,那么二叉树就是对称的。class Solution {public: bool isSymmetric(TreeNode* root) { return isSymmetric(root,

2022-02-18 00:27:41 561

原创 leetcode-二叉搜索树

230二叉搜索树的第K小的元素给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。方法一:中序遍历二叉搜索树具有如下性质:结点的左子树只包含小于当前结点的数。结点的右子树只包含大于当前结点的数。所有左子树和右子树自身必须也是二叉搜索树。二叉树的中序遍历即按照访问左子树——根结点——右子树的方式遍历二叉树;在访问其左子树和右子树时,我们也按照同样的方式遍历;直到遍历完整棵树。思路和算法因为二叉搜索树和中序遍历的性质,

2022-02-17 17:28:03 819

原创 面试题27-二叉树的镜像

题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。解题思路这是一道很经典的二叉树问题。显然,我们从根节点开始,递归地对树进行遍历,并从叶子节点先开始翻转得到镜像。如果当前遍历到的节点 root 的左右两棵子树都已经翻转得到镜像,那么我们只需要交换两棵子树的位置,即可得到以 root 为根节点的整棵子树的镜像。递归class Solution {public: TreeNode* mirrorTree(TreeNode* root) { if (root == nu

2022-02-17 00:02:58 89

原创 二叉树的四种遍历方式

中序遍历二叉树的中序遍历就是首先遍历左子树,然后访问当前节点,最后遍历右子树。对于下面的二叉树,中序遍历结果如下:直观来看,二叉树的中序遍历就是将节点投影到一条水平的坐标上。如图:二叉树结构 struct treenode { int val; treenode *left; treenode *right; treenode() : val(0), left(nullptr), right(nullptr) {} treenode(in

2022-02-16 15:56:07 9302

原创 面试题43-1~n整数中1出现的次数

题目输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。class Solution{public: int NumberOf1(const char*strN) { //cout << *strN << endl; if (!strN || *strN<'0' || *strN>'9' || *strN == '\0') return 0

2022-02-14 01:11:27 209

原创 面试题41-数据流中的中位数

题目如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路数据流看作是一个数据容器,中位数位于容器的中央,如果容器中数据的数目是奇数,中位数是中心数;如果容器中数据的数目是偶数,中位数是中间两数的平均值。我们注意到,整个容器被分隔成两部分。位于容器左边部分的数据比右边的数据小。如果能保证数据容器左边的数据都小于右边的数据,那么即使左右两边内部的数据没有排序,也

2022-02-11 00:23:00 86

原创 面试题66-构建乘积数组

题目给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B[i] 的值是数组 A 中除了下标 i 以外的元素的积, 即 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。解题思路本题的难点在于 不能使用除法 ,即需要 只用乘法 生成数组 B 。根据题目对 B[i] 的定义,可列表格,如下图所示。根据表格的主对角线(全为 1 ),可将表格分为 上三角 和 下三角 两部分。分别迭代计算下三角和上三角两部分的乘积,即可 不使

2022-02-09 00:41:01 93

原创 面试题65-不用加减乘除做加法

题目写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。解题思路采用三步走位运算:第一步:不考虑进位,对每一位相加。采用异或位运算第二步:进位。采用位与位运算第三步:把前两个步骤相加。第三步相加的过程依然是重复前面两步,直到不产生进位为止C++实现class Solution{public: int Add(int num1, int num2) { int sum, carry; do { sum = num1

2022-02-08 00:26:45 233

原创 面试题64_求1+2+…+n

题目求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。解题思路方法一:利用构造函数求解我们可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数将确定会被调用n次。我们可以将与累加相关的代码放到构造函数里。class Temp{public: Temp() { ++N; Sum += N; } static void Reset() { N = 0; Sum = 0; } static

2022-02-07 00:09:14 801

原创 面试题62-圆圈中最后剩下的数字

题目0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。解题思路方法一:经典的解法,用环形链表模拟圆圈我们可以创建一个共有n个节点的环形链表,然后每次在这个链表中删除第m个节点。如果面试官没有特殊要求,那么可以用模板库中的std::list来模拟一个

2022-02-06 21:35:53 139

原创 Leetcode-DFS/BFS算法

200-岛屿数量给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。此外,你可以假设该网格的四条边均被水包围。解题思路方法一:深度优先搜索我们可以将二维网格看成一个无向图,竖直或水平相邻的 1 之间有边相连。为了求出岛屿的数量,我们可以扫描整个二维网格。如果一个位置为 1,则以其为起始节点开始进行深度优先搜索。在深度优先搜索的过程中,每个搜索到的 1 都会被重新标记为 0。最终

2022-01-28 20:29:32 204

原创 qsort排序函数和sort排序函数对比

qsort排序函数qsort函数是C语言编译器函数库自带的排序函数。它是ANSI C标准中提供的,其声明在stdlib.h文件中,是根据二分法写的,其时间复杂度为n*log(n)功能: 使用快速排序例程进行排序头文件:stdlib.h用法: void qsort(void* base, size_t num, size_t width, int(__cdeclcompare)(const void, const void*));参数:待排序数组,排序之后的结果仍放在这个数组中数组中待排序元素

2022-01-28 00:40:59 1104

原创 面试题61-扑克牌中的顺子

题目从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。解题思路我们需要做三件事情:1.对数组进行排序2.统计数组中0的个数3.统计排序之后的数组中相邻数字之间的空缺总数如果空缺的总数小于或者等于0的个数,那么这个数组就是连续的;反之则不连续。最后,我们还需注意一点:如果数组中的非0数字重复出现,则该数组并不是连续的。换成扑克牌的描述方法就是:如

2022-01-28 00:32:37 894

原创 C++中创建二维数组

c++中创建数组都需要给出一个明确的大小。而实际中经常需要用到动态大小的数组。以下是创建二维数组的方法:int **p=new int*[x];for(int i=0;i<x;i++){ p[i]=new int[y];} //定义二维数组x行y列 for(int i=0;i<x;i++)for(int j=0;j<y;j++){ cin>>p[i][j];} //二维数组的赋值

2022-01-26 20:51:03 6160

原创 面试题60-n个骰子的点数

题目把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 n 个骰子所能掷出的点数集合中第 i 小的那个的概率。解题思路递归算法要想求出n个骰子的点数和,可以先把n个骰子分为两堆:第一堆只有一个;另一堆有n-1个。单独的那一个有可能出现1~6的点数。我们需要计算1~6的每一种点数和剩下的n-1骰子来计算点数和。接下来把剩下的n-1个骰子仍然分我们成两堆:第一堆只有一个;第二堆有n-2个。我们把上一轮那

2022-01-26 00:20:16 152

原创 面试题59-队列的最大值

题目class Solution{public: vector<int> maxInWindow(const vector<int>&nums,unsigned int size) { int n = nums.size(); deque<int> dqu; vector<int>maxInWindows; if (!n||size>n||size<1) return vector<int>();

2022-01-20 00:14:40 331

原创 面试题30-包含main函数的栈

题目定义栈的数据结构,请在该类型中实现一个能过得到栈的最小元素的min函数。在该栈中,调用min、push及pop的时间复杂度都是O(1)。解题思路利用辅助栈的思想:把每次的最小元素(之前的最小元素和新压入栈的元素两者的较小值)都保存起来放到另一个辅助栈里,可以实现min的时间复杂度为O(1)。C++实现.h头文件#pragma once#include <stack>#include <assert.h>template <typename T>

2022-01-19 22:18:56 525

原创 leetcode-滑动窗口

3-无重复字符的最长子串给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。解题思路如果我们依次递增地枚举子串的起始位置,那么子串的结束位置也是递增的!这里的原因在于,假设我们选择字符串中的第 k 个字符作为起始位置,并且得到了不包含重复字符的最长子串的结束位置为rk。那么当我们选择第 k+1 个字符作为起始位置时,首先从 k+1 到 rk的字符显然是不重复的,并且由于少了原本的第 kk个字符,我们可以尝试继续增大 rk,直到右侧出现了重复字符为止。这样一来,我们就可以使用**「

2022-01-17 19:53:09 120

原创 leetcode-打家劫舍

题目你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。解题思路首先考虑最简单的情况。如果只有一间房屋,则偷窃该房屋,可以偷窃到最高总金额。如果只有两间房屋,则由于两间房屋相邻,不能同时偷窃,只能偷窃其中的一间房屋,因此选择其中金额较高的房屋进行偷窃,可以偷窃到

2022-01-16 21:27:06 482

原创 面试题58-翻转字符串

题目**给你一个字符串 s ,逐个翻转字符串中的所有 单词 。单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。说明:**输入字符串 s 可以在前面、后面或者单词间包含多余的空格。翻转后单词间应当仅用一个空格分隔。翻转后的字符串中不应包含额外的空格。**解题思路方法一:自行编写对应的函数我们也可以不使用语言中的 API,而是自己编写对应的函数。在不同语言中,这些函数实现是不一样的,主要的差别是

2022-01-15 10:52:58 133

原创 leetcode-单调栈

84-柱形图中最大的矩形给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。求在该柱状图中,能够勾勒出来的矩形的最大面积。解题思路

2022-01-13 15:23:23 169

原创 面试题63-股票的最大利润

题目假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖该股票一次可能获得的最大利润是多少?解题思路我们可以先定义函数diff(x)为当卖出价位数组中第i个数字时可能获得的最大利润。显然,在卖出价固定时,买入价越低获得的利润越大。也就是说如果在扫描到数组中的第i个数字时,只要我们能够记住之前的i-1个数字中的最小值,就能算出在当前价位卖出时可能得到的最大利润。C++实现class Solution {public: int maxProfit(vector<int>&a

2022-01-12 00:12:38 1213

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除