算法题
前方是否可导?
随风而行,随心而行。
展开
-
并查集
#include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cmath>#define N 50010using namespace std;int pre[N];int findroot(int x){ ...原创 2021-03-20 09:37:31 · 80 阅读 · 0 评论 -
摩尔投票法
问题从一个数组中找出出现次数超过一半的数。(这数一定存在)策略: 不同的两数相消,最后剩下的一定是这个数。(最坏情况,其他各数联合与其相消,但是由于数量不够,剩下的还是这个数)。leetcode相关题目算法1,初始化: vote=0; ans=anyone2,从i遍历数组,遇到vote=0则ans=nums[i],vote++,否则如果ans==nums[i] vote++,不等则 vote–3,返回ans即为答案。class Solution { public int majori原创 2021-03-19 21:04:44 · 69 阅读 · 0 评论 -
leetcode 5703. 最大平均通过率(贪心+优先队列)
题目链接:最大平均通过率(贪心+优先队列)题解:思路 贪心: 每次添加都要让最大平均通过率的增加量最大.数据结构: 大根堆算法: 建一个以 x+1/y+1 -x/y大小作为优先级的大根堆. 然后往堆中添加 int[]类型数据. 每次从堆中取出元素.然后将这个元素的 x,y 都加一 放回 同时 额外学生数-- 直到额外学生分配完成.时间复杂度: nlogn代码:class Solution { public double maxAverageRatio(int[][] classes,原创 2021-03-14 14:41:10 · 213 阅读 · 0 评论 -
剑指 Offer 31. 栈的压入、弹出序列
题目链接: 栈的压入、弹出序列题解:1,双指针,i,j分别指向这两个序列2,模拟弹出序列的弹出.3,j指向的元素只有是栈顶元素才能弹出,否则需继续压入元素i++.4,当满足第三点时,弹出元素 j++ 模拟下一个元素的弹出.5,模拟完成后未出现异常返回trueclass Solution { Stack<Integer> stack=new Stack<>(); public boolean validateStackSequences(int[] pus原创 2021-03-13 12:07:18 · 77 阅读 · 0 评论 -
剑指 Offer 29. 顺时针打印矩阵
题目链接:顺时针打印矩阵这个题目不难,麻烦在如何处理边界情况.题解:1,可以将矩阵一圈一圈地打印出来.2,需添加边界参数 left right top bottom限定矩阵.3,遍历每一圈时分两种情况 递增遍历和递减遍历.4,递增遍历需要满足left<=right&&top<=bottom5,递减遍历只能是 left<right&&top<bottom6,一圈遍历完后left++ right-- top++ bottom– pu原创 2021-03-13 11:14:51 · 70 阅读 · 0 评论 -
剑指 Offer 26 树的子结构
题目链接: 树的子结构题解:1,如果子结构在左子树 返回true2,如果子结构在右子树 返回true3,如果左右子树都不存在子结构,判断包含当前节点是否存在子结构.4,包含当前节点存在子结构的条件为对B进行遍历,B中的不为空元素都在对应的A中.代码注意点:dfs 递归出口判断: b为空 则一定为true(原来的树不为空)a 为空 一定为 false 因为之前已经判断 b是否为空.class Solution { public boolean isSubStructure(TreeN原创 2021-03-12 16:35:29 · 79 阅读 · 0 评论 -
leetcode 815. 公交路线
题目链接: leetcode 815. 公交路线题解:1,每条公交路线可以抽象看成一辆公交车.2,任意两辆公交车如果他们有公共车站,那么他们是可达的.3,通过给的start车站可以确认有几辆公交车可以作为起点.4,终止条件是到达包含终点的公交车.5,用...原创 2021-03-12 13:21:34 · 128 阅读 · 0 评论 -
剑指 Offer 13. 机器人的运动范围(BFS添加元素时标记)
这道题用BFS模板就行,但是要注意在添加元素时进行标记,而不是取出时标记,因为取出时标记可能会重复添加元素进队列.class Solution { int next[][]={{1,0},{0,1},{-1,0},{0,-1}}; boolean visited[][]; class node{ int x; int y; node(int x,int y){ this.x=x; thi原创 2021-03-11 20:18:31 · 79 阅读 · 0 评论 -
leetcode 字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。示例1:输入:s1 = “waterbottle”, s2 = “erbottlewat”输出:True示例2:输入:s1 = “aa”, s2 = “aba”输出:False提示:字符串长度在[0, 100000]范围内。说明:你能只调用一次检查子串的方法吗?来源:力扣(LeetCode)链接:https://leetcode-cn.co原创 2021-03-04 18:59:49 · 97 阅读 · 0 评论 -
猴子吃包子(蓝桥杯之前每日一题)
#include <iostream>#include <stdio.h>#include <stdlib.h>using namespace std;typedef long long ll;ll gcd(ll x,ll y){ if (y==0)return x; else return gcd(y,x%y);}int main(){ ll x; ll y; ll z; ll x1; ll y1原创 2020-10-13 00:00:01 · 124 阅读 · 0 评论 -
刷题记录(蓝桥杯之前每日一题)
回文数#include <iostream>using namespace std;typedef long long ll;int main(){ for (ll i=1000; i<=9999; i++){ ll a=i/1000; ll b=(i/100)%10; ll c=(i/10)%10; ll d=i%10; if (a==d&&b==c)cout<<原创 2020-10-11 23:26:16 · 185 阅读 · 0 评论 -
特殊回文数(蓝桥杯之前每日一题)
#include <iostream>#include <string.h>#include <algorithm>using namespace std;typedef long long ll;ll ans[1000000];ll getnum5(ll a[]){ return a[0]*10000+a[1]*1000+a[2]*100+a[3]*10+a[4]*1;}ll getnum6(ll a[]){ return a[0]*1.原创 2020-10-10 00:15:50 · 95 阅读 · 0 评论 -
十进制转十六进制(蓝桥杯之前每日一题)
#include <iostream>#include <string.h>#include <algorithm>using namespace std;typedef long long ll;char getchar(ll x){ if(x>=0&&x<=9)return x+'0'; else return 'A'+(x-10);}string getans(ll x){ string ans=""原创 2020-10-09 23:54:25 · 1247 阅读 · 0 评论 -
十六进制转十进制(蓝桥杯之前每日一题)
#include <iostream>#include <string.h>using namespace std;typedef long long ll;ll getnum(char x){ if(x>='0'&&x<='9'){ return ll(x-'0'); } else return ll(x-'A'+10);}ll g[8];void getmypow(){ g[0]=1;原创 2020-10-08 23:04:06 · 70 阅读 · 0 评论 -
CF932B Recursive Queries(蓝桥杯之前每日一题)
题意给两个函数,g(x)和f(x)f(n)是求所有非零数位的积.题目给我们 n,l,r,k其中n表示测试数据有几行,l,r是一个区间,要求在l,r区间满足g(x)=k的x的个数有多少.数据范围:题解1 求出从1到106 的g(x)的值.这里我们先写出1到9的g(x)的值.剩下的只要求一次f(x)就可以在前面找到某个值等于f(x)了(因为位数之积会小于原本的数).2 由于是要统计一个区间的某个k值的个数.直接遍历会超时,这里先打个表.统计前i个数中(1到9)有多少.然后前i+1就可以在这个原创 2020-10-07 00:01:07 · 95 阅读 · 0 评论 -
十六进制转八进制(蓝桥杯之前每日一题)
问题描述给定n个十六进制正整数,输出它们对应的八进制数。输入格式输入的第一行为一个正整数n (1<=n<=10)。 接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。输出格式输出n行,每行为输入对应的八进制正整数。【注意】 输入的十六进制数不会有前导0,比如012A。 输出的八进制数也不能有前导0。题解16进制数用字符串表示,先转成二进制字符串,然后在前面补0使其长度成为3的倍数.接着每三个一组原创 2020-10-06 19:20:41 · 292 阅读 · 0 评论 -
CF817C Really Big Numbers(蓝桥杯之前每日一题)
题目大意给s,n (s,n<=1018 )求从1到n中有多少个数满足减去其数位和后大于等于s.题解1,小于s的数肯定不满足.2,大于s+18*9的数(每个位置上都是9,一共18位)一定满足.3,剩下的暴力枚举即可.#include <iostream>using namespace std;typedef long long ll;int getnum(ll x){ int num=0; while(x!=0){ num+=x%10;原创 2020-10-06 00:35:18 · 143 阅读 · 0 评论