
LeetCode
摩霄志在潜修羽
骐骥一跃,不能十步。驽马十驾,功在不舍。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LeetCode-168.Excel表格名称
分析26进制的问题。需要注意每“位”都是从0开始,因此需要先对nnn 减一。代码class Solution {public: string convertToTitle(int n) { string res; while (n--) { res += n % 26 + 'A'; n /= 26; } reverse(res.begin(), res.en...原创 2019-12-01 19:13:40 · 485 阅读 · 0 评论 -
LeetCode-167.两数之和II
描述分析(1)哈希法(可以在哈希前先用二分法定位到小于目标值的最大元素处)(2)利用数组升序的特点,使用双指针的方法。起始指针指向下标000处,终止指针指向数组最后一个元素。若两指针处元素之和等于目标值,返回;若大于,尾指针减一;若小于,头指针加一。妙不可言。代码哈希class Solution {public: vector<int> twoSum(vecto...原创 2019-12-01 19:11:14 · 458 阅读 · 0 评论 -
LeetCode-160.相交链表
描述分析(1)哈希法(2)官方给出了更聪明的方法:利用A+B=B+AA+B=B+AA+B=B+A的特点,使用两指针分别从AAA和BBB的头部遍历,一旦到尾部则重新定位到另一个链表的头部继续遍历。由于两链表若相交则拥有一段公共的尾部,因此一旦遇到两个链结指向同一块内存,则停止遍历返回此节点。代码哈希法/** * Definition for singly-linked list. ...原创 2019-12-01 19:03:51 · 393 阅读 · 0 评论 -
LeetCode-141.环形链表
描述分析(1)使用快慢指针。慢指针每次移动移动到下一单元,快指针每次移动到下下个单元。这样若快慢指针最终相遇(指向同一块内存),便证明存在环。时间复杂度O(n)O(n)O(n),空间复杂度O(1).O(1).O(1).(2)哈希法。时间复杂度和上面相同均为O(n)O(n)O(n),空间复杂度O(n)O(n)O(n).代码快慢指针/** * Definition for singly...原创 2019-12-01 18:55:27 · 255 阅读 · 0 评论 -
LeetCode-136.只出现一次的数字
描述分析位运算的题。根据异或 “相同为零,不同为一” 的特点,使数组中元素相互异或可以在O(n)O(n)O(n)的时间复杂度消掉所有双数个数的元素。代码class Solution {public: int singleNumber(vector<int>& nums) { int val = nums[0]; for(in...原创 2019-12-01 18:50:06 · 161 阅读 · 0 评论 -
LeetCode-125.验证回文串
解析双指针,头尾向中间依次判断。代码class Solution {public: bool isPalindrome(string s) { if(s.empty()) return true; int i = 0, j = s.length() - 1; while(i < j){ if(!isaln...原创 2019-11-27 21:03:31 · 150 阅读 · 0 评论 -
LeetCode-121.买卖股票的最佳时机
描述分析本题我想到的两种方法:暴力法:时间复杂度O(N2)O(N^2)O(N2),提交后击败10%10\%10%,显然不可行峰谷法(官方这么叫):动态记录已经遍历的元素中最小者,对当前元素,依次判断减去最小值后是否大于最大利润,若是则更新最大利润。这样的做法可以保证尝试的峰总出现在谷之后,因此时间复杂度为O(N)O(N)O(N).代码class Solution {public...原创 2019-11-27 20:34:20 · 146 阅读 · 0 评论 -
LeetCode-119.杨辉三角II
描述解析注意题目中想要让我们在O(k)O(k)O(k)的空间复杂度内实现算法。学习过对动态规划背包问题的优化,则不难想到对杨辉三角的空间优化方案:使用一维数据记录杨辉三角的当前行,对于下一行,从后向前依次使用递推式:vec[i]=vec[i-1]+vec[i]最终形成的便是杨辉三角的第 K 行。class Solution {public: vector<int> ge...原创 2019-11-26 23:03:56 · 243 阅读 · 0 评论 -
LeetCode-5.最大回文子串
描述分析拿到这道题的时候,我想到了三种方法:暴力法,时间复杂度O(3)O(3)O(3),显然不可取将字符串翻转,而后便转为求最长公共子序列的问题,时间复杂度O(2)O(2)O(2)中心拓展,依次判断,时间复杂度O(2)O(2)O(2)在写代码的时候我用了第三种方法,本以为可以通过全部测试用例,却卡在了92/103,这里先贴出我的代码代码class Solution {pub...原创 2019-11-26 22:01:14 · 163 阅读 · 0 评论 -
LeetCode-104.二叉树的最大深度
解析设置全局变量保存最大深度,dfs遍历树,若到达根节点且深度大于最大深度,则对最大深度进行更新。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int ...原创 2019-11-26 21:02:18 · 131 阅读 · 0 评论 -
LeetCode-101.对称二叉树
解析重新定义一个含有两个结点参数的函数。所谓对称,就是从根节点开始递归遍历,判断当前左结点的右子结点是否等于右结点的左子结点 and 当前左节点的左子结点是否等于右节点的右子结点。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *...原创 2019-11-26 20:59:19 · 138 阅读 · 0 评论 -
LeetCode-100.相同的树
解析数的递归遍历,由于是判断两棵树是否完相同,因此传入两树的结点位置应该是一样的(比如同时比较左子树和同时比较右子树)。代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tr...原创 2019-11-26 20:53:37 · 133 阅读 · 0 评论 -
LeetCode-83. 删除排序链表中的重复元素
分析维护一个前驱指针,判断当前链表单元的值是否和前驱的值相等,若相等则将前驱结点的后继指针指向当前单元的下一个(也就是跳过当前单元),否则将前驱指针与当前指针分别向后移动一个位置。代码/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ...原创 2019-11-14 18:14:22 · 129 阅读 · 0 评论 -
LeetCode-70.爬楼梯
class Solution {public: int climbStairs(int n) { if (n <= 3) return n; int a = 2, b = 3, c; for (int i = 4;i <= n;i++) { c = a + b; a = b; b = c; } return c; }};原创 2019-11-14 00:36:27 · 180 阅读 · 0 评论 -
LeetCode-69.x的平方根(待)
水了一波,回头学习一下牛顿迭代法求解class Solution {public: int mySqrt(int x) { return (int)sqrt(x); }};原创 2019-11-14 00:35:18 · 189 阅读 · 0 评论 -
LeetCode-66.加一
class Solution {public: vector<int> plusOne(vector<int>& digits) { int d = 1, len = digits.size()-1; for (int i = len;i >= 0 && d;i--) { int t = digits[i] + d; d...原创 2019-11-14 00:32:14 · 132 阅读 · 0 评论 -
LeetCode-58.最后一个单词的长度
class Solution {public: int lengthOfLastWord(string s) { if (s.empty()) return 0; int len = s.length(), cnt = 0, flag = 0; int i = len - 1; // 先去掉字符串前的空格 while (s[i] == ' ') i--; for (in...原创 2019-11-14 00:30:56 · 112 阅读 · 0 评论 -
LeetCode-53.最大子序和
描述分析动态规划问题,时间复杂度O(N)O(N)O(N).使用数组 dp[N],其中dp[i] 表示以第 i 个元素结尾的最大子序和。每个dp[i] 都对应两种情况:加上第 i 个元素还不如不加(dp[i] > dp[i-1] + nums[i]),此时dp[i] = nums[i];加上第 i 个元素后的最大子序和比不加要大,此时dp[i] = dp[i-1] + nums...原创 2019-11-09 21:05:15 · 152 阅读 · 0 评论 -
LeetCode-38.报数
描述分析这个题花了我半天时间才弄明白是什么意思。(没看到下面有两条提示)下一个数字的报数实际上就是由上一个报数生成的。例如:1 的报数是 1(1x1)2 的报数是 11(2x1)3 的报数是 21(1X2,1X1)4 的报数是1211 …代码class Solution {public: string countAndSay(int n) { string pre =...原创 2019-11-09 20:57:25 · 230 阅读 · 0 评论 -
LeetCode-35. 搜索插入位置
分析由于数组有序,因此本问题可以二分法求解。如果二分的循环正常终止(无return ),这意味着没有找到目标值,此时 st 的位置便是要插入的位置(注意题中提到假设数组中无重复元素)。代码class Solution {public: int searchInsert(vector<int>& nums, int target) { int st = 0, en...原创 2019-11-09 20:45:43 · 121 阅读 · 0 评论 -
LeetCode-28. 实现 strStr()
描述如题,实现的函数可以在一个串中找出目标串是否存在(不存在则返回−1-1−1),若存在返回第一次找到的下标。分析这道题应该采用KMP算法比较好,但由于很久没敲KMP,我只好用了比较朴素的方法…使用指针回退的方式,若匹配成功直接返回下标,否则指针回退到最开始比较的下一个位置,重新比较。代码class Solution {public: int strStr(string hayst...原创 2019-11-09 20:40:54 · 131 阅读 · 0 评论 -
LeetCode-27. 移除元素
描述分析一和 26 题非常像,使用双指针法可以在O(N)O(N)O(N)的复杂度完成。 使用变量 cnt 作为新数组(虚拟的,其实就是在原始数组的基础上)当前下标的记录,一旦有等于目标值的元素,就跳过这个元素,cnt 不计数;若当前元素与目标值不相等,就将当前元素放到 cnt 的位置,同时 cnt 向后挪一位,预留出下一个要填放的位置。代码class Solution {publi...原创 2019-11-09 20:33:17 · 177 阅读 · 0 评论 -
LeetCode-26. 删除排序数组中的重复项
描述分析写了半天代码,考虑还要删除nums的尾部元素(由于向前挪动,实际尾部已经挪到了前面)官方给的双指针法没有考虑删除元素由于数据是代码...原创 2019-11-08 00:27:26 · 115 阅读 · 0 评论 -
LeetCode-21. 合并两个有序链表
分析单链表合并的最基本操作,注意最后新链表需要连接上还有剩余元素的链表。代码class Solution {public: ListNode * mergeTwoLists(ListNode* l1, ListNode* l2) { ListNode *p = l1, *q = l2, *new_head = new ListNode(-1); ListNode *t = new...原创 2019-11-08 00:16:26 · 145 阅读 · 0 评论 -
LeetCode-20. 有效的括号
分析经典的括号匹配问题,使用栈实现。括号不匹配可能面临三种情况:右括号多于左括号 即 ()),这意味着循环将在str.length次前提前终止(匹配到第二个 ) 时栈已经空了)左括号多于右括号 即 ((),这意味着循环结束后栈中仍有元素。左右括号数相等但括号不匹配,如((]]代码class Solution {public: bool mathSuccessful(char ...原创 2019-11-08 00:13:04 · 124 阅读 · 0 评论 -
LeetCode-14. 最长公共前缀
描述分析千万记得vector的判空!没有判空处理,测试数据给了个空的vector,直接报了错。最初的思路是对一个向量里的所有字符串按列比较,在这之前先遍历这个向量,取得最短串长度,因为比较到这个长度之后就没必要再比了,不然越界访问会报错。这样会多了一个O(N)O(N)O(N)的复杂度。后来发现,代码class Solution {public: string longestCo...原创 2019-11-06 23:17:47 · 138 阅读 · 0 评论 -
LeetCode-13. 罗马数字转整数
题解特殊情况:我最初的做法是 使用map保存单个字符和值的映射,对于题目中描述的特殊情况进行判断,若为特殊情况则特殊处理。一个更好的方法是将map做成string到int值的映射,这样对于IV,XL,CD等便可以直接给出映射值。我的代码class Solution {public: int romanToInt(string s) { map<char, int> ...原创 2019-11-06 22:59:14 · 161 阅读 · 0 评论 -
LeetCode-9.回文数
描述解答首先想到的方法是先判断是否负数/个位数,将整形转化成字符串后反转,再与原串比较,但题目给出的意见是不使用转化字符串的方法既然不反转为字符串,那对整型的处理便是首尾相比较,再掐头去尾,迭代此过程直到遇到终止条件。官方给出的最好办法是将字符串“对折”,计算出后一半的值与前一半进行对比。这期间使用比较前后两段大小的方式作为循环是否终止的条件;在返回值的判断处使用除以10的方法规避奇数...原创 2019-11-06 22:50:13 · 160 阅读 · 0 评论 -
LeetCode-3.无重复字符的最长子串
描述分析1.暴力求解法:O(3)O(3)O(3)class Solution {public: int getMaxLen(string s, int st) { int len = 0, length = s.length(); for(int i = st;i < length;i++) { ...原创 2019-05-17 21:49:02 · 185 阅读 · 0 评论 -
LeetCode-2.两数相加
题目解答 模拟加法运算,类比于大数加法,用一个值去保存进位。 需要注意的是,链表能否指向下一个结点需要先判空,最终跳出循环后,如果进位不为0,仍需将这个进位作为一个结点插入到最终结果的链表中。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n...原创 2019-05-15 17:18:32 · 148 阅读 · 0 评论 -
LeetCode-1.两数之和
描述:分析:(1)暴力法:对每个元素,依次查找表中是否有另一元素,与这个元素之和为targettargettarget,有则直接返回。由于在比较一个元素与表中其他元素时,它之前的元素已经进行过比较,因此第二层循环的下标可以直接从第一层循环加一开始。如图,在进行 222 这个值的比较时,因为此前的 111 已经和 222 比较过,因此 222 无需再和之前的元素比较。for(int ...原创 2019-05-14 13:58:54 · 159 阅读 · 0 评论