
算法
油油灰
这个作者很懒,什么都没留下…
展开
-
剑指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 评论 -
手写一波常见排序
好久没看排序相关的了,为了应付面试,复习一下;简单的写一下 冒泡排序,选择排序,快速排序;//冒泡排序void sort(vector<int>&v,int l,int r){ for(int i=r;i>=l;--i) { int ind=0; for(int j=0;j<=i;++j) { if(v[ind]<v[j]){ind=j;}; }原创 2020-08-01 13:32:30 · 154 阅读 · 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 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 评论 -
STL中next_permutation()和prev_permutation()函数实现
next_permutation()和permutation()是STL提供的用来计算下一个排列和上一个排列的算法;刷题中经常用到,比较有用。next_permutation()实现:template <class iterator>bool next_permutation(iterator first,iterator last){ if(first==last)r...原创 2020-04-25 09:01:37 · 240 阅读 · 0 评论 -
多源BFS
多源bfs方法可以解决leetcode 上的一类题,一般来说我们使用BFS都是单源的,如二叉树层次遍历等leetcode 上的很多题目,我们起始阶段只需要将某一个元素加入队列。多源顾名思义就是开始阶段加入多个元素入队列,我们也可以将其理解为存在一个超级源点。如下994题腐败的橘子,网格中存在若干个腐败橘子,我们需要求出所有新鲜橘子被腐烂的时间。如果按单源的bfs,从一个腐烂橘子开始遍历,那么...原创 2020-04-15 11:10:48 · 2316 阅读 · 0 评论 -
K个一组翻转链表
LEETCODE 25链表相关题目看起来思路容易找,但是细节和边界条件较多,很容易出错。就这道题来说,k将链表分为若干个组,我们要考虑的问题有:组内的反转,可以参考前面的链表反转;组之间的连接;如过最后一个组数目不足k的处理;大多数链表和二叉树相关的题目可以优先考虑递归的方法来做,虽然本题要求常数的空间复杂度,但还是可以试试。class Solution {public: ...原创 2020-04-07 11:43:15 · 148 阅读 · 0 评论 -
快速排序
快速排序size_t setPivot(vector<int>&v,int l,int r) { int pivot=v[l],index=l; while(l<r) { while(l<r&&v[r]>=pivot) --r; ...原创 2020-04-07 11:23:05 · 84 阅读 · 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 评论 -
前缀树
又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。代码实现如下:主要的成员函数有两个:search()判断某个字符串是否存在;insert()插入一个字符串;class n...原创 2020-03-28 14:00:46 · 161 阅读 · 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 评论 -
数据流的中位数
方法一:双堆法(最大堆+最小堆)当前两个堆中数据个数为偶数时:如果新插入数据小于或等于大堆的堆顶,则说明新数据应该插入大堆;此时我们先将大堆堆顶插入小堆中,然后再将新数据插入大堆。**否则**直接将新数据插入小堆。总而言之,为偶数时必须将小堆增加一个数,具体如何加取决于以上逻辑;当前两个堆中数据个数为偶数时,有类似的处理方法;以上操作确保两个堆的数据个数相差不超过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 评论 -
位运算的一些技巧
1. 两个数异或:相当于每一位相加,而不考虑进位;2. 两个数相与,并左移一位:相当于求得进位;3. 一个数n与其减一的数相与(即n&(n-1)),等价于去掉最左边的1如n=10二进制为1010,n&(n-1)=1000应用以上技巧可以解决一些算法题:下面是剑指offer上的一道题:class Solution {public: int Add(int n...原创 2019-12-11 20:24:23 · 494 阅读 · 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 评论 -
面试 扔鸡蛋问题
题目描述:两个软硬程度一样但未知的鸡蛋,它们有可能都在一楼就摔碎,也可能从一百层楼摔下来没事。有座100层的建筑,要你用这两个鸡蛋确定哪一层是鸡蛋可以安全落下的最高位置,并且试探次数最少。这是动态一个动态规划问题:假设你在第i层楼上扔下一个鸡蛋,会出现以下两种情况:蛋碎了,那么你必须用剩下的一个蛋从第一层往上试探才能完成任务,最多i-1次蛋没碎,上面还有n-i层,这时候你可以将第i层当...原创 2019-11-20 23:08:45 · 262 阅读 · 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 704题
二分法原创 2019-10-05 12:44:40 · 166 阅读 · 0 评论