
algorithm
Cubbyz
在这里的我们素不相识,却都在为了自己的梦而努力 ❤
展开
-
模拟散列表
维护一个集合,支持如下几种操作:I x,插入一个数 x;Q x,询问数 x 是否在集合中出现过;现在要进行 N 次操作,对于每个询问操作输出对应的结果。输入格式第一行包含整数 N,表示操作数量。接下来 N 行,每行包含一个操作指令,操作指令为 I x,Q x 中的一种。输出格式对于每个询问指令 Q x,输出一个询问结果,如果 x 在集合中出现过,则输出 Yes,否则输出 No。每个结果占一行。数据范围1≤N≤105−109≤x≤109输入样例:5I 1I 2I 3Q 2原创 2022-01-10 20:07:55 · 443 阅读 · 0 评论 -
最大异或对(Trie树)
题目:在给定的 N 个整数 A1,A2……AN 中选出两个进行 xor(异或)运算,得到的结果最大是多少?输入格式第一行输入一个整数 N。第二行输入 N 个整数 A1~AN。输出格式输出一个整数表示答案。数据范围1≤N≤105,0≤Ai<231输入样例:31 2 3输出样例:3#include <iostream>#include <algorithm>#define IOS ios::sync_with_stdio(false); cin.原创 2022-01-08 11:42:30 · 199 阅读 · 0 评论 -
Trie树 字符串统计
维护一个字符串集合,支持两种操作:I x向集合中插入一个字符串 x;Q x 询问一个字符串在集合中出现了多少次。共有 N个操作,输入的字符串总长度不超过 105,字符串仅包含小写英文字母。输入格式第一行包含整数 N,表示操作数。接下来 N 行,每行包含一个操作指令,指令为 I x或 Q x中的一种。输出格式对于每个询问指令 Q x,都要输出一个整数作为结果,表示x在集合中出现的次数。每个结果占一行。数据范围1≤N≤2∗104输入样例:5I abcQ abcQ abI ab原创 2022-01-06 17:34:08 · 117 阅读 · 0 评论 -
滑动窗口(cpp)
滑动窗口维护队列 满足一个单调性找窗口中的最小值: 3 -1 -3后边一个元素比当前元素小的话,当前元素就没用了,冗余元素 删掉。当遍历完整个数组 所有的冗余元素都删掉了, 剩下的就是一个单调递增的序列。具有单调性方便: 在遍历时就维护了, 取当前窗口的队头即可,就是最小值每次 O(1)的复杂度 , 整体的复杂度就是O(n)的将队列中的没有用的元素删掉一>具有 了单调性可以用0(1)时间从队头/队尾取出最值这个做法算法,稳健,可以找到当前窗口最值 或找出离他最近的比他大/小的第原创 2022-01-05 16:02:36 · 465 阅读 · 0 评论 -
区间合并问题cpp
题目假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l,r] 之间的所有数的和。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含两个整数 x 和 c。再接下来 m 行,每行包含两个整数 l 和 r。输出格式共 m 行,每行输出一个询问中所求的区间内数字和。数据范围−109≤x≤109,1≤n,m≤105,−109原创 2021-12-31 15:56:32 · 625 阅读 · 0 评论 -
二进制中1的个数 “lowbit原理“
二进制中1的个数算法(lowbit) O(nlogn)使用lowbit操作,进行,每次lowbit操作截取一个数字最后一个1后面的所有位,每次减去lowbit得到的数字,直到数字减到0,就得到了最终1的个数,lowbit原理根据计算机负数表示的特点,如一个数字原码是10001000,他的负数表示形势是补码,就是反码+1,反码是01110111,加一则是01111000,二者按位与得到了1000,就是我们想要的lowbit操作输入样例:51 2 3 4 5输出样例:1 1 2 1 2原创 2021-12-31 15:54:20 · 397 阅读 · 0 评论 -
最长连续不重复子序列cpp
最长连续不重复子序列定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式第一行包含整数 n。第二行包含 n 个整数(均在 0∼105 范围内),表示整数序列。输出格式共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。数据范围1≤n≤105输入样例:51 2 2 3 5输出样例:3核心思路:遍历数组a中的每一个元素a[i], 对于每一个i,找到j使得双指针[j, i]维护的是以a[i]结尾的最长连续不重复子序列,长度为i -原创 2021-12-30 10:20:35 · 292 阅读 · 0 评论 -
二维前缀和
前缀和对于每次查询,只需执行sum[r]-sum[l-1] ,时间复杂度为O(1)#include <iostream>using namespace std;#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)const int N = 100010;int n, m;int a[N], s[N];int main(){ IOS; cin >> n >> m;原创 2021-12-28 11:20:14 · 498 阅读 · 0 评论 -
高精度乘法(含:高精度*低精度、高精度*高精度)
题目:给定两个非负整数(不含前导 0) A 和 B,请你计算 A×B 的值。输入格式共两行,第一行包含整数 A,第二行包含整数 B。输出格式共一行,包含 A×B 的值。数据范围1≤A的长度≤1000000≤B≤10000输入样例:23输出样例:6输入样例2:(高精度*高精度)1234567890123456789012345678901234567890输出样例2:152415787532388367501905199875019052100高精度 * 低精度例如 1原创 2021-12-27 11:09:00 · 951 阅读 · 0 评论 -
高精度加法 C++、Java 实现
高精度整数加法给定两个正整数(不含前导 0),计算它们的和。输入格式共两行,每行包含一个整数。输出格式共一行,包含所求的和。数据范围1≤整数长度≤100000输入样例:1223输出样例:35c++#include <iostream>using namespace std;const int N = 100010;int A[N], B[N], C[N];int cnt ;#define IOS ios::sync_with_stdio(false); c原创 2021-12-26 18:37:04 · 443 阅读 · 0 评论 -
求数的三次方根 浮点数二分模板
求数的三次方根给定一个浮点数 n,求它的三次方根。输入格式共一行,包含一个浮点数 n。输出格式共一行,包含一个浮点数,表示问题的解。注意,结果保留 6 位小数。数据范围−10000≤n≤10000输入样例:1000.00输出样例:10.000000浮点数二分(模板):double l=a,r=b;while(r-l>c){ double mid=(l+r)/2; if(check(mid)) l=mid; else r=mid;}c++#i原创 2021-12-26 17:03:38 · 140 阅读 · 0 评论 -
归并(分治) 求逆序对的数量
/** * 归并排序merge_sort 分治算法 * 1. 确定分界点 mid = l + r >> 1 * 2. 递归排序 left right * 3. 归并 合二为一 * * T(n) = nLog(N) * * 边界分析: * 为什么不用 mid - 1 作为分隔线呢 即 merge_sort(q, l, mid - 1 ), merge_sort(q, mid, r) 因为 mid = l + r >> 1 是向下取整,mid 有原创 2021-12-24 11:39:14 · 105 阅读 · 0 评论 -
第k个数, (第k个大的数)
第k个数给定一个长度为 n 的整数数列,以及一个整数 k,请用快速选择算法求出数列从小到大排序后的第 k 个数。输入格式第一行包含两个整数 n 和 k。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整数数列。输出格式输出一个整数,表示数列的第 k 小数。数据范围1≤n≤100000,1≤k≤n输入样例:5 32 4 1 5 3输出样例:3/** * * * l,r 区间中第k个最大的数 * [l,r,k]; * sl = j - l + 1; 中原创 2021-12-23 16:11:03 · 1405 阅读 · 0 评论 -
快排 快速排序 c++ (IOS 提升cin cout 速度)
快速排序给定你一个长度为 n 的整数数列。请你使用快速排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。输入格式输入共两行,第一行包含整数 n。第二行包含 n 个整数(所有整数均在 1∼109 范围内),表示整个数列。输出格式输出共一行,包含 n 个整数,表示排好序的数列。数据范围1≤n≤100000输入样例:53 1 2 4 5输出样例:1 2 3 4 5优化前:代码如下:/** * 快速排序 —— 分治 * quick_sort() *原创 2021-12-23 15:35:41 · 1951 阅读 · 0 评论 -
题目描述:判断一个非负整数是否为两个整数的平方和。
给定一个非负整数 c ,你要判断是否存在两个整数 a 和 b,使得 a2 + b2 = c。示例 1:输入:c = 5输出:true解释:1 * 1 + 2 * 2 = 5示例 2:输入:c = 3输出:false题目链接:点我跳转leetcode 解题方案:可以使用双指针得到两个数,使其平方和为 target。本题的关键是右指针的初始化,实现剪枝,从而降低时间复杂度。设右指针为 x,左指针固定为 0,为了使 02 + x2 的值尽可能接近 target,我们可以将 x 取为 sqrt原创 2021-10-11 17:33:35 · 1342 阅读 · 0 评论 -
最长回文子串
给你一个字符串 s,找到 s 中最长的回文子串。示例 1:输入:s = "babad"输出:"bab"解释:"aba" 同样是符合题意的答案。示例 2:输入:s = "cbbd"输出:"bb"示例 3:输入:s = "a"输出:"a"提示:1 <= s.length <= 1000s 仅由数字和英文字母(大写和/或小写)组成class Solution {public: string longestPalindrome(string s) {原创 2021-10-09 15:28:29 · 87 阅读 · 0 评论 -
摘花生 动态规划 简单题
题目她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。Hello Kitty只能向东或向南走,不能向西或向北走。问Hello Kitty最多能够摘到多少颗花生。输入格式第一行是一个整数T,代表一共有多少组数据。接下来是T组数据。每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数原创 2021-09-23 19:29:10 · 198 阅读 · 0 评论