
LeetCode
油油灰
这个作者很懒,什么都没留下…
展开
-
剑指offer20 表示数字的字符串
剑指offer20之前做的时候思路比较乱,重新总结一波;按题目要求,字符串表示为数字有以下几个规则:1.首尾的空格必须去掉,不影响结果;2.+或者- 必须出现在第一位,或者e/E的后面一位;3.e和. 只能出现一次;4.e/E 后面必须有数字;5. .面不能有e/E;不满足以上条件的就是非法数字,直接返回false;class Solution {public: bool isNumber(string s) { if(s.size()==0)return false;原创 2020-08-10 13:32:53 · 163 阅读 · 0 评论 -
剑指 Offer 60. n个骰子的点数
剑指 Offer 60. n个骰子的点数class Solution {public: vector<double> twoSum(int n) { vector<vector<int>>dp(n+1,vector<int>(6*n+1,0)); vector<double>ans; for(int i=1;i<7;++i) dp[1][i]=1; for(int i=2;i原创 2020-07-03 19:47:46 · 107 阅读 · 0 评论 -
LEETCODE 378 有序矩阵中第K小的元素
378. 有序矩阵中第K小的元素1.二分法class Solution {public: int kthSmallest(vector<vector<int>>& matrix, int k) { auto n=matrix.size(); int l=matrix[0][0],r=matrix[n-1][n-1]; while(l<r) { int mi=l+(r-l原创 2020-07-02 15:21:45 · 139 阅读 · 0 评论 -
Leetcode 560和为K的子数组
题目方法一:构造一个前缀和数组,然后在两重循环暴力搜索所有的可能;时间复杂度O(n^2);最后一个测试用例无法通过。class Solution {public: int subarraySum(vector<int>& nums, int k) { vector<long long>sum{0}; long long ans=0,res=0; for(auto c:nums) {原创 2020-05-15 09:21:15 · 213 阅读 · 0 评论 -
最大子序和
leetcode 53这道题刷了一遍还是不太熟练,总结一下几种解法;方法一:动态规划dp[i]表示以数组第i个元素结尾的最大子序列,很容易写出递推公式如下:dp[i]=dp[i-1]>0?dp[i-1]+nums[i]:nums[i];实现代码如下,比较简单的动态规划,空间复杂度可以优化为O(1);class Solution {public: int maxSubAr...原创 2020-05-03 10:06:01 · 179 阅读 · 1 评论 -
K个一组翻转链表
LEETCODE 25链表相关题目看起来思路容易找,但是细节和边界条件较多,很容易出错。就这道题来说,k将链表分为若干个组,我们要考虑的问题有:组内的反转,可以参考前面的链表反转;组之间的连接;如过最后一个组数目不足k的处理;大多数链表和二叉树相关的题目可以优先考虑递归的方法来做,虽然本题要求常数的空间复杂度,但还是可以试试。class Solution {public: ...原创 2020-04-07 11:43:15 · 148 阅读 · 0 评论 -
LEETCODE 72 编辑距离
leetcode72 这是一道比较典型的动态规划题目,状态转移方程比较容易给出,题目给出的三种操作插入,删除,替换三种操作,分别对应三种转移方程。1.如果两个字符串最后字符相同,情况比较简单dp[i][j]=dp[i-1][j-1]2.如果两个字符不相同dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+11.动态规划,O(mn)空间...原创 2020-04-06 10:42:27 · 102 阅读 · 0 评论 -
LEETCODE 460 实现LFU缓存
leetcode 460方法一:双哈希表法题目要求需要在常数时间完成插入和查找算法,联系之前的LRU算法,很容易想到用哈希表。具体做法如下:第一个哈希表存储 使用频率freq 和一个这样一堆映射...原创 2020-04-06 10:25:58 · 149 阅读 · 0 评论 -
leetcode 42接雨水
leetcode 42题目思路:我们要找到每一个位置雨水的高度,这个高度等于该位置左右两边最大值中的小者减去当前位置的高度。所以解决这个问题关键就变成了给定一个位置,如何找到其左右两边的最大值;方法一:用两个循环分别找到左边最大值和右边最大值,但是时间复杂度为O(n^2),无法通过测试。int trap(vector<int>& height){ int ...原创 2020-04-04 11:36:10 · 153 阅读 · 0 评论 -
leetcode 06 Z字形变换
leetcode 06这道题有点找规律的意思,参考官方解答有两种方法;方法一:一行一行的排下去,直到字符串结束;class Solution {public: string convert(string s, int numRows) { if(numRows==1)return s; //numRows为1,可以直接返回 int ...原创 2020-04-03 10:16:00 · 249 阅读 · 0 评论 -
多数元素
给定一个数组,求出其中出现次数大于n/2的数字;暴力方法:先排序,直接返回第i+n/2个元素;由于排序的时间复杂度为O(n*logn),这种方法不是最优的;方法一:暴力法中对所有的元素进行排序,其实这是没有必要的,我们只需要保证最中间的那个元素...原创 2020-03-13 19:03:01 · 135 阅读 · 0 评论 -
字符串的最大公因子 /最小的k个数
第一题:一个性质:如果 str1 和 str2 拼接后等于 str2和 str1 拼接起来的字符串(注意拼接顺序不同),那么一定存在上述条件的字符串 X;证明过程还有一个性质:如果X是str1和str2公共因子,那么X的长度就是str1 和str2长度的公约数,证明过程如上链接;对于求公约数有如下经典算法:欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有...原创 2020-03-12 11:48:36 · 473 阅读 · 1 评论 -
三数之和 四数之和相关题目
leetcode 15 三数之和leetcode16 最接近的三数之和leetcode 18 四数之和这三道题目都是一个类型,主要就是利用有序数组与双指针的一些技巧;首先给出一个基本模板,如何在一个有序数组中找到两数之和为一目标值target; int l=0,r=nums.size()-1; while(l<r) { i...原创 2020-03-10 17:07:25 · 207 阅读 · 0 评论 -
数据流的中位数
方法一:双堆法(最大堆+最小堆)当前两个堆中数据个数为偶数时:如果新插入数据小于或等于大堆的堆顶,则说明新数据应该插入大堆;此时我们先将大堆堆顶插入小堆中,然后再将新数据插入大堆。**否则**直接将新数据插入小堆。总而言之,为偶数时必须将小堆增加一个数,具体如何加取决于以上逻辑;当前两个堆中数据个数为偶数时,有类似的处理方法;以上操作确保两个堆的数据个数相差不超过1,以便于我们...原创 2020-03-07 12:38:57 · 184 阅读 · 0 评论 -
LeetCode滑动窗口
之前刷了不少和滑动窗口相关的题目,但是一直没有好好地去总结,最近刚好看到LeetCode上一位大佬labuladong写的一篇滑动窗口的模板,觉得很有意义。下面结合我自己的理解重新的总结和归纳一下,部分内容参考labuladong的文章。首先应该明白 滑动窗口一般是用来解决这样一类问题:给定一个字符串或者数字序列,找到这个序列中符合特定要求的子序列,比如LeetCode3 (无重复字符的...原创 2020-01-15 19:59:36 · 291 阅读 · 0 评论 -
并查集
最近刷题了解到了并查集这种数据结构,特意去学习了一下,并查集的写法大概有几种,但是关键点只有如下两点:1.合并的方式(按高度或者按节点数);2.路径压缩写了几个模板1.按高度合并同时进行路径压缩class Union{ public: Union(int a):n(a) { cnt=n; for(int i=0;i<n;++...原创 2020-01-15 19:48:23 · 119 阅读 · 0 评论 -
任务调度器算法(leetcode621)
题目描述如下:思路:要想完成任务的时间最短,那么必须优先处理出现次数最多的任务(如果将次数多的任务留到最后,必然在每次任务之间留出大量的等待时间),因此我们可以以n+1个任务为一轮(保证同一种任务不出现在同一轮),每一轮按出现次数顺序从大到小执行,每完成一轮就重新排序依次,直到所有任务完成;例如:AAABBBBC n=2首先统计任务次数,然后排序得到 4 3 1初始time=0每...原创 2020-01-08 12:58:10 · 959 阅读 · 0 评论 -
合并K个排序链表(C++实现)
Leetcode第23题,一道hard题。leetcode 231.分治法实现方法其实和普通的归并排序差不多,最大的区别是这里我们每一次合并只需要处理两个链表就行了。class Solution {public: ListNode* mergeKLists(vector<ListNode*>& lists) { if(lists.size()=...原创 2019-12-03 18:44:40 · 791 阅读 · 0 评论 -
二叉树的遍历与重建
前面文章已讲到了二叉树的几种典型的遍历方式:主要分为两大类1. 深度优先(DFS):前序遍历,中序遍历,后序遍历2. 宽度优先(BFS)这几种遍历的具体实现前面的文章已经实现过了,这篇文章重点分析如何根据已有的前序遍历和中序遍历重建二叉树(或者给定中序遍历和后序遍历)首先看一下三种遍历的差别:简单来讲:前序遍历顺序(中左右)中序遍历(左中右)后序遍历(左右中)下面给出一个具体...原创 2019-10-15 21:18:14 · 175 阅读 · 0 评论 -
二叉树的几种遍历方法(BFS,DFS)
二叉树的遍历应该是一个基本操作,有很多相关的题目,这篇文章就用几种不同的方法来实现遍历整个遍历过程。先定义一下二叉树的节点:struct TreeNode { * int val; * TreeNode *lc; * TreeNode *rc; * TreeNode(int x) : val(x), left(NULL), right(NULL) {}...原创 2019-10-14 12:35:30 · 625 阅读 · 0 评论 -
实现atoi()函数,字符串转整型
*实现atoi()函数其实LeetCode 的一道中等题,具体题目如下:这道题目的基本思路并不难,麻烦的在于各种边界条件的判断,整个转换必须处理好如下几个问题:开始连续的空格后接数字正负号的处理出现其他非数字的字符溢出问题(题目规定只能存储32位数字,因此无法使用long long等) (关键问题) 实现代码如下:class Solution {public: in...原创 2019-10-12 16:03:12 · 279 阅读 · 0 评论 -
链表相关问题分析part2(寻找公共节点,是否有环)
这篇文章主要是分析一下链表是否有环问题(LeetCode141题)主要方法类似于上一篇文章https://blog.youkuaiyun.com/you558/article/details/102409450题目描述如下:思路一:遍历链表,利用一个哈希表保存遍历到的节点地址,同时判断该节点的下一个节点是否在保存的哈希表中,若存在,则说明链表有环;反之,若遍历到某一节点为nullptr,则说明链表无...原创 2019-10-08 23:07:02 · 129 阅读 · 0 评论 -
链表相关问题分析part1(寻找公共节点,是否有环)
这篇文章主要是分析一下最近做过的两道leetcode链表相关的题目,这两道题目有很大的相似,分别为LeetCode160题和LeetCode141题。首先来看一下160题(相交链表):思路一:看到这道题目首先第一想法就是遍历其中一个链表A,用一个哈希表来存储每一个节点,然后在遍历另外一个链表B,判断B中是否存在一个节点的next节点存在于刚存储的哈希表中,若存在,则找到了相交节点,反之则两...原创 2019-10-08 20:56:56 · 175 阅读 · 0 评论 -
字符串反转 leetcode 344
题目如下:这是一道easy题,大概思路有两种:双指针法两个指针指向数组的首部和尾部,交换两个指针指向的字符,然后两个指针逐渐向中间靠拢,当首指针大于尾指针时结束循环。递归定义一个递归函数,每次交换数组首部和尾部的字符,直到递归结束。下面给出具体的实现:双指针法class Solution {public: void reverseString(vector<c...原创 2019-10-07 18:41:07 · 124 阅读 · 0 评论 -
二分查找的一些想法 LeetCode 704题
二分法原创 2019-10-05 12:44:40 · 166 阅读 · 0 评论