
leetcode
weixin_43164504
这个作者很懒,什么都没留下…
展开
-
跳跃数组2-贪心
跳跃数组2-贪心题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例: 输入: [2,3,1,1,4] 输出: 2 解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明: 假设你总是可以到达数组的最后一个位置分析:搞清楚每一步可以跳到的最远的位置,如果当前步走完都不能达到(过程中也在更新下一步能到的最远原创 2021-09-25 13:28:24 · 366 阅读 · 0 评论 -
跳跃游戏-贪心
跳跃游戏-贪心题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1: 输入: [2,3,1,1,4] 输出: true 解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2: 输入: [3,2,1,0,4] 输出: false 解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。原创 2021-09-25 12:55:35 · 101 阅读 · 0 评论 -
最大子序和-贪心
最大子序和-贪心题目:给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例: 输入: [-2,1,-3,4,-1,2,1,-5,4] 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。分析:贪心的规则为:当累积和局部最大,就更新,当累积和小于0了,就重新累积#include "_myPrint.cpp"class Solution{public: int maxArrSum(vector<int>原创 2021-09-25 12:08:46 · 114 阅读 · 0 评论 -
摆动数列-贪心
摆动数列-贪心题目:如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一原创 2021-09-25 11:45:26 · 221 阅读 · 0 评论 -
组合-回溯法
组合-回溯法给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。说明:所有数字(包括 target)都是正整数。解集不能包含重复的组合。示例 1: 输入:candidates = [2,3,6,7], target = 7, 所求解集为: [ [7], [2,2,3] ]示例 2: 输入:candidates = [2,3,5], target原创 2021-09-08 23:14:12 · 233 阅读 · 0 评论 -
电话上数字对应的所有字母组合
电话上数字对应的所有字母组合给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。分析:回溯模版,想清楚广度遍历什么,深度遍历什么,index索引什么#include "_myPrint.cpp"using namespace std;// 电话上数字对应多个字母 如2对应abc// 给一串数字 返回这串数字对应的所有字母可能的组合方式class Solution{private: // 建立从数字原创 2021-09-08 22:38:24 · 377 阅读 · 0 评论 -
组合总和-回溯法
组合总和-回溯法找出所有相加之和为 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]]分析:回溯法模版,剪枝操作#include "_myPrint.cpp"using namespace std;// 回溯法求原创 2021-09-07 21:10:28 · 354 阅读 · 0 评论 -
组合问题-回溯法
组合问题-回溯法给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。示例:输入: n = 4, k = 2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4],]回溯法模版,剪枝优化#include "_myPrint.cpp"using namespace std;// 回溯法求组合问题class Solution{public: vector<vector<int>> res;原创 2021-09-07 20:37:08 · 193 阅读 · 0 评论 -
修剪二叉搜索树
修剪二叉搜索树给定一个二叉搜索树,同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树,使得所有节点的值在[L, R]中 (R>=L) 。你可能需要改变树的根节点,所以结果应当返回修剪好的二叉搜索树的新的根节点。二叉搜索树是中序非递减,因此可能删除的节点在中间位置,不一定会在叶子节点位置。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 给定一个区间【low,high】 修减二原创 2021-09-07 19:05:12 · 77 阅读 · 0 评论 -
二叉树的最近公共祖先
二叉树的最近公共祖先给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”分析:递归三部曲。有返回值时,子节点的返回值如何界定#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找最近公共祖先cla原创 2021-09-06 20:23:06 · 67 阅读 · 0 评论 -
BST中的众数(中序非递减)
BST中的众数(中序非递减)- 对比普通二叉树的众数给定一个有相同值的二叉搜索树(BST),找出 BST 中的所有众数(出现频率最高的元素)。假定 BST 有如下定义:结点左子树中所含结点的值小于等于当前结点的值结点右子树中所含结点的值大于等于当前结点的值左子树和右子树都是二叉搜索树分析:BST和中序绑定在一定#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;class Soluti原创 2021-09-05 10:50:41 · 137 阅读 · 0 评论 -
判断BST
判断BST给定一个二叉树,判断其是否是一个有效的二叉搜索树。假设一个二叉搜索树具有如下特征:节点的左子树只包含小于当前节点的数。节点的右子树只包含大于当前节点的数。所有左子树和右子树自身必须也是二叉搜索树分析:递归三要素,迭代中序的写法不太一样#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 验证二叉搜索树// 递归和迭代法class Solution{public:原创 2021-09-05 09:50:19 · 179 阅读 · 0 评论 -
最大二叉树
给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下:二叉树的根是数组中的最大元素。左子树是通过数组中最大值左边部分构造出的最大二叉树。右子树是通过数组中最大值右边部分构造出的最大二叉树。通过给定的数组构建最大二叉树,并且输出这个树的根节点。分析:注意开闭区间#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 给定数组 构造最大二叉树// 最大二叉树是数组中最大元原创 2021-09-04 16:12:53 · 135 阅读 · 0 评论 -
根据一棵树的中序遍历与后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。注意:你可以假设树中没有重复的元素。分析:区间的开闭要统一,使用变动索引的方式就无需辅助空间了#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 从中序和后序遍历构造二叉树 假定二叉树中没有重复元素class Solution{public: TreeNode* inPost2Tree(vector<int>& in,原创 2021-09-04 15:41:42 · 211 阅读 · 0 评论 -
求二叉树左下角的值
求二叉树左下角的值给定一个二叉树,在树的最后一行找到最左边的值分析:遍历整个树时候用void方法配合全局变量,递归遍历部分时候需要返回值#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中左下角的值// 左下角为最深一层最左边的值class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定原创 2021-09-04 10:49:04 · 125 阅读 · 0 评论 -
计算给定二叉树的所有左叶子之和
计算给定二叉树的所有左叶子之和。分析:注意左叶子的定义,首先自己为左节点,其次没有孩子节点。自己是否为左节点要通过父亲节点判断,因此判断逻辑用父亲节点。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中左叶子之和class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定递归的终止条件原创 2021-09-04 09:58:28 · 390 阅读 · 0 评论 -
求二叉树的所有路径
求二叉树的所有路径给定一个二叉树,返回所有从根节点到叶子节点的路径说明:叶子节点是指没有子节点的节点。分析:递归中隐含着回溯,注意回溯的写法,以及void函数中参数的传递。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 找到二叉树中所有路径class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确原创 2021-09-04 09:22:09 · 158 阅读 · 0 评论 -
求二叉树的最大和最小深度-后序 前序 层序
求二叉树的最大和最小深度-后序 前序 层序给定二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:叶子节点是指没有子节点的节点。分析:后序求高度 前序求深度 层序的层数就是深度#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 求一颗二叉树的深度class Solution{public: // 确定递归的参数和返回值 // 确定每原创 2021-09-03 21:38:08 · 145 阅读 · 0 评论 -
判断二叉树是否对称-递归和迭代
判断二叉树是否对称-递归和迭代给定二叉树,检查它是否是镜像对称的。例如,二叉树[1,2,2,3,4,4,3]是对称的。但是下面这个[1,2,2,nu11,3,nu11,3]则不是镜像对称的:分析:注意null位置,如果先左右中(后序)遍历一遍,再右左中遍历,两者数组一样,也并不能说明二叉树镜像,一定要同时从两个方向遍历同一个树。#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;// 判断一原创 2021-09-03 19:54:12 · 150 阅读 · 0 评论 -
翻转二叉树(结果和原始的轴对称)
翻转二叉树(结果和原始的轴对称)可以使用前序(后序)遍历,便于翻转#include "_myPrint.cpp"#include "stack"#include "queue"using namespace std;class Solution{public: // 确定递归的参数和返回值 // 确定每一层递归需要做的事情 // 确定递归的终止条件 TreeNode* invertTree(TreeNode* root){ //前序递归 if原创 2021-09-01 21:18:20 · 89 阅读 · 0 评论 -
二叉树层序遍历模版
二叉树层序遍历模版#include "_myPrint.cpp"#include "_TreeNode.cpp"#include "stack"#include "queue"using namespace std;class Solution{public: vector<vector<int>> levelOrder(TreeNode* root){ vector<vector<int>> res;原创 2021-09-01 19:54:34 · 90 阅读 · 0 评论 -
二叉树三序遍历-迭代法
二叉树三序遍历-迭代法分析:前后写法思想类似,中序写法不同#include "_myPrint.cpp"#include "_TreeNode.cpp"#include "stack"using namespace std;class Solution{public: vector<int> inTravel_(TreeNode* root){ vector<int> res; stack<TreeNode*> st原创 2021-09-01 19:30:12 · 76 阅读 · 0 评论 -
二叉树深度搜索-前中后三序遍历
二叉树深度搜索-前中后三序遍历-递归法分析:注意递归的三个要素#include "_myPrint.cpp"#include "_TreeNode.cpp"using namespace std;// 递归的三要素// 参数和返回值,每层递归需要实现的逻辑,递归终止的条件class Solution{public: void travel(TreeNode* cur, vector<int>& vec){ if (cur == NULL) ret原创 2021-08-31 23:11:37 · 75 阅读 · 0 评论 -
map 小顶堆的实现-基本语法和用法
map 小顶堆的实现-基本语法和用法题目:给定一个非空的整数数组,返回其中出现频率前k高的元素。示例1:输入:nums=[1,11,2,2,3],k=2 输出:[1,2示例2输入:nums=[1],k输出:[1提你可以假设给定的k总是合理的,且1≤k≤数组中不相同的元素的个数。 你的算法的时间复杂度必须优于O( n log n),n是数组的大小。题目数据保证答案唯一,换句话说,数组中前k个高频元素的集合是唯一的。·你可以按任意顺序返回答案。分析:注意写法#include "_myPr原创 2021-08-31 22:15:04 · 246 阅读 · 0 评论 -
求滑动窗口的最大值-线性时间
求滑动窗口的最大值-线性时间题目:给定一个数组nums,有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在 滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。进阶你能在线性时间复杂度内解决此题吗?分析:使用deque维护front位置始终最大的队列#include "_myPrint.cpp"#include "deque"using namespace std;class Solution{public: vector<in原创 2021-08-31 19:45:46 · 84 阅读 · 0 评论 -
基础栈操作-求解波兰表达式
基础栈操作-求解波兰表达式题目:根据逆波兰表示法,求表达式的值。有效的运算符包括。每个运算对象可以是整数,也可以是另一个逆波兰表达式说明整数除法只保留整数部分。给定逆波兰表达式总是有效的。换句话说,表达式总会得岀有效数值且不存在 除数为0的情况。示例1输入:[“2”,“1”,"+",“3”,"* 输出:9解释:该算式转化为常见的中缀算术表达式为:(2+1)*3)=9分析:注意cpp中各类型,单引号和双引号不一样。注意栈的取值操作int x = st.top(); st.pop();#in原创 2021-08-31 19:05:49 · 180 阅读 · 0 评论 -
栈的经典应用
栈的经典应用题目:给定一个只包括"(’,")’,"{’,"},"[,"]的字符串,判断字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭 左括号必须以正确的顺序闭注意空字符串可被认为是有效字符串。示例1:输入:"()"输出:true分析:先分析出匹配失败有哪几种情况#include "stack"#include "_myPrint.cpp"using namespace std;class Solution{public: bool isValid(stri原创 2021-08-30 22:08:49 · 74 阅读 · 0 评论 -
kmp算法的应用
kmp算法找substr,前缀表的思想题目:实现 strstr()函数。定一个 haystack字符串和一个 needle字符串,在 haystack字符串中找出 needle字符串出现的第 位置(从0开始)。如果不存在,则返回例1:输入: haystack=“heo” needle="‖|"输出:2例2:输入: haystack=“aaa” needle="bba"输出说明:当 needle是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。对于本题而 言,当 needle是空字符串原创 2021-08-30 20:43:27 · 134 阅读 · 0 评论 -
反转一个字符串中所有单词的位置
反转一个字符串中所有单词的位置题目:给定一个字符串,逐个翻转字符串中的每个单词。输入:" the sky is b|ue" 输出:" blue is sky the"示例2输入:" hello world! 输出:“Word!helo”解释:输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例3输入:" a good example" 输出:" example good a"解释:如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。分析:去除空格用双指针的原创 2021-08-25 13:55:21 · 185 阅读 · 0 评论 -
字符串替换-扩容逆序双指针
字符串替换-扩容逆序双指针题目:请实现一个函数,把字符串S中的每个空格替换成"%20"。示例1:输入:s=" We are happy! 输出:“We%20are%20 happy.”分析:将字符串扩容至结果长度,新指针在新字符串结尾,旧指针在旧字符串结尾,从后往前遍历#include "_myPrint.cpp"using namespace std;class Solution{public: string replaceSpace(string s){ int原创 2021-08-25 10:41:38 · 105 阅读 · 0 评论 -
字符串隔段反转-使用索引
字符串隔段反转-使用索引题目:给定一个字符串s和一个整数k,你需要对从字符串开头算起的每隔2k个字符的前k个字符进行反转。果剩余字符少于k个,则将剩余字符全部反转果剩余字符小于2k但大于或等于k个,则反转前k个字符,其余字符保持原样输入:s=" abcdefg",k=2 输出:" bacdfeg"分析:对于有规律的反转,尽量使用索引一次遍历#include "_myPrint.cpp"using namespace std;class Solution{public: strin原创 2021-08-25 10:13:42 · 107 阅读 · 0 评论 -
判断一个字符串中所有元素是否都能在另一字符串中找到
判断一个字符串中所有元素是否都能在另一字符串中找到,若某个元素重复,在该字符串中的重复次数小于等于另一字符串该元素的重复次数题目:给定一个赎金信( (ransom)字符串和一个杂志( magazine)字符串,判断第一个字符串 ranson能不能由第 字符串 magazines里面的字符构成。如果可以构成,返回true;否则返回 false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂忐字符 串中的每个字符只能在赎金信字符串中使用一次。注意你可以假设两个字符原创 2021-08-24 22:10:13 · 239 阅读 · 0 评论 -
四数组每各出一个数,相加和为0,求多少种情况
四数组每各出一个数,相加和为0,求多少种情况题目:给定四个包含整数的数组列表A,B,C,D,计算有多少个元组(i,j,k,),使得Ai]+B[j]+CKk]+D为了使问题简单化,所有的A,B,C,D具有相同的长度N,且0≤N≤500。所有整数的范围在-2^28到2^28-1之间,最终结果不会超过2~31例如输入:A=[1,2]B=[-2,-1]C=[-1,2]D=[0,2]输出:2解释:两个元组如下1.(0,0,0,1)->A[0]+B[O]+C[O]+D[们=1+(-2)+(-1)+2=原创 2021-08-23 23:09:34 · 453 阅读 · 0 评论 -
hashmap- unordered map-基本用法
hashmap- unordered map-基本用法题目:给定一个整数数组nums和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返 他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例给定nums=[2,7,11,15], target=9因为nums[o]+nums2+7=9所以返回[0,1分析:需要输出下标,不能排序,两数之和相当于在hash表中查找num2 = 【target-num1】,使用hashmap,具有key原创 2021-08-23 22:40:27 · 144 阅读 · 0 评论 -
哈希- unordered set-快速判断元素是否出现过
哈希- unordered set-快速判断元素是否出现过题目:编写一个算法来判断一个数n是不是快乐数。快乐数」定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这 过程直到这个数变为1,也可能是无限循环但始终变不到1。如果可以变为1,那么这个数就是快乐 数如果n是快乐数就返回True;不是,则返回 False示例输入:19输出:true解释12+92=8282+22=6862+82=10012+02+0^2=1分析:使用unordered set能达到O原创 2021-08-23 22:02:45 · 1278 阅读 · 0 评论 -
unordered_set基本使用方法
unordered_set基本使用方法题意:给定两个数组,编写一个函数来计算它们的交集示例1输入:nums1=[1,2,2,1],nums2=[2,2] 输出:[2]示例2输入:nums1=[4,9,5] o nums2 =[9,4,9,8,4] 输出:[9,4]说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。分析:满足无重复元素,无序的特性#include <vector>#include <iostream>#include <un原创 2021-08-22 11:16:14 · 1200 阅读 · 0 评论 -
哈希-入门介绍
哈希-入门介绍给定两个字符串s和t,编写一个函数来判断t是否是s的字母异位词示例1:输入:s=" anagram"t=" nagaram"输出:true示例2:输入:s="rat"t="car"输出: false说明:你可以假设字符串只包含小写字母。分析:哈希查找一个对象是否在一个结构中出现的效率为O(1),哈希的本质是映射,确定映射规则即可。#include <vector>#include <iostream>using namespace std;class原创 2021-08-22 10:30:39 · 89 阅读 · 0 评论 -
找到数组中三数之和为0的所有组合情况
找到数组中三数之和为0的所有组合情况题目:给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,C,使得a+b+c=0? 请你找出所有满足条件且不重复的三元组注意:答案中不可以包含重复的三元组。示例给定数组nums=[-1,0,1,24满足要求的三元组集合为:[[-1,0,分析:只需要值,不需要索引,可以将数组重新排序#include <vector>#include <iostream>using namespace std;class原创 2021-08-22 09:55:44 · 505 阅读 · 0 评论 -
反转链表-双指针以及递归实现
反转链表-双指针以及递归实现题意:反转一个单链表。示例:输入:1->2->3->4->5->NULL输出:5->4->3->2->1->NULL分析:类似dummyhead的方式#include <vector>#include <iostream>using namespace std;struct ListNode{ int val; ListNode* next; ListNod原创 2021-08-22 00:07:41 · 57 阅读 · 0 评论 -
链表-基本结构和增删改查
链表-基本结构和增删改查题意:在链表类中实现这些功能:get(index):获取链表中第 index 个节点的值。如果索引无效,则返回-1。addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点。插入后,新节点将成为链表的第一个节点。addAtTail(val):将值为 val 的节点追加到链表的最后一个元素。addAtIndex(index,val):在链表中的第 index 个节点之前添加值为 val 的节点。如果 index 等于链表的长度,则该节点将附加到链表原创 2021-08-20 16:46:53 · 71 阅读 · 0 评论