随笔分类 - 算法刷题题解
主要是记录自己的想法和一些大佬的思路
摘要:AcWing 1227.分巧克力 题解 使用整数二分,判定应该向哪边分,最后就是答案 #include <bits/stdc++.h> using namespace std; const int N = 100010; int n, k; vector<pair<int,int>> a; int
阅读全文
摘要:双指针算法 常见问题分类 对于一个序列,用两个指针维护一段区间 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作 双指针算法主要是为了降低程序的时间复杂度,这个算法主要是在实际的问题中要灵活的应用,没有什么模板。 常见问题 AcWing 799.最长连续不重复子序列 AcWing 8
阅读全文
摘要:AcWing 680.剪绳子 原题链接 解题思路 因为要求的是能够满足m条数量的最大绳子的裁剪长度,所以找出数组中的最大值r,使其在0~r中使用浮点数二分,看分成的绳子的数量是否符合要求,如果分成的绳子的数量大于m,则表示绳子还能再分长,令l=mid,反之则令r=mid。最后符合某一精度的两个端点l
阅读全文
摘要:前缀和差分 一维前缀和 主要的作用是可以快速的求出数组中任意一段区间的和 核心代码 S[i] = a[1] + a[2] + ... a[i]//S是前缀和数组,下边从1开始,方便边界的计算 a[l] + ... + a[r] = S[r] - S[l - 1] 题目链接 二维前缀和 类似于一维前缀
阅读全文
摘要:AcWing 788.逆序对的数量 原题链接 思路 暴力的思路 暴力是最容易想到的思路,但是时间复杂度有点高,当数组中数比较多的时候一般会超时 代码如下: ll res = 0; for(int i = 0; i < n; ++ i){ for(int j = i + 1; j < n; ++ j)
阅读全文
摘要:原题链接 题解 要明确一个东西,他们两个人行动不是同步的,所以只要分别对他们两个人跑一边BFS,最后统计最小的时间即可 代码如下 #include <iostream> #include <cstring> #include <algorithm> #include <queue> #include
阅读全文
摘要:原题链接 题解 题目的意思是给你两个素数a,b,问你每次只能改变一个数字a-->b的素数路径最小是多少。先利用素数筛把素数10000以内的素数选出来,方便计算。然后直接利用BFS枚举所有的情况。 代码如下 #include <iostream> #include <cstring> #include
阅读全文
摘要:原题链接 题解 这个题目貌似是个模拟题,直接模拟就是了 代码如下 #include <iostream> #include <cstring> #include <algorithm> #include <set> using namespace std; set<string> s; int ma
阅读全文
摘要:原题链接 题解 题目中给了两个杯子,可以利用BFS直接搜索枚举6种情况就可以了,每个杯子中的水量就是他的状态。这里要记录他的操作路径,可以使用两个数组,一个记录他是由哪个点拓展来得,一个记录这个点的操作(也可以直接在结构体中加个字符串记录操作) 代码如下 #include <iostream> #i
阅读全文
摘要:原题链接 题意解释 一个人从数轴上的某一点x出发,要去数轴上的另一个点y,只有每分钟可以选择步行x + 1 、x - 1和传送x * 2这三种走法,问最少需要多少时间才能走到y点 题解 使用一个BFS直接跑就可以了,用一个数组标记一下这个点是否到达过,如果到达过,这个点就不能再走了,因为BFS第一次
阅读全文
摘要:原题链接 题解 题目是说有多少个连通块,每一次以一个开始,遍历并标记他能够到达的点(就是同一个连通块中的点) 代码如下 dfs #include <iostream> #include <algorithm> #include <cmath> #include <cstring> #include
阅读全文
摘要:原题链接 题解 一个三维的bfs,直接向6个方向走就是了,直接套模板 #include <iostream> #include <algorithm> #include <queue> using namespace std; typedef struct node{ int x, y, z; no
阅读全文
摘要:原题链接 题解 要求最小的交换次数,那么就可以使用bfs来做,可以把每一次的交换之后的图抽象成一个节点,那么每次转移状态就相当于向下一个节点走,走过的边的权重为1(不是在原来的3*3的图上做bfs),这样就可以使用dfs做了 需要解决的问题是: ①每一个状态该如何表示 ②如何记录每个状态的距离 ③什
阅读全文
摘要:原题链接 题解 因为每一条边的权重都是1,所以可以使用bfs查找最短路径,题目中要求的要记录最短路径并打印出来,利用一个二维数组记录该点是由哪一个点拓展而来(bfs找到的时候就是最短路径) 代码如下 #include <iostream> #include <algorithm> #include
阅读全文
摘要:原题链接 题解 在棋盘中的每一个可以放得位置,有两种情况放或者不放,直接枚举这两种情况即可(做搜索的时候要注意搜索顺序) 代码如下 #include <iostream> #include <algorithm> #include <cmath> #include <cstring> #includ
阅读全文
摘要:AcWing 143.最大异或对 题目描述 在给定的N个整数A1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N。 第二行输入N个整数A1~AN。 输出格式 输出一个整数表示答案。 数据范围 1≤N≤105, 0≤Ai<231 输入样例: 3 1
阅读全文
摘要:题目链接 题意 一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1) 分析 如果是数值中只有一个这样的数字,我们应该怎么做? 根据位运算我们可以知道,a ^ a = 0, 0 ^ a = a, a ^ b
阅读全文
摘要:数组中超过一半的元素 题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 解法一: 利用排序算法,因为这个数字的出现次数超过数组长度的一半,所以排序之后,中间的数必定为答案 int majorityElement(vec
阅读全文
摘要:求数组的最大子序列和 方法一 给定了一个数组让我们求他的最大子序列和,我们最容易想到的方法就是暴力枚举的方式 class Solution { public: int maxSubArray(vector<int>& nums) { int thisMax = 0, sumMax = nums[0]
阅读全文
摘要:AcWing 831.KMP字符串 题目描述 给定一个模式串S,以及一个模板串P,所有字符串中只包含大小写英文字母以及阿拉伯数字。 模板串P在模式串S中多次作为子串出现。 求出模板串P在模式串S中所有出现的位置的起始下标。 输入格式 第一行输入整数N,表示字符串P的长度。 第二行输入字符串P。 第三
阅读全文

浙公网安备 33010602011771号