
LeetCode个人记
自己的Leetcode成长记
浪矢清
吉林大学渣一只(~ ̄▽ ̄)~
展开
-
Leetcode 206. 反转链表
206. 反转链表解题思路栈 由栈引申出递归Java代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseList(ListNode head) .原创 2020-11-28 15:37:30 · 184 阅读 · 0 评论 -
Leetcode 19. 删除链表的倒数第N个节点
19. 删除链表的倒数第N个节点解题思路利用双指针,将快指针提前前进 n + 1 个节点,然后同时移动快慢指针。当快指针指向 null 时,慢指针恰好指向需要删除的节点的前一节点。注意需要设置哨兵节点,否则对于只有一个节点的链表,该算法无法处理。Java代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * .原创 2020-11-28 15:09:49 · 93 阅读 · 0 评论 -
Leetcode 160. 相交链表
160. 相交链表解题思路双指针定义两个指针分别指向两条链表的头节点,不断向后遍历。若遍历至末尾,则跳至另一条链表的头节点。如果两条链表相交,则两指针必定相遇。解释如下:假设 A 链表长为 a,B 链表长为 b,两链表公共部分长为 c相遇时,pa 指针走过的路程:a + (b - c);pb 指针走过的路程:b + (a - c)。两者相等。附上一篇直观的图解:图解相交链表Java代码/** * Definition for singly-linked li.原创 2020-11-27 22:48:30 · 256 阅读 · 0 评论 -
Leetcode 151. 翻转字符串里的单词
151. 翻转字符串里的单词C++ yes!istringstream yes!但是还是要用 Java 写(内鬼行为解题思路双指针,分别记录一个单词的开始和结尾,并添加至答案字符串。重复直至遍历完毕Java代码class Solution { public String reverseWords(String s) { s = s.trim(); String ans = ""; int i = s.length(..原创 2020-11-26 21:11:22 · 122 阅读 · 0 评论 -
Leetcode 14. 最长公共前缀
14. 最长公共前缀虽然官方给这道题划定的难度是“简单”,但这道题有很多解题方法,甚至相同的思路也有不同的实现方法,其时空复杂性也不同。解题思路如果采用正向思路,逐个匹配,会造成巨大的时空开支。因此,不妨设法用逆向思路实现。我们取答案字符串 ans = strs[0],将其分别与 strs 数组内所有字符串进行前缀比较。对于每次比较,使 ans 成为能够与当前字符串匹配前缀的最短子串,最终即可得到公共前缀。这份题解的示意图十分直观,推荐参考画解算法:14. 最长公共前缀...原创 2020-11-26 15:14:16 · 130 阅读 · 0 评论 -
Leetcode 922. 按奇偶排序数组 II
922. 按奇偶排序数组 II解题思路我以为我用了双指针,结果实际上还是遍历法C++代码class Solution {public: vector<int> sortArrayByParityII(vector<int>& A) { int n = A.size(); vector<int> ans(n); int p = 0, q = 1; //分别对应奇偶指针 .原创 2020-11-12 11:09:35 · 124 阅读 · 0 评论 -
Leetcode 973. 最接近原点的 K 个点
973. 最接近原点的 K 个点解题思路很朴(fei)实(jin)的一种解法对于每一个点,使用 pair 存储存储其在原始数组中的下标和到原点的距离对 pair 排序,将排序前 K 位的元素对应的点存入答案容器C++代码class Solution {public: static bool cmp(pair<int, int>a, pair<int, int>b) { return a.second < b.second.原创 2020-11-09 09:14:07 · 135 阅读 · 0 评论 -
Leetcode 129. 求根到叶子节点数字之和
129. 求根到叶子节点数字之和解题思路递归,逐层向下遍历考虑到对于此二叉树的任意节点,数字为0~9,我们有这样的递归方法:每一层将上一层传入的数字 * 10,加上当前结点数字值后传入下一层。递归出口为当前节点为叶结点,返回计数值。Java代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * Tr.原创 2020-10-29 10:09:27 · 170 阅读 · 1 评论 -
Leetcode 1207. 独一无二的出现次数
1207. 独一无二的出现次数解题思路对数组排序,用双指针记录每个元素出现的次数,存入容器对容器排序,比较两两元素是否相等C++代码class Solution {public: bool uniqueOccurrences(vector<int>& arr) { if (arr.size() < 2) return true; sort(begin(arr), end(arr)); vector.原创 2020-10-28 13:30:05 · 116 阅读 · 0 评论 -
Leetcode 26. 删除排序数组中的重复项
26. 删除排序数组中的重复项解题思路考虑到数组是有序的,故重复的元素一定是相邻的使用双指针,慢指针指向当前遍历得到的不重复元素应该处于的位置,快指针遍历寻找下一个不重复元素图源:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shuang-zhi-zhen-shan-chu-zhong-fu-xiang-dai-you-hu/Java代码class Solut.原创 2020-10-27 10:48:19 · 127 阅读 · 0 评论 -
Leetcode 144. 二叉树的前序遍历
144. 二叉树的前序遍历解题思路递归; 栈。C++代码/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {} * TreeNode(int x) : val(.原创 2020-10-27 10:29:12 · 158 阅读 · 0 评论 -
Leetcode 1365. 有多少小于当前数字的数字
1365. 有多少小于当前数字的数字一开始想得可复杂了,复制一下整个数组,给复制的数组排序,然后再把结果存到一个哈希表里,再把哈希表的数据映射到答案数组...看了题解学了一下标准的计数法解题思路考虑到对于所有的数字,都小于100,故定义一个cnt数组存储这些数组出现的次数,其大小为101; 从cnt[1]开始,对cnt数组进行累加操作,得到对于每个数字 i (对应nums内的元素),其前面数字出现的次数; 将结果写入答案数组ans[ ],由于此时cnt[ ]数组内每个元素存储的是从0到 i原创 2020-10-26 14:42:55 · 164 阅读 · 0 评论 -
LC 剑指 Offer 09. 用两个栈实现队列
题目链接:剑指 Offer 09. 用两个栈实现队列字节面试这题没做出来,丢人解题思路想象有两个装乒乓球的盒子,要取出最下面那个就只能把所有的倒到另一个空盒子里本题同解C++代码class CQueue {private: stack<int> sa; stack<int> sb;public: CQueue() { } void appendTail(int value) { s.原创 2020-10-24 10:31:01 · 148 阅读 · 0 评论 -
LeetCode 20. 有效的括号
class Solution {public: //判断左右括号是否配对 bool match(char a, char b) { if (a == '(' && b == ')' || a == '[' && b == ']' || a == '{' && b == '}') return true; return false; .原创 2020-10-17 21:14:25 · 107 阅读 · 0 评论 -
LeetCode 52. N皇后 II
这一周要准备字节的面试,所以只贴代码,面试完之后补充完整class Solution {public: void setZero(vector<vector<int>>& board, int layer, int col, int n) { for (int i = 0; i < n; i++) { board[layer][i] = 0; board[i][col] = 0;原创 2020-10-17 21:13:14 · 153 阅读 · 0 评论 -
LeetCode 977. 有序数组的平方
题目链接:977. 有序数组的平方2020.10.16第一次解答:解题思路容器遍历并平方,排序即可C++代码class Solution {public: vector<int> sortedSquares(vector<int>& A) { for (auto& i : A) i *= i; sort(begin(A), end(A)); return A; }};..原创 2020-10-16 09:57:58 · 91 阅读 · 0 评论 -
LeetCode 118. 杨辉三角
题目链接:118. 杨辉三角2020.10.15第一次解答:解题思路其实三角形的排布会影响思考,我们不妨依次按阶梯的样式列出原杨辉三角11 11 2 11 3 3 11 4 6 4 1......不难发现一个规律,下一层第i个元素(末尾元素除外),其实是由上一次第i个元素和第i-1个元素相加得到的根据这个规律,可以写出如下代码:C++代码class Solution {public: vector<vector&...原创 2020-10-15 22:57:06 · 83 阅读 · 0 评论 -
LeetCode 326. 3的幂
题目链接:326. 3的幂2020.10.15第一次解答:我是憨批...根据上一道题的逆向思维,想到逆向生成3的幂验证了,结果,我给挨个存容器里了...时空巨大浪费...羞愧解题思路根据逆向思维,对基数1不断乘3。如果等于n,则返回true;若已经大于n还未相等,说明n不是3的幂C++代码class Solution {public: bool isPowerOfThree(int n) { int a = 1; while (n.原创 2020-10-15 19:22:07 · 70 阅读 · 0 评论 -
LeetCode 204. 计数质数
题目链接:204. 计数质数2020.10.15第一次解答:解题思路暴力判断,只是这个时间就很难看...一个数,若是从2到其平方根都无法整除它,则它是质数C++代码class Solution {public: bool isPrime(int n) { int tmp = sqrt(n); for (int i = 2; i <= tmp; i++) { if (n % i == 0) retu.原创 2020-10-15 16:22:32 · 112 阅读 · 0 评论 -
LeetCode 412. Fizz Buzz
题目链接:412. Fizz Buzz2020.10.15 第一次解答解题思路模拟法,遍历就完事儿了。下次试试用散列表C++代码class Solution {public: vector<string> fizzBuzz(int n) { vector<string> ans; for (int i = 1; i <= n; i++) { if (!(i % 15)) ans.e.原创 2020-10-15 15:39:15 · 86 阅读 · 0 评论 -
LeetCode 155. 最小栈
题目链接:155. 最小栈2020.10.15第一次解答:解题思路个人以为实现一个最小栈就不能用STL的栈,于是定义了一个链表结构体写的栈...一看题解,嗯?还能这样?但是用自定义链表的速度就很快哈哈哈哈哈C++代码class MinStack {private: int min; struct node { int val; node* pre; }; node* cur;public: /** i.原创 2020-10-15 15:29:21 · 79 阅读 · 0 评论 -
LeetCode 116. 填充每个节点的下一个右侧节点指针
题目链接:116. 填充每个节点的下一个右侧节点指针2020.10.15第一次解答:解题思路依然是中序遍历,采用一个辅助队列存储每一层的结点,依次连接即可C++代码/*// Definition for a Node.class Node {public: int val; Node* left; Node* right; Node* next; Node() : val(0), left(NULL), right(NULL), ..原创 2020-10-15 13:36:03 · 94 阅读 · 0 评论 -
LeetCode 384. 打乱数组
题目链接:384. 打乱数组2020.10.14第一次解答:解题思路暴力破解法:(洗牌不会)在Solution内增加成员vector<int> nums,用于保存原始数组对于reset()函数,直接返回保存的原始数组对于shuffle()函数,复制一个原始数组,使用rand()随机将元素复制到结果数组中C++代码class Solution {private: vector<int> nums;public: Solutio.原创 2020-10-14 15:53:57 · 155 阅读 · 0 评论 -
LeetCode 198. 打家劫舍
题目链接:198. 打家劫舍2020.10.14第一次解答:羞愧,只知道dp[i] = max{ dp[i - 2] + nums[i], dp[i - 1] },原理是啥不知道看完人家题解代码再看看自己的,地铁老人看手机.jpg解题思路动态规划,公式如上贴一个自己很喜欢的题解:图解动态规划的解题四步骤(C++/Java/Python)C++代码class Solution {public: int rob(vector<int>& nu.原创 2020-10-14 15:26:39 · 121 阅读 · 0 评论 -
LeetCode 1002. 查找常用字符
题目链接:1002. 查找常用字符2020.10.14第一次解答:解题思路有点要用哈希表的意思,但是想了想用数组就可以满足题意要求了个人最开始的想法是,为每一个字符串都开辟一个记录数组,记录其每个字母出现的次数,最后各取最小值但是又觉得这样做的话空间好浪费哦,还要再找出最小值,又要浪费时间于是想到优化方案,只需要两个数组。一个 cur[26] 记录当前字符串每个字母出现次数,一个 backup[26] 记录历史每个字母出现的最小次数。最后根据 backup 将字母写回 ans 容器即原创 2020-10-14 14:32:13 · 180 阅读 · 0 评论 -
LeetCode 53. 最大子序和
题目链接:53. 最大子序和2020.10.13第一次解答:解题思路一不留神自己用了贪心,看了人题解才意识到,后知后觉遍历容器,累加计算sum。如果sum < 0,则重新从下一个元素累加计算。过程中若有sum > max,更新max = sumC++代码class Solution {public: int maxSubArray(vector<int>& nums) { int max = INT_MIN, sum .原创 2020-10-13 15:15:07 · 96 阅读 · 0 评论 -
LeetCode 121. 买卖股票的最佳时机
题目链接:LC 121. 买卖股票的最佳时机2020.10.13第一次解答:解题思路DP不太会...参考评论区思路和代码后初步形成自己的认知max = max{第i天以前的最大收益,第i天的价格 - 第i天以前的最小价格}这样我们就有了dp的基本公式,依次写出代码C++代码class Solution {public: int maxProfit(vector<int>& prices) { if(prices.size...原创 2020-10-13 14:40:05 · 112 阅读 · 0 评论 -
LeetCode 70. 爬楼梯
题目链接:LC 70. 爬楼梯2020.10.13第一次解答:解题思路典型的动态规划,套用斐波那契数列即可注意,直接套用会导致栈空间爆炸(时间复杂度O(n²))。个人解法是开辟辅助数组记录重复数据,使数据得到复用,从而降低时间复杂度为O(n)(只需计算n个值)C++代码class Solution { int m[1000];public: int climbStairs(int n) { if(n <= 2) return n; .原创 2020-10-13 10:26:35 · 115 阅读 · 0 评论 -
LeetCode 24. 两两交换链表中的节点
题目链接:LC 24. 两两交换链表中的节点2020.10.13第一次解答:菜鸡用迭代怎么都搞不出来,有幸在评论区发现https://lyl0724.github.io/2020/01/25/1/这篇博客后豁然开朗解题思路使用递归实现。不需要纠结于每一层递归要做什么,因为递归本身就是对每一层采取相同的操作,所以我们只需要明确我们单词要完成的操作即可。递归两大件:递归出口,递归调用。递归出口:到最后了没得继续递归了。递归调用:由于本题是两两交换结点,故两个结点为一组。在这种情况原创 2020-10-13 09:39:36 · 184 阅读 · 0 评论 -
LeetCode 278. 第一个错误的版本
题目链接:LC 278. 第一个错误的版本2020.10.12第一次解答:解题思路:典型的二分查找// The API isBadVersion is defined for you.// bool isBadVersion(int version);class Solution {public: int firstBadVersion(int n) { int l = 1, r = n; while (l <= r) {原创 2020-10-12 15:22:57 · 94 阅读 · 0 评论 -
LeetCode 88. 合并两个有序数组
题目链接:LC 88. 合并两个有序数组2020.10.12第一次解答:解题思路直观解法,STL解决问题。C++ vector支持同类型数据的区间插入,比如://函数原型iterator insert(iterator it,const_iterator first,const_iterator last)//向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据vector<int> vec1 = {...};vector<int&原创 2020-10-12 14:14:13 · 127 阅读 · 0 评论 -
LeetCode 530. 二叉搜索树的最小绝对差
题目链接:530. 二叉搜索树的最小绝对差本题与 783783. 二叉搜索树节点最小距离相同2020.10.12第一次解答:解题思路中序遍历将所有结点的值的绝对值存入容器。对容器排序,遍历容器获取最小差值/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ..原创 2020-10-12 10:04:53 · 108 阅读 · 0 评论 -
LeetCode 108. 将有序数组转换为二叉搜索树
题目链接:LC 108. 将有序数组转换为二叉搜索树2020.10.11第一次解答:解题思路dbq对二叉树相关知识掌握真的都还给老师了一开始看这题,哇,好高端,还要平衡。想了半天没有思路,寻思这应该是道medium题吧,结果一看是easy我 好 菜 啊于是重新开始想解题思路。刚刚做了有关二叉搜索树的题目,二叉搜索树的性质是其中序遍历是递增序列。诶,那不巧了吗,题目给定的数组就是递增的。根据这个性质,可以直接递归构造二叉树:/** * Definition for a原创 2020-10-11 21:57:01 · 450 阅读 · 0 评论 -
LeetCode 102. 二叉树的层序遍历
题目链接:LC 102. 二叉树的层序遍历吃饭去了一会儿回来写/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public.原创 2020-10-11 16:28:31 · 107 阅读 · 0 评论 -
LeetCode 101. 对称二叉树
题目链接:LC 101. 对称二叉树2020.10.11第一次解答:一开始想着直接检验中序序列,提交后发现这个算法存在bug,它无法正确判断某些并不是对称二叉树的测试用例。参考题解后大概get了思路。只需要用递归依次判断当前结点的左子树和右子树是否对称即可。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode原创 2020-10-11 15:41:25 · 110 阅读 · 0 评论 -
LeetCode 98. 验证二叉搜索树
原题链接:LC 98. 验证二叉搜索树2020.10.11第一次解答:二叉搜索树的中序遍历竟然是一个递增数列孤陋寡闻,我本人解题思路不会什么优化技巧,干脆中序遍历把所有的值都存在容器里,然后逐个比较/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNod..原创 2020-10-11 14:06:17 · 146 阅读 · 0 评论 -
LeetCode 104. 二叉树的最大深度
题目链接:LC 104. 二叉树的最大深度2020.10.10第一次解答:1551,发现自己二叉树相关的知识一点不会,都还给老师了数据结构白上了刚看到题还傻乎乎地在想怎么保证depth的唯一性,一个结点有左右两个儿子结点,递归的时候depth++会运行两遍啊。到达根节点的时候再退回来,父节点的层数又如何保存?懵了。一看题解,果然还是自己太水了。解题思路使用递归,逐层计算子树的最大深度。采用这种方法的原理是逆向计算,从叶子结点向上计算,便可获取到其父节点的子树的最大..原创 2020-10-10 19:52:19 · 89 阅读 · 0 评论 -
Leetcode 234. 回文链表
题目链接:LC 234. 回文链表2020.10.10第一次解答:解题思路申请栈空间存储链表中所有的val值,再遍历链表逐个比较。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {public原创 2020-10-10 15:10:17 · 117 阅读 · 0 评论 -
LeetCode 21. 合并两个有序链表
题目链接:LC 21. 合并两个有序链表2020.10.10第一次解答:解题思路顺序遍历,菜鸡解法。哪个小就把哪个接到当前指针的next指针上,直到某个链表遍历完毕,并将另一个链表整个接到当前指针的next指针。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode() : val(0), next(nul.原创 2020-10-10 14:48:59 · 88 阅读 · 0 评论 -
LeetCode 142. 环形链表 II
题目链接:LC 142. 环形链表Ⅱ2020.10.10第一次解答:解题思路判断链表是否为环形链表。若是,用快慢指针返回环的长度(原理见一文搞定常见的链表问题),用于确定首个入环节点位置。若不是,返回0,代表链表非环形链表。 若非环形链表,返回nullptr。若为环形链表,用双指针确定首个入环节点。/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *n原创 2020-10-10 10:52:21 · 199 阅读 · 0 评论