OJ刷题
文章平均质量分 92
PAT/LeetCode等
SuperWiwi
这个作者很懒,什么都没留下…
展开
-
力扣题目 | 概率生成问题
概率生成问题是一种比较常见的面试题,常见题型举例:有一枚不均匀的硬币,要求产生均匀的概率分布有一枚均匀的硬币,要求产生不均匀的概率分布,如 0.25 和 0.75利用 Rand7() 实现 Rand10()不均匀硬币,产生等概率现有一枚不均匀的硬币 coin(),能够返回 0、1 两个值,其概率分别为 0.6、0.4。要求使用这枚硬币,产生均匀的概率分布。即编写一个函数 coin_new() 使得它返回 0、1 的概率均为 0.5。// 不均匀硬币,返回 0、1 的概率分别为 0.6、0.4原创 2021-04-18 11:45:04 · 645 阅读 · 0 评论 -
【算法基础课】Trie算法
文章目录一、应用场景二、理解逻辑过程三、例题与模板1.数组模拟:ACWing835.Trie字符串统计2.链表:力扣208.实现Trie(前缀树)一、应用场景Trie (发音为 “try”) 或前缀树、字典树是一种树数据结构,用于检索字符串数据集中的键。这一高效的数据结构有多种应用:简单来说,Trie在字符串集合中查找某个字符串的时候,是十分高效的。Trie 树只需要 O(m)的时间复杂度,其中 m 为键长。比如,需要在1万个单词中查找一个单词(三个字母),那时间复杂度就是O(3)。二、理解逻辑过原创 2020-09-18 14:11:45 · 898 阅读 · 0 评论 -
【算法基础课】KMP算法
文章目录一、KMP逻辑过程的动态演示1.问题描述2.暴力解法3.KMP解法二、例题与模板1.题目2.有next数组后的匹配代码三、求next数组的代码四、完整代码一、KMP逻辑过程的动态演示来源:「天勤公开课」KMP算法易懂版所谓“逻辑过程”,而不是“程序”,就是以人能理解的动作来表示KMP。之后我们再从这个过程中找规律,把这些动作翻译为程序。1.问题描述如下图所示:我们需要在文本(蓝色)中快速找到和模式串(黄色)相同的子串。2.暴力解法对于暴力解法:我们逐个对比上下两个串的字符,假设文本当原创 2020-09-16 22:19:49 · 557 阅读 · 0 评论 -
【数据结构与算法知识体系】字符串
文章目录一、字符串的应用领域二、C++中的字符串C风格字符串C++ 中的 string 类三、字符串游戏规则四、字符串实用问题1.字符串排序2.字符串查找——单词查找树3.子字符串查找一、字符串的应用领域信息处理:根据给定关键字搜索网页。基因组学:将DNA转换为由4个碱基组成的(非常长的)字符串。通信系统:发送短信、电子邮件、下载电子书时,都需要将字符串从一个地方传送到另一个地方。编程系统:程序是由字符串组成的。编译器、解释器等其他能够将程序转换为机器指令的软件都是使用复杂的字符串处理技术的重要原创 2020-09-16 19:41:16 · 327 阅读 · 0 评论 -
【算法基础课】数组模拟栈、队列
文章目录一、数组模拟栈1.思路2.代码模板二、数组模拟队列1.思路2.代码模板一、数组模拟栈1.思路用数组模拟栈,可以帮助我们理解栈的本质。模拟栈的关键点就是“栈顶指针”!这比链表简单多了,链表需要知道头尾、每个节点的前后指针,而栈只有一个指针!随着不断地push和pop,栈顶指针会不断向后移动,前面的空间就浪费了。这对于算法题来说是可以忍受的,毕竟更看重时间效率。2.代码模板#include<iostream>#include<string>using names原创 2020-08-18 09:40:11 · 207 阅读 · 0 评论 -
【算法基础课】双链表
文章目录1.思路2.代码模板1.思路对于链表,首先考虑节点本身怎么存。那么双链表和单链表不同之处在于,有一个左指针,有一个右指针,整个链表除了头节点,还有一个尾节点。其次,我们考虑链表上的基本操作:(1)在第k个节点后添加一个节点先修改新节点的value,再修改新节点的左右指针。接着,将左边节点的右指针指向新节点,将右边节点的左指针指向新节点。如果想要在第k个节点前添加一个节点,可以看作在第k个节点左边的节点后添加一个新节点。(2)删除第k个节点第一步,让第k个点左边节点的右指针指向第k原创 2020-08-17 10:13:53 · 265 阅读 · 0 评论 -
【算法基础课】小数二分查找:数的三次方根
文章目录1.思想2.例题3.代码模板1.思想求数的三次方根,就是对该数开三次方。题目中已经给出了该数所在的范围,所以可以按照这个范围来直接求它的三次方根,只要这个数不是小于1的,那答案一定在这个范围内。为了高效查找,可以使用二分查找,用mid的三次方和x作比较,就知道答案应该在mid的左边还是右边了。2.例题给定一个浮点数n,求它的三次方根。输入格式共一行,包含一个浮点数n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留6位小数。数据范围−10000≤n≤10000输入原创 2020-08-12 09:42:46 · 771 阅读 · 0 评论 -
【算法基础课】整数二分查找:数的范围
文章目录1.思想2.例题3.代码模板1.思想本质是:边界!有一半区间满足条件,一半不满足。我们可以找到这两个区间的边界。2.例题给定一个按照升序排列的长度为n的整数数组,以及 q 个查询。对于每个查询,返回一个元素k的起始位置和终止位置(位置从0开始计数)。如果数组中不存在该元素,则返回“-1 -1”。输入格式第一行包含整数n和q,表示数组长度和询问个数。第二行包含n个整数(均在1~10000范围内),表示完整数组。接下来q行,每行包含一个整数k,表示一个询问元素。输出格式共q行,每行包含原创 2020-08-11 10:08:19 · 389 阅读 · 0 评论 -
【LeetCode】99.恢复二叉搜索树
文章目录1.思想2.题目3.代码4.语法知识补充1.思想(1)什么是二叉搜索树?二叉搜索树(Binary Search Tree,简称 BST)是一种很常用的的二叉树。它的定义是:一个二叉树中,任意节点的值要大于等于左子树所有节点的值,且要小于等于右边子树的所有节点的值。如下就是一个符合定义的 BST:(2)如何判断一颗二叉搜索树是否合法?不能单纯地判断根是否比左孩子大,比右孩子小,如果是下面这种情况,就会产生误判:根比右孩子的右孩子大。正确的做法是,假设根是左子树上的最大值,且是右子树上的原创 2020-08-08 15:18:37 · 260 阅读 · 0 评论 -
【算法基础课】单链表(静态链表)
文章目录1.思想2.例题3.代码模板4.语法知识补充1.思想静态链表,即用数组来模拟传统使用指针的单链表,优点就是速度快!如果一个单链表有成千上万个元素,光是“new”这个操作都可能会超时。使用数组模拟链表,有4要素,具体解释可以结合代码看注释:e[i]ne[i]headidx2.例题实现一个单链表,链表初始为空,支持三种操作:(1) 向链表头插入一个数;(2) 删除第k个插入的数后面的数;(3) 在第k个插入的数后插入一个数现在要对该链表进行M次操作,进行完所有操作后,原创 2020-08-08 14:08:15 · 511 阅读 · 0 评论 -
【算法基础课】数组元素的目标和
文章目录1.思想2.例题3.代码模板1.思想还是双指针。暴力解法复杂度为O(n^2),找到单调性后可以降到O(n+m)。暴力解法:对于每个a数组的元素,遍历每个b数组的元素,查看是否和为目标值。由于数组有序,所以可以找到规律。单调性解法:如果a的某个元素和b的某个元素加起来刚好大于x,b元素再往前挪就小于x了。此时,如果a的元素向后移动,和该b元素加起来也绝对大于x。所以,a元素往后挪,此时b元素肯定要往前挪。所以我们可以从后往前遍历一次b数组。仔细想想,确实应该先用a的最小值和b的最大值加。如原创 2020-08-04 09:39:18 · 659 阅读 · 0 评论 -
【LeetCode】114. 二叉树展开为链表
文章目录1.题目2.思路3.代码4.语法知识补充1.题目给定一个二叉树,原地将它展开为一个单链表。例如,给定二叉树 1 / \ 2 5 / \ \3 4 6将其展开为:1 \ 2 \ 3 \ 4 \ 5 \ 6来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/flatten-binary-tr原创 2020-08-02 15:38:36 · 176 阅读 · 0 评论 -
【LeetCode】76. 最小覆盖子串
文章目录1.题目2.思路3.代码4.语法知识点补充1.题目给你一个字符串 S、一个字符串 T,请在字符串 S 里面找出:包含 T 所有字符的最小子串。示例:输入: S = “ADOBECODEBANC”, T = “ABC”输出: “BANC”说明:如果 S 中不存这样的子串,则返回空字符串 “”。如果 S 中存在这样的子串,我们保证它是唯一的答案。来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/minimum-window-原创 2020-08-02 15:07:13 · 989 阅读 · 0 评论 -
【算法基础课】最长连续不重复子串
文章目录1.思想2.例题:最长连续不重复子序列代码模板1.思想双指针算法的特点就是可以把O(n^2)的时间复杂度降低到O(n)。做题的时候可以先用暴力解法做,然后看这两个指针之间是否存在某种性质,再进行优化。for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类:(1) 对于一个序列,用两个指针维护一段区间(2) 对于原创 2020-08-02 10:22:17 · 951 阅读 · 1 评论 -
【算法基础课】差分矩阵
文章目录1.思想2.例题3.模板1.思想如果要从 [x1,y1] 到 [x2,y2] ,向矩阵a中的每个数字都加上c,如果这个操作很频繁,那么每次都要重新遍历一次,复杂度为O(n2)O(n^2)O(n2)。有一种办法可以把这个复杂度降为O(1):如果a矩阵是b矩阵的前缀和,那么给b[x1][y1]+c,再给b[x2+1][y2]-c、b[x2][y2+1]-c,再给b[x2+1][y2+1]加上c,就可以使得a矩阵的 [x1,y1] 到 [x2,y2] 的所有元素都加c。我们如何构造这个b矩阵呢,原创 2020-07-31 09:35:14 · 970 阅读 · 0 评论 -
【算法基础课】差分
文章目录1.思想2.例题3.模板1.思想如果要从 l 到 r ,向数组a中的每个数字都加上c,如果这个操作很频繁,那么每次都要重新遍历一次,复杂度为O(n)。有一种办法可以把这个复杂度降为O(1):如果a数组是b数组的前缀和,那么给b[l]+c,再给b[r+1]-c就可以使得a数组的 l 到 r 的所有元素都加c。我们如何构造这个b数组呢,可以把a数组视为向b数组添加了n次c才得到的。每次向[i,i]这个区间添加a[i]。2.例题输入一个长度为n的整数序列。接下来输入m个操作,每个操作包含三个整原创 2020-07-27 23:14:18 · 254 阅读 · 1 评论 -
【算法基础课】子矩阵的和
文章目录思想例题代码模板思想前缀和适用于一维数列,如果是二维矩阵,也可以用相似的思想。前缀和计算的是从(1,1)开始到(i,j)的子矩阵的和。如果要求某个元素到(i,j)的和,可以用面积法来解决。result=S[x2][y2]−S[x2][y1−1]−S[x1−1][y2]+S[x1−1][y1−1]result = S[x_2][y_2]-S[x_2][y_1-1]-S[x_1-1][y_2]+S[x_1-1][y_1-1]result=S[x2][y2]−S[x2][y1−1]−S[原创 2020-07-25 10:41:56 · 704 阅读 · 0 评论 -
【算法基础课】前缀和
文章目录思想例题模板解法思想通常,求一个数组中间序列的和,可以遍历一次,这样的时间复杂度是O(N)。如果需要频繁获得这个和,那么每次都要重新计算一遍。为了提高效率,可以提前计算一个前缀和数组,每次查询任意一个区间的和时,用S[right] - S[left]就可以了。例题输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。输入格式第一行包含两个整数n和m。第二行包含n个整数,表示整数数列。接下来m行,每行包含两个整原创 2020-07-23 23:42:15 · 255 阅读 · 0 评论 -
PAT乙级刷题分类
模拟:1、8、 10、 11、12、 16、 18、 26、36、 46、 50、 53、55、56、58、 60、61、 63、 64、 66、68、 69、 71、 72、73、 76、 77、 83、86、 87、 88、 89、90、 91、数学:3、7、 13、 17、19、 22、34、37、49、 51、 57、 62、79、...原创 2020-02-12 09:50:55 · 378 阅读 · 0 评论 -
【PAT】A1026
原创 2019-10-03 22:20:58 · 265 阅读 · 0 评论 -
【PAT】B1009 说反话(多种解法分析)
这道题吧,就是要求把一行单词输入,然后倒着输出。在这个过程中有多种解决方案。首先是单词存储结构的问题:可以使用char二维数组,也可以使用string数组/vector,也可以使用string stack。 然后是输入的问题:可以是把一整行输入之后再拆分,也可以是一个一个单词输入并存储。 最后是输出的问题:可以把数组翻转之后正序输出,也可以直接逆序输出,当然也可以不断输出栈顶并弹出了方法...原创 2018-12-21 15:40:46 · 605 阅读 · 0 评论 -
泛洪算法-LeetCode200
题目给定一个由'1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量。一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的。你可以假设网格的四个边均被水包围。示例 1:输入:11110110101100000000输出: 1来源:力扣200分析FloodFill 算法通常译作“洪水灌溉法”,它是一种图论算法,对于一个图来说,可以很方...原创 2020-01-15 23:34:38 · 804 阅读 · 0 评论 -
【LeetCode】169.Majority Element(多种解法总结)
方法一:map(28 ms)class Solution {public: int majorityElement(vector<int>& nums) { int ans=0; map<int,int> counts; for(int x:nums){ counts.inser...原创 2019-08-02 12:35:05 · 244 阅读 · 0 评论 -
【LeetCode】1108.Defanging an IP Address
方法一:直接在“.”前后插入“[ ]”,记得要变换indexstring defangIPaddr (string address) { for (int i = 0; i<address.size (); i++) { if (address[i] == '.') { address.insert (address.begin () + i, '['); addre...原创 2019-07-19 23:27:35 · 305 阅读 · 0 评论 -
【LeetCode】22. Generate Parentheses
我的解法(元素顺序和答案不对)思路:简单测试了一下之后,发现我只需要构造该vector<string>中元素即可。不需要我输出“[]”和“”。 n=1时,item应该是“()”; n=2时,item有2个:“(())”和“()()”; n=3时,item有5个:"((()))"、"(()())"、"(())()"、"()(())"、"()()()" 我找到的规律是:(1...原创 2019-07-05 11:36:51 · 103 阅读 · 0 评论 -
【LeetCode】206. Reverse Linked List
我的方法思路:新建一个链表,倒着把Input中的结点插入新链表。结果:Run Code显示正确,但是提交后显示:Runtime Error./** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) ...原创 2019-07-10 15:31:11 · 104 阅读 · 0 评论 -
【LeetCode】771.Jewels and Stones
方法一:Hash Table使用vector来记录int numJewelsInStones(string J, string S) { vector<int> vec(128, 0); int result = 0; for(auto j : J) vec[j]= 1; ...原创 2019-07-14 14:28:06 · 138 阅读 · 0 评论 -
【LeetCode】9.Palindrome Number
有多种解法,执行速度不同1.最简单直接的方法:int 转 string,reverse后再比较class Solution {public: bool isPalindrome(int x) { string s=to_string(x); string s2=s; reverse(s.begin(),s.end()); ...原创 2019-07-14 12:03:43 · 132 阅读 · 0 评论