
LeetCode
文章平均质量分 65
一个程序渣渣的小后院
这个作者很懒,什么都没留下…
展开
-
每天一道LeetCode-----最长回文子串/序列,从头开始的最长回文子串长度
原题链接 Longest Palindromic Substring 意思是找到最长的回文子串,注意子串和子序列的区别蛮力法就将每个可能的子串都找出来判断是否是回文子串,找最大的那一个,速度上慢的吓人,光找子串的速度就到O(n2)了,所以此处需要找到一个简单的方法找到回文子串。 既然回文子串是从中心开始向两边延伸时,左右两边相同,那么就可以从每个字符开始都向两边延伸,看能找到的最长回文子串是原创 2017-10-17 21:52:48 · 4565 阅读 · 0 评论 -
每天一道LeetCode-----KMP算法查找子串,重新实现strStr()函数
Implement strStr()原题链接Implement strStr() 子串查找,方法很多,可以用string内置的接口find解决,这里主要复习一下kmp算法kmp算法常用于字符串匹配,相比于传统方式一个一个查找,当遇到不匹配时从头开始的土方法,kmp可以有效减少比较次数,遇到不匹配时,不需要从头开始判断abababc中是否存在ababc子串,直观上是存在的 a原创 2017-10-27 11:33:56 · 3681 阅读 · 0 评论 -
每天一道LeetCode-----只可能有'.'和'*'的字符串正则匹配
Regular Expression Matching原题链接Regular Expression Matching 意思是模拟正则表达式的. *操作,判断给定的目标字符串p是否匹配源字符串s。 规则‘.’匹配任意一个字符‘*’匹配前一个字符0次或者多次,即可以删除它前面的字符注:例子中isMatch(“ab”, “.“) == true说明”.“可以匹配的字符可以是任意组合,比如说此原创 2017-10-19 21:35:06 · 356 阅读 · 0 评论 -
每天一道LeetCode-----回文链表
Palindrome Linked List原题链接这里写链接内容 意思是判断链表是不是回文的回文数都一样,左边和右边相等,重点是要找到中心位置,链表的中心位置比较不容易找,这里主要记录一种方法。 中心位置肯定就是总数除以2,那么只需要两个指针从头开始,一个步长为1,一个步长为2,最后步长为1的指针指向的就是链表中心ListNode *find_center(ListNode* head)原创 2017-10-19 23:17:01 · 606 阅读 · 0 评论 -
每天一道LeetCode----位运算实现加减乘除四则运算
Divide Two Integers原题链接Divide Two Integers 意思是重新实现除法运算,这里不要复习一下用位运算实现加减乘除四则运算 C++学习笔记—–用位运算实现加减乘除以前也有记录过,这里主要是复习,另外,除法需要优化,在这里实现加法通过异或运算和与运算实现 两个二进制数相加,异或运算的结果是不考虑进位时的结果 两个二进制数相加,与运算的结果是对应为是否有进位0原创 2017-10-28 16:05:53 · 3554 阅读 · 0 评论 -
每天一道LeetCode-----平面木桶最大容量,以较小的纵坐标为高,横坐标差为底
原题链接Container With Most Water 意思是有n个坐标点,横坐标是索引,纵坐标给出,从每个点向x轴做垂线,求最大面积蛮力法将所有情况都判断一遍复杂度在O(n2),两层for循环。 优化的话,可以考虑使用动态规划,dp[i][j]表示从i到j这个范围最大的面积,但是后来发现仍然复杂度过高,看了答案发现自己好蠢。。。首先还是先看动态规划把,然后在这个基础上进行优化。 dp原创 2017-10-20 16:41:07 · 949 阅读 · 0 评论 -
每天一道LeetCode-----给定序列中2/3/4个元素的和为target的所有集合,或3个元素的和最接近target的集合
原题链接Two Sum意思是给定一个数组,求数组中哪两个元素的和是给定值。蛮力法的求解就是两层for循环,时间复杂度是O(n2)。class Solution {public: vector<int> twoSum(vector<int>& nums, int target) { for(int i = 0; i < nums.size() - 1; ++i)原创 2017-10-13 17:17:06 · 560 阅读 · 0 评论 -
每天一道LeetCode-----给定字符串s和字符数组words,在s中找到words出现的位置,words内部字符串顺序无要求
Substring with Concatenation of All Words原题链接Substring with Concatenation of All Words 题目意思是给定字符串s和字符数组words,在s中寻找words出现的位置,words内部的字符串顺序没有要求此问题可以直接顺序搜索,假设s的长度为m,words的长度为n,words中每个单词的长度为w,复杂度是O((m原创 2017-10-28 23:19:30 · 3729 阅读 · 0 评论 -
每天一道LeetCode-----找到给定序列中所有和为某个值的集合或集合个数,序列中可以有/无重复项,集合元素顺序不同算不同集合等
Combination Sum原题链接Combination Sum 给定一个无重复项的序列,找到所有和是target的集合,每个元素可以使用多次。可以用深度优先(dfs),对于某个元素都有两种选择,一种是选择当前元素至少一次,一种是不选择当前元素,所以在查找集合时要分开处理。比如说,当前元素下标为1,那么选择该元素,然后仍然从位置1开始继续进行(这保证了下次的元素下标仍然是1,还可以决定选原创 2017-11-07 20:42:18 · 1646 阅读 · 0 评论 -
每天一道LeetCode-----重新实现next_permutation
Next Permutation原题链接Next Permutation 重新实现next_permulation函数template <class BidirectionalIterator>bool next_permutation (BidirectionalIterator first, BidirectionalIterator l原创 2017-10-30 12:57:46 · 400 阅读 · 0 评论 -
每天一道LeetCode-----删除链表倒数第n个节点
原题链接Remove Nth Node From End of List 意思是给定一个链表,要求删除倒数第n个节点,返回链表头,复杂度在O(n)思路就是找到倒数第n个和倒数第n+1个节点即可,仅仅遍历一遍链表的话只需要记录这两个节点。 一个节点指向当前遍历到的节点,记录和链表头的距离,如果到达n,开始记录目标节点和目标节点的上一个节点。 以题目实例为例 (header) | (he原创 2017-10-22 12:41:27 · 1306 阅读 · 0 评论 -
每天一道LeetCode-----找到序列中第一个没有出现的正整数,要求时间复杂度是O(n),空间复杂度是O(1)
First Missing Positive原题链接First Missing Positive 给定一个序列,找到第一个没有出现的正整数,要求复杂度是O(n),空间复杂度为O(1)。 这种时间复杂度要求是O(n)的问题一般都是遍历一遍出结果,但是遍历一遍的代价是需要使用额外的空间记录某些信息以达到解决问题的目的,但是这里不可以使用额外的空间。既然不可以,但又非要不可,那么只能用源序列作为记原创 2017-11-08 14:32:39 · 1832 阅读 · 0 评论 -
每天一道LeetCode-----括号匹配
Valid Parentheses 意思是判断是否满足匹配关系,使用栈遍历一遍即可class Solution {public: bool isValid(string s) { std::stack<char> st; for(int i = 0; i < s.size(); ++i) { char ch = s.原创 2017-10-23 13:36:06 · 4858 阅读 · 0 评论 -
每天一道LeetCode-----获取无重复项/有重复项序列的全排列
原题链接Permutations 要求是输出给定序列的全排列,序列中不包含重复元素 STL中有next_permutation函数可以获取当前序列的下一个排列,使用起来也很简单,先对序列按递增顺序排序,然后不断调用next_permutation函数获取当前序列的下一个更大的排列,如果没有更大的排列就返回falseclass Solution {public: vector<vec原创 2017-10-31 19:26:26 · 1935 阅读 · 0 评论 -
每天一道LeetCode-----最长无重复子串
原题链接Longest Substring Without Repeating Characters 意思是找到给定字符串最长的子串,注意,子串是在字符串中由连续的字符组成的,而子序列是通过删除若干字符得到的,二者要区分开蛮力法自然是两层for循环搞定,但是效率堪忧,需要想办法将复杂度调整到O(n),也就是只遍历一遍字符串,这就需要记录在之前是否有遇到某个字符,可以使用unordered_ma原创 2017-10-15 16:56:42 · 13950 阅读 · 2 评论 -
每天一道LeetCode-----合并两个/多个有序链表为一个新链表
Merge Sorted Array原题链接Merge Sorted Array 意思是给定两个有序数组,将其合并成一个有序数组,存在nums1中。如果先只是简单合并成一个新数组,然后将新数组赋值给nums1,基本就算完成了。现在考虑不适用其它内存空间,在nums1上原地合并新数组。 遇到的问题是如果nums1[i] > nums2[j],那么nums1[i]的位置就应该被赋值给nums2[原创 2017-10-24 15:32:38 · 2139 阅读 · 0 评论 -
每天一道LeetCode-----找到第k个排列
Permutation Sequence原题链接Permutation Sequence 给定n和k,求[1,2,3,...,n]这个序列的全排列中第k个排列可以调用k次next_permutation获取结果,但是next_permutation内部实现比较慢。 首先考虑能不能确定第k个排列是以哪个数字开头的呢,以[1,2,3,4]的全排列为例,找第14个排列以1开头的排列总共有3!个,原创 2017-11-01 13:28:16 · 4359 阅读 · 4 评论 -
每天一道LeetCode-----给定大小为n+1的数组,元素大小在[1 : n]之间,只有一个元素会重复出现多次,找到重复的那个
Find the Duplicate Number原题链接Find the Duplicate Number 给定一定大小为n+1的数组,数组中的元素只可能是1到n中的数字,包括1和n。在数组中,有一个数字重复了多次,找到这个数字。 要求不能改变源数组的值,空间复杂度为O(1),时间复杂度要小于O(n2)。注意数组中每个元素都只能是1到n之间的数字,这提供了一个有用的信息,即对于每个元素,原创 2017-11-09 19:11:35 · 6142 阅读 · 0 评论 -
每天一道LeetCode-----两个有序数组合并后的第K个数
原题链接Median of Two Sorted Arrays 意思是给定两个有序序列,找到合并之后的中位数,要求复杂度O(log(m+n))。扩展方面,找到合并之后第K小的数,因为中位数也符合第K小范畴,所以直接按照后者解题即可不考虑复杂度的情况下,首先想到的方法是一次从两个数组中选取较小的那个,直到选取第k个,此种方法复杂度在O(k),代码如下class Solution原创 2017-10-16 14:20:33 · 2976 阅读 · 0 评论 -
每天一道LeetCode-----计算一个直方图空隙的容量(如果装水能装多少)
Trapping Rain Water原题链接Trapping Rain Water 给定一序列,表示一个直方图每个柱的高度(图中黑色部分),计算这个直方图可以存储的容量(图中浅蓝色部分)直观的想法可能是直接求容量,比如说计算高度为2和高度为3的两个柱子之间的容量,但是需要减去二者之间的其他柱子所占的面积,比较麻烦。从图中可以看出,对于某个柱子,判断它是否被某两个柱子构成的区域包含的方法,是判原创 2017-11-10 14:11:40 · 1463 阅读 · 0 评论 -
每天一道LeetCode-----将链表每k个节点逆序一次
Swap Nodes in Pairs原题链接 Swap Nodes in Pairs 意思是将链表每两个节点互换位置,要求不能直接改变链表的值,只能改变next指针的方式交换 其实就是遍历一遍每两个交换即可,方法比较随意/** * Definition for singly-linked list. * struct ListNode { * int val; *原创 2017-10-25 11:41:15 · 2380 阅读 · 0 评论 -
每天一道LeetCode-----有序数组右移n位后查找某个元素
Search in Rotated Sorted Array原题链接Search in Rotated Sorted Array 一个无重复项的递增序列右移了一定距离,在右移后的序列中查找是否有某个元素 比如[0,1,2,4,5,6,7]右移4位变为[4,5,6,7,0,1,2],在[4,5,6,7,0,1,2]中查找某个元素,事先不知道移动了多少位对于有序序列,首先可以想到的是利用二分法查原创 2017-11-02 15:24:18 · 2720 阅读 · 1 评论 -
每天一道LeetCode-----顺时针旋转n×n矩阵90度
Rotate Image原题链接Rotate Image 原地旋转n × n矩阵90度正方形的旋转问题可以一圈一圈的旋转,先旋转最外层,然后内层,再内层。需要旋转的次数是矩阵行数的一半。旋转过程中元素的交换可以多次取值找规律,方法如下matrix[i][j] -> matrix[j][n-1-i];matrix[j][n-1-i] -> matrix[n-1-i][n-1-j];matri原创 2017-11-12 13:04:37 · 7198 阅读 · 2 评论 -
每天一道LeetCode-----将m × n矩阵按照顺时针螺旋顺序转化成一维数组
Spiral Matrix原题链接Spiral Matrix 给定一个m × n矩阵,按照顺时针螺旋顺序将矩阵转化成一维数组。 螺旋的方向是先从左向右,再从上到下,然后从右到左,最后从下到上。所以方向可以用{0, 1},{1, 0},{0, -1},{-1, 0}四个方向向量表示。每个方向向量都由行和列构成,1表示向右或向下移动,-1表示向左或向上移动,0表示不移动。比方说{0, 1}表示行原创 2017-11-17 14:17:47 · 6256 阅读 · 0 评论 -
每天一道LeetCode-----删除序列中指定元素,将满足要求的元素移动到前面
Move Zeroes原题链接Move Zeroes 意思是给定一个数组,将所有的0都移到后面,不能改变非0元素的相对顺序 把非0元素移到前面,后面补零即可,比较简单class Solution {public: void moveZeroes(vector<int>& nums) { if(nums.size() == 0) return;原创 2017-10-26 18:35:35 · 538 阅读 · 0 评论 -
每天一道LeetCode-----找到一个字符串在另一个字符串出现的位置,字符串内部顺序无要求
Valid Anagram原题链接Valid Anagram 实际上就是判断两个字符串中每个字符出现的个数是否相等,直接计算每个字符的个数就可以了。class Solution {public: bool isAnagram(string s, string t) { unordered_map<char, int> shash; unorde原创 2017-11-13 12:49:07 · 2595 阅读 · 0 评论 -
每天一道LeetCode-----数组序列,每个元素的值表示最多可以向后跳多远,计算最少跳多少次可以到达末尾
Jump Game II原题链接Jump Game II 给定一个数组序列,序列中每一个元素的值表示最多可以向后跳多远,初始时从下标0开始,计算最少跳多少次可以到达末尾的元素位置。刚开始是想用深度优先(dfs)+ 动态规划解决的,结果竟然超时了,看到答案后真是….哎╮(╯▽╰)╭对于每个位置,它跳一次可以到达的位置是一个范围,而对于这个范围,跳一次可以到达的位置仍然是一个范围。以示例序列[2,原创 2017-11-11 13:49:46 · 5919 阅读 · 0 评论 -
每天一道LeetCode-----某个数在递增序列第一次和最后一次出现的位置
Search for a Range原题链接Search for a Range 给定一个递增序列和一个值,找到该值在序列中出现的范围,实际上就是找到该值第一次出现和最后一次出现的位置。如果没有,返回[-1,-1]递增序列肯定是二分了,正常二分法查找算法如下,是通过判断中间位置的值与给定值的大小关系,从而将区间变为原来的一半,继续查找,不断的一半,一半,最后变成只有一个元素的区间,比较后返回。原创 2017-11-03 12:05:40 · 1177 阅读 · 0 评论 -
每天一道LeetCode-----寻找地增序列中第一个大于等于目标元素的位置
Search Insert Position原题链接Search Insert Position 要求找到目标出现的位置或者应该插入的位置,本质上就是找第一个大于等于目标元素的位置,直接调用lower_bound就解决了。当然也可以自己利用二分法重新实现class Solution {public: int searchInsert(vector<int>& nums, int ta原创 2017-11-04 10:30:42 · 3033 阅读 · 0 评论 -
每天一道LeetCode-----找到有多少个组合加起来和是n,每个组合的数字只能是1或者2
Climbing Stairs原题链接Climbing Stairs 找到有多少个组合的和是给定的n,要求组合中的每个数字只能是1和2动态规划即可 代码如下class Solution {public: int climbStairs(int n) { vector<int> dp(n + 1); dp[0] = dp[1] = 1;原创 2017-11-28 16:08:23 · 2337 阅读 · 0 评论 -
每天一道LeetCode-----数独盘求解
Valid Sudoku原题链接Valid Sudoku 判断给定的数独盘是否有效,数独盘中可能有空位置。简述一下数独的规则,参考连接Sudoku Puzzles - The Rules.每一行,数字1-9只能出现一次每一列,数字1-9只能出现一次每个3 * 3方格中,数字1-9只能出现一次。这里3 * 3方格只包括9个,即图片中加粗黑线分开的9个方格其实就是每个点只能存在1-9这九个原创 2017-11-05 14:51:37 · 1410 阅读 · 0 评论 -
每天一道LeetCode-----求一个数的n次方,n是很大很大的数,n用数组存储着
Pow(x, n)原题链接Pow(x, n) 给定一个数,求n次方。n次方可以分解成两个n/2次方相乘,所以递归即可。class Solution {public: double myPow(double x, int n) { bool negative = n < 0; double res = helper(x, n); retu原创 2017-11-14 20:33:57 · 3409 阅读 · 0 评论 -
每天一道LeetCode-----将间隔集中有重叠的间隔合并
Merge Intervals原题链接Merge Intervals 合并所有有重叠的间隔对于两个间隔interval1和interval2,二者有重叠的情况为interva1全部包含interval2,也就是说interval1.start <= interval2.start && interval1.end >= interval2.end。例如[2, 3]和[1, 5]interv原创 2017-11-19 19:43:37 · 903 阅读 · 0 评论 -
每天一道LeetCode-----将字符串的连续相同的字符合并成一个字符后加个数
Count and Say原题链接 Count and Say 求出第n个表达式,第n个表达式由第n-1个表达式的读音构成。如第3个表达式为21,读作1个2,1个1,所以第4个表达式就是1211。第4个表达式读作1个1,1个2,2个1,所以第5个表达式为111221。话说以前有次考试给的就是这一堆字符串,没给说明,问下一个是什么,当时的想法:这都是什么鬼?因为第n个表达式需要第n-1个表原创 2017-11-06 12:26:42 · 5234 阅读 · 0 评论 -
每天一道LeetCode-----将数组/链表后k个元素移动到前面
Rotate Array原题链接Rotate Array 回转一个给定数组k步,本质上是将后k个元素移动到前面(需要保证k小于数组元素个数)不在原数组上操作的话比较简单,新开一个vector保存回转后的顺序,然后copy到原数组上,时间和空间复杂度都是O(n)如果需要在原数组上操作的话,就不能有额外的空间使用消耗。那么有如下技巧将数组后k个元素逆序将数组前n - k个元素逆序将整个数组逆原创 2017-11-20 20:38:44 · 2753 阅读 · 0 评论 -
每天一道LeetCode-----n皇后问题
N-Queens原题链接N-Queens n皇后问题,和数独问题一样,都是回溯法的经典题目。 n皇后问题约束是任意两个皇后不能在一行,不能在一列,不能在同一个45度直线,不能在同一个135度直线上。所以求解时需要记录当前行是否已经存在一个皇后当前列是否已经存在一个皇后当前位置所在的45度直线上是否已经存在一个皇后当前位置所在的135度直线上是否已经存在一个皇后因为n行n个皇后,所以原创 2017-11-15 16:53:22 · 1804 阅读 · 1 评论 -
每天一道LeetCode-----计算两个序列最长的公共子序列长度
原题链接Maximum Length of Repeated Subarray计算两个序列最长的相同子序列的长度简单暴力的方法是对A中每个元素遍历一遍序列B,找到相同的位置后计算从这个位置开始有多少个元素和A是相同的,唔…大概是这个样子class Solution {public: int findLength(vector<int>& A, vector<int>& B) {原创 2017-12-08 15:45:28 · 1733 阅读 · 0 评论 -
每天一道LeetCode-----找到1,2,...,n这n个数所有的组合,每个组合有k个元素,且元素大小递增
Combinations原题链接Combinations给定两个整数n和k,返回1,2,…,n这n个元素所有的组合,每个组合包含k的元素,且元素大小递增深度优先遍历一遍解决战斗:)class Solution {public: vector<vector<int>> combine(int n, int k) { vector<vector<int>> res;原创 2017-12-09 12:13:48 · 1707 阅读 · 0 评论 -
每天一道LeetCode-----找到给定数组的连续子数组,使这个子数组的和最大,要求复杂度为O(n)
Maximum Subarray原题链接Maximum Subarray 在给定数组中找到一个子数组(连续),使这个子数组的和最大。O(n2)的解法是求sum[i] - sum[j]的最大值,形如sum[i]的式子表示数组[0 : i)的和。这种方法需要i和j都从[0:n)遍历一遍,复杂度比较高。假设当前找到一个范围[left, right],考虑以下两种情况存在某个[i, left)范围的原创 2017-11-16 17:15:46 · 3211 阅读 · 0 评论 -
每天一道LeetCode-----计算从二维数组的左上角到达右下角的所有路径数及最短的那条,如果存在障碍物时又是多少
Unique Paths原题链接Unique Paths 计算从左上角有多少条不同的路径可以到达右下角,移动方向只能是向右和向下。对于每个位置,都有两种移动的可能,即向右移动和向下移动。可以用深度优先(dfs)解决,同时为了解决重复计算,可以用动态规划的思想,记录从dp[i][j]到达右下角有多少条不同的路径。除了深度优先之外,可以用迭代法执行动态规划,这样做可以减少dp的维度,只需要一维数组原创 2017-11-21 16:56:25 · 11672 阅读 · 1 评论