
leetcode
抖抖认真了
要成为合格的程序员
展开
-
leetcode------分割回文串
解题思路:这个简单的方法就是,用回溯,一个个的遍历。每一次从下一个遍历之前,都需要判断当前子串是不是回文串,这里的回文串检查可以用动态规划储存起来,加快速度:dp[i][j]是不是回文串,判断s[i] == s[j] && ( j -i< 3 || dp[i+1][j-1])class Solution {public: bool IsHUIWEN(string s) { int l = 0; int r = s...原创 2020-12-31 14:45:24 · 347 阅读 · 0 评论 -
最长连续序列
这道题,我想最简单的做法就是先排序,然后顺序记录最长子序列。这样基本不需要辅助空间。如果要实现时间复杂度为O(n)的方法,那么就得用空间来换时间,所以得找一种数据结构来存储,并且很快知道相邻关系。可以使用hash表或者set来存储,这样当一个数num存进去,我就能判断num-1 和num+1在不在里面了。从而我们可以使用set去完成,假设num-1在里面,那么就不应该从num开始计数,从而继续向前检查,直到num-1不在里面,那这样就能将子序列遍历完,并且是最长的。code:class Solut.原创 2020-12-27 09:58:50 · 195 阅读 · 0 评论 -
买卖股票的最佳时机
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解题思路:使用动态规划,可以看出,昨天的状态是和今天的状态是有关的上面是截取的leetcode的题解思路,就是今天有股票的收益或者今天没有股票的收益,明显没有股票的收益就是昨天没有股票的收益+今天卖出股票的收益的最大;同理今天持有股票的收益。mark:注意二维数组的最后一维原创 2020-12-26 15:18:17 · 153 阅读 · 0 评论 -
填充每个节点的下一个右侧节点指针 II-----------------leetcode
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。解题思路:这一题使用多余的辅助空间就...原创 2020-12-24 10:48:17 · 113 阅读 · 0 评论 -
leetcode----------填充每个节点的下一个右侧节点指针
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的...原创 2020-12-23 11:08:08 · 197 阅读 · 1 评论 -
leetcode-----------不同的子序列
给定一个字符串 s 和一个字符串 t ,计算在 s 的子序列中 t 出现的个数。字符串的一个 子序列 是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,“ACE” 是 “ABCDE” 的一个子序列,而 “AEC” 不是)题目数据保证答案符合 32 位带符号整数范围输入:s = “rabbbit”, t = “rabbit”输出:3解释:如下图所示, 有 3 种可以从 s 中得到 “rabbit” 的方案。(上箭头符号 ^ 表示选取的字母)rabbbit原创 2020-12-22 09:58:27 · 194 阅读 · 0 评论 -
有序链表转换二叉搜索树
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。示例:给定的有序链表: [-10, -3, 0, 5, 9],一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树: 0 / \ -3 9 / /-10 5解题思路:我想到的是每一次分治,然后分支的中间节点是根节点,左右分别是左右子树。所以原创 2020-12-21 09:57:17 · 344 阅读 · 0 评论 -
复原IP地址
给定一个只包含数字的字符串,复原它并返回所有可能的 IP 地址格式。有效的 IP 地址 正好由四个整数(每个整数位于 0 到 255 之间组成,且不能含有前导 0),整数之间用 ‘.’ 分隔。例如:“0.1.2.201” 和 “192.168.1.1” 是 有效的 IP 地址,但是 “0.011.255.245”、“192.168.1.312” 和 “192.168@1.1” 是 无效的 IP 地址。示例 1:输入:s = “25525511135”输出:[“255.255.11.135”,“25原创 2020-12-18 14:37:37 · 302 阅读 · 0 评论 -
分割链表
给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。示例:输入: head = 1->4->3->2->5->2, x = 3输出: 1->2->2->4->3->5思路:刚开始的思路就是使用两个队列,一个保存小于x的,另一个保存大于或等于x的;然后再重新链接一边。/** * Definition for singly-.原创 2020-12-08 10:18:25 · 175 阅读 · 0 评论 -
简化路径
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (..)表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径请注意,返回的规范路径必须始终以斜杠 / 开头,并且两个目录名之间必须只有一个斜杠 /。最后一个目录名(如果存在)不能以 / 结尾。此外,规范路径必须是表示绝对路径的最短字符串。..原创 2020-12-02 10:44:57 · 277 阅读 · 0 评论 -
leetcode-----颜色分类
给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。注意:不能使用代码库中的排序函数来解决这道题。输入: [2,0,2,1,1,0]输出: [0,0,1,1,2,2]注:不使用排序算法,仅使用一遍遍历,和常数空间来进行分类我的思路...原创 2020-04-20 14:47:42 · 188 阅读 · 0 评论 -
leetcode----数青蛙
题目:给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有...原创 2020-04-19 15:01:34 · 400 阅读 · 0 评论 -
leetcode-------编辑距离
解法是参考的别人的题解:class Solution {public: int minDistance(string word1, string word2) { int n1 = word1.size(); int n2 = word2.size(); vector<vector<int>> dp...原创 2020-03-25 12:22:21 · 119 阅读 · 0 评论 -
最长递增子序列
给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4解释: 最长的上升子序列是[2,3,7,101],它的长度是 4。输入: [1,3,6,7,9,4,10,5,6]输出: 6这一题,我刚开始得思路就是暴力法:创建一个数组,用来记录它此时所在得最长长度,这个最长长度就是由从前一位开始,向后遍历,计算最...原创 2020-03-16 00:02:20 · 244 阅读 · 0 评论 -
leetcode------------正则表达式匹配
给你一个字符串s和一个字符规律p,请你来实现一个支持'.'和'*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素说明:s可能为空,且只包含从a-z的小写字母。 p可能为空,且只包含从a-z的小写字母,以及字符.和*示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹...原创 2020-02-18 12:58:51 · 379 阅读 · 0 评论 -
算法题-------压缩算法
题目:小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串的过于长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助他进行解压缩么?输入描述:输入第一行包...原创 2020-02-05 22:23:34 · 845 阅读 · 0 评论 -
leetcode------两数相除
题目:给定两个整数,被除数dividend和除数divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数dividend除以除数divisor得到的商。说明:被除数和除数均为 32 位有符号整数。 除数不为0。 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−2^31,2^31− 1]。本题中,如果除法结果溢出,则返回 ...原创 2019-11-27 21:38:41 · 263 阅读 · 0 评论 -
leetcode----------------四数之和
这里记录这一题,也是告诉自己,在遇到这一类题的时候,思路要清晰,遇到重复问题,不能够当遇到时加个别判例,而是一开始就要分情况处理好;题目:给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。注意:答案中不可以包含...原创 2019-11-02 15:47:23 · 118 阅读 · 0 评论 -
leetcode------整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。...原创 2019-10-23 22:23:49 · 198 阅读 · 0 评论 -
leetcode-------Nim游戏
不知不觉,我的leetcode写了积累了快100道了,现在写题目,就感觉有的题目是有规律的,但是我还是得墨迹半天,重新找规律,以及包括动态规划啊,回溯啊,等等,这些都不能即使找到最快的方法去解题,这样我解再做的题,也还是很慢,我需要总结以下这些题目的方法和类别,当下次遇到这样的题时,我得立马找到方法,去解决它!所以等我写齐100道,就开始总结了,每天只写一道了,希望这些在我面试的时候,能用到吧,然...原创 2019-10-16 21:12:38 · 141 阅读 · 0 评论 -
leetcode-------------加一
题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。你可以假设除了整数 0 之外,这个整数不会以零开头输入: [1,2,3]输出: [1,2,4]解释: 输入数组表示数字 123输入: [4,3,2,1]输出: [4,3,2,2]解释: 输入数组表示数字 4321很明显,这里就怕一直...原创 2019-10-15 21:17:05 · 108 阅读 · 0 评论 -
leetcode-----乘积最大子序列和
题目:给定一个整数数组nums,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。输入: [2,3,-2,4]输出: 6解释:子数组[2,3]有最大乘积6输入: [-2,0,-1]输出: 0解释:结果不能为 2, 因为 [-2,-1] 不是子数组这一题刚开始,我想到的是加法的最大子序列和,于是我用来最巧妙的解法,就是遍历一遍,但是发现乘法和加法还...原创 2019-10-13 23:06:20 · 456 阅读 · 0 评论 -
leetcode--------------分解单词
题目:给定一个非空字符串 s 和一个包含非空单词列表的字典 wordDict,判定 s 是否可以被空格拆分为一个或多个在字典中出现的单词。说明: 拆分时可以重复使用字典中的单词。 你可以假设字典中没有重复的单词,输入: s = "leetcode", wordDict = ["leet", "code"]输出: true解释:返回true, 因为"leetcod...原创 2019-10-12 22:38:51 · 112 阅读 · 0 评论 -
leetcode---------------------递归 (easy)
struct TreeNode { int val; TreeNode* left; TreeNode* right; int length = 0; TreeNode(int x) : val(x), left(NULL), right(NULL) {}};class Solution {public: int LEN = -1; //Matchmaker(红娘)...原创 2019-04-06 20:58:01 · 99 阅读 · 0 评论 -
Decoded String at Index--------emmm(没想到索引的好方法)
class Solution {public: stack<char> _stack1; stack<char> _stack2; string _print; string finally; string decodeAtIndex(string S, int K) { int num = 0; int g = 0; while (true) ...原创 2019-04-18 23:07:57 · 198 阅读 · 0 评论 -
leetcode------Rotting Oranges
class Solution {public: int orangesRotting(vector<vector<int>>& grid) { int fresh=0; int dTime=0; for(int i=0;i<grid.size();++i) { ...原创 2019-05-20 23:14:44 · 143 阅读 · 0 评论 -
leetcode--------All Nodes Distance K in Binary Tree
我写了一下,大体的逻辑是对的,但是要学会利用结构,而不是硬写,逻辑本来很简单,但也让你搞得很复杂!这题得思路是,这就相当于一个单向的,不能访问父亲节点,所以我必须用一个map来记录所有的父亲节点,而我只是单纯的把只关于target的节点的一条路径的父亲节点给记录下来,这样也让我写的更加复杂,而接下来的找的过程,也就是根据K的长度,递归K的深度,如果不为空,则record,关于父亲节点的递归...原创 2019-05-29 16:57:53 · 133 阅读 · 0 评论 -
All Possible Full Binary Trees----哈哈,佩服自己,写的程序是对的,但是栈溢出,这是什么垃圾程序。。。。
class Solution {public: queue<TreeNode *> GGGG; TreeNode* clone(TreeNode *node) { if (node == NULL) return NULL; TreeNode *root = new TreeNode(node->val); root->left = clone(no...原创 2019-06-03 20:37:22 · 133 阅读 · 0 评论 -
最大子序列和
刚开始拿到这道题目的时候,我还不知道咋去用分治,连两次循环我也没想到,还是看了别人的思想然后写的:我的解法是,将其分成左和右,分别求出左边最大和右边最大以及中间最大,但求中间最大的时候,我是直接遍历从中间开始然后寻找最大,这样随着长度变大我每一次都会遍历很长的长度,所以这也是不可取的(当我看到我的代码时,我是头皮发麻的)class Solution {public: int l...原创 2019-06-21 11:17:17 · 107 阅读 · 0 评论 -
摩尔投票算法
经过看别人的证明,我才知道这是一个算法,我昨天晚上刷leetcode时,Majority Element这道题,自己写了个分治算法,但是消耗内存特别大,时间也比较慢,题目是求众数,且保证众数的个数大于总数的一半。class Solution {public: map<int, int> merge_map(map<int, int> &left, map&...原创 2019-06-25 10:53:08 · 101 阅读 · 0 评论 -
leetcode--------- Different Ways to Add Parentheses
我也想的是用分治算法来解,但是关于子问题的规划,总是没有找到合适的办法,导致自己想的过于复杂,我觉得分治算法,对于一个序列来说,可以先看一种简单的情况,就比如是对于2+3*1;这样的小问题,采取分治来解,之前我想的分治都是把这样一个序列给分开,但是这里加括号,必须前后都是有联系的,所以,应该是每次都应该把原序列分成不同大小的部分,然后来解;对于2+3*1,这样的小问题,无非就是把2当成左边,运...原创 2019-06-28 10:48:45 · 96 阅读 · 0 评论 -
leetcode-----------Multiply Strings
题目是输入两个都是整数的字符串,要求将两个数相乘,输出这个乘的结果的字符串;刚开始,我想的是分别将每个字符串用正数求出来,然后用数乘得到结果,最后再把它变成字符串输出;但是如果两个数刚开始都比较大,则数乘结果并不能代表其真正的结果,从而就不对;因此我写的不对/*-------------错误的代码------------------*/class Solution {public...原创 2019-07-20 10:39:42 · 93 阅读 · 0 评论 -
leetcode------------------combination sum I
这一题是一种回溯法,在我看来就是深度搜索,从数组的第一个开始,一直在这个位置push(这个内层就是也是从这个位置开始的继续向后的push);直到temp中的和为0,直接存储下来,不然就从上一个位置开始,继续push,直到外层迭代结束;这样就避免了后面的值,再次利用前面的,导致和前面计算的结果重复;void backtrack(vector<int> &arr,vector...原创 2019-07-17 20:26:30 · 78 阅读 · 0 评论 -
46. Permutations---------------简单实现
我想的办法和之前实现combination sum 是一个思路;用的是回溯法,若有一个数组[1,2,3,4];则共有4!种排序;于是外层进行4!循环,然后依次遍历这个数组;第一次是1,push进一个vector,然后,进行递归,将剩下的[2,3,4]也执行同样的操作,即首先将2push进vector,再将[3,4]进行递归,当[3,4]递归结束,将2pop_back出来,然后,替换2和3的位置...原创 2019-07-21 14:49:05 · 140 阅读 · 0 评论 -
leetcode------min_stack
这一题就是想在常数时间内取出最小值,于是我利用了辅助数据结构,多存了一个栈,每次都push当前最小的值,如果当前x比min.top()大,则存min.top(),否则存x;pop的时候,将两个栈都各pop一次;class MinStack {public: stack<int> min; stack<int> var; /** initial...原创 2019-08-04 10:38:48 · 117 阅读 · 0 评论 -
leetcode-------N-Queen
N-Queens 问题,就是找出不同的N-Queens,我刚开始以为只是以为只要把第一行的Q放不同的位置,后面可能就固定了,于是思考的种类就少了,这其实在学栈的时候,就学过,思想就是,在栈里放入之前Q的位置,分别检查下一个要放入的位置是否和栈里所有的Q冲突,如果没有,则入栈,否则下一个,直到N-Queens放满为止,下面的解法,只考虑了第一行的Q的不同位置,(后期有改进)class S...原创 2019-08-04 12:35:08 · 167 阅读 · 0 评论 -
leetcode-----------Group Anagrams
题目:Input: ["eat", "tea", "tan", "ate", "nat", "bat"],Output:[ ["ate","eat","tea"], ["nat","tan"], ["bat"]]我刚开始的解法是:将每个新的string排个序,然后与当前的vector中的string排序的结果对比,看是否一样,一样就加入,否则就新创建,但是当输入的...原创 2019-07-31 21:41:24 · 146 阅读 · 0 评论 -
leetcode----------------- Pow(x, n)
好吧,这是个感觉不是很难的题目,但是我没有想到一个好办法。。。此处是别人的解法:我觉得看的很清晰明了:就是将其递归,每次将其拆分。 long double pow_MY(double x, int n){ long posit_n = abs(long(n)); if (n ==...原创 2019-07-31 22:52:30 · 93 阅读 · 0 评论 -
leetcode-----有效的括号
这一题思路很简单,就是简单的存栈,然后消消乐,遇到与栈顶是一样的,就删除栈顶,否则就push,当遍历完的时候,只有栈为空,说明是对的;class Solution {public: bool check(const char &cur,const char &top_char) { if(top_char=='('&&cur=...原创 2019-08-05 17:10:51 · 95 阅读 · 0 评论 -
leetcode--------Spiral Matrix
依次打印外层,然后打印里层;当处理里层的边界问题时,比如只有一列时,出现了一点问题,于是就多了几句判断条件class Solution { public: void c_clock_wise(vector<int> &_print, vector<vector<int>>& matrix, int lo_row...原创 2019-08-05 21:50:36 · 103 阅读 · 0 评论