数据结构与算法
清鸿y
转战某乎可看: 淸鸿y
展开
-
快速幂(欧拉降幂C++)
给定 n 组 ai,bi,pi,对于每组数据,求出 abiimodpi 的值。输入格式第一行包含整数 n。接下来 n 行,每行包含三个整数 ai,bi,pi。输出格式对于每组数据,输出一个结果,表示 abiimodpi 的值。每个结果占一行。数据范围1≤n≤100000,1≤ai,bi,pi≤2×109输入样例:23 2 54 3 9输出样例:41C++#include<iostream>#include<algorithm>using na原创 2022-05-12 16:36:18 · 521 阅读 · 0 评论 -
耍杂技的牛(贪心 C++)
农民约翰的 N 头奶牛(编号为 1…N)计划逃跑并加入马戏团,为此它们决定练习表演杂技。奶牛们不是非常有创意,只提出了一个杂技表演:叠罗汉,表演时,奶牛们站在彼此的身上,形成一个高高的垂直堆叠。奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。这 N 头奶牛中的每一头都有着自己的重量 Wi 以及自己的强壮程度 Si。一头牛支撑不住的可能性取决于它头上所有牛的总重量(不包括它自己)减去它的身体强壮程度的值,现在称该数值为风险值,风险值越大,这只牛撑不住的可能性越高。您的任务是确定奶牛的排序,使原创 2022-05-12 16:03:01 · 725 阅读 · 0 评论 -
堆排序(C++)
输入一个长度为 n 的整数数列,从小到大输出前 m 小的数。输入格式第一行包含整数 n 和 m。第二行包含 n 个整数,表示整数数列。输出格式共一行,包含 m 个整数,表示整数数列中前 m 小的数。数据范围1≤m≤n≤105,1≤数列中元素≤109输入样例:5 34 5 1 3 2输出样例:1 2 3C++#include<iostream>#include<algorithm>using namespace std;const int N =原创 2022-05-11 11:52:25 · 512 阅读 · 0 评论 -
区间选点(贪心+C++)
给定 N 个闭区间 [ai,bi],请你在数轴上选择尽量少的点,使得每个区间内至少包含一个选出的点。输出选择的点的最小数量。位于区间端点上的点也算作区间内。输入格式第一行包含整数 N,表示区间数。接下来 N 行,每行包含两个整数 ai,bi,表示一个区间的两个端点。输出格式输出一个整数,表示所需的点的最小数量。数据范围1≤N≤105,−109≤ai≤bi≤109输入样例:3-1 12 43 5输出样例:2代码:#include<iostream>#incl原创 2022-05-01 14:34:56 · 398 阅读 · 0 评论 -
二分图的最大匹配(匈牙利+C++)
给定一个二分图,其中左半部包含 n1 个点(编号 1∼n1),右半部包含 n2 个点(编号 1∼n2),二分图共包含 m 条边。数据保证任意一条边的两个端点都不可能在同一部分中。请你求出二分图的最大匹配数。二分图的匹配:给定一个二分图 G,在 G 的一个子图 M 中,M 的边集 {E} 中的任意两条边都不依附于同一个顶点,则称 M 是一个匹配。二分图的最大匹配:所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。输入格式第一行包含三个整数 n1、 n2 和 m。接下来原创 2022-04-25 10:40:47 · 929 阅读 · 0 评论 -
八数码(BFS+C++)
在一个 3×3 的网格中,1∼8 这 8 个数字和一个 x 恰好不重不漏地分布在这 3×3 的网格中。例如:1 2 3x 4 67 5 8在游戏过程中,可以把 x 与其上、下、左、右四个方向之一的数字交换(如果存在)。我们的目的是通过交换,使得网格变为如下排列(称为正确排列):1 2 34 5 67 8 x例如,示例中图形就可以通过让 x 先后与右、下、右三个方向的数字交换成功得到正确排列。交换过程如下:1 2 3 1 2 3 1 2 3 1 2 3x 4 6 4原创 2022-04-24 11:25:34 · 528 阅读 · 0 评论 -
走迷宫(BFS+C++)
给定一个 n×m 的二维整数数组,用来表示一个迷宫,数组中只包含 0 或 1,其中 0 表示可以走的路,1 表示不可通过的墙壁。最初,有一个人位于左上角 (1,1) 处,已知该人每次可以向上、下、左、右任意一个方向移动一个位置。请问,该人从左上角移动至右下角 (n,m) 处,至少需要移动多少次。数据保证 (1,1) 处和 (n,m) 处的数字为 0,且一定至少存在一条通路。输入格式第一行包含两个整数 n 和 m。接下来 n 行,每行包含 m 个整数(0 或 1),表示完整的二维数组迷宫。输出格原创 2022-04-24 10:21:19 · 654 阅读 · 0 评论 -
N皇后问题(C++)
n−皇后问题是指将 n 个皇后放在 n×n 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。现在给定整数 n,请你输出所有的满足条件的棋子摆法。输入格式共一行,包含整数 n。输出格式每个解决方案占 n 行,每行输出一个长度为 n 的字符串,用来表示完整的棋盘状态。其中 . 表示某一个位置的方格状态为空,Q 表示某一个位置的方格上摆着皇后。每个方案输出完成后,输出一个空行。注意:行末不能有多余空格。输出方案的顺序任意,只要不重复且没有遗漏即可。原创 2022-04-20 21:18:55 · 5128 阅读 · 0 评论 -
01背包问题C++
有 N 件物品和一个容量是 V 的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi,wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤10000<vi,wi≤1000输入样例4 51 22原创 2022-04-02 13:54:30 · 173 阅读 · 0 评论 -
多重背包问题C++
有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V≤1000<vi,wi,si≤100输入样例4 51原创 2022-04-02 08:41:57 · 895 阅读 · 0 评论 -
浅谈前缀和(C++)
1.构造前缀和前缀和的思路是这样的,对于一个给定的数组 nums,我们额外开辟一个前缀和数组进行预处理:vectorsums;int n = nums.size();// 前缀和数组sums.resize(n+1);for (int i = 0; i < n; i++)sums[i + 1] = sums[i] + nums[i];这个前缀和数组 preSum 的含义也很好理解,sums[i] 就是 nums[0…i-1] 的和。那么如果我们想求 nums[i…j] 的和,只需要一步操原创 2022-03-23 09:41:10 · 1581 阅读 · 0 评论 -
力扣69----x的平方根C++
给你一个非负整数 x ,计算并返回 x 的 算术平方根 。由于返回类型是整数,结果只保留 整数部分 ,小数部分将被 舍去 。注意:不允许使用任何内置指数函数和算符,例如 pow(x, 0.5) 或者 x ** 0.5 。示例1;输入:x = 4输出:2示例2:输入:x = 8输出:2解释:8 的算术平方根是 2.82842…, 由于返回类型是整数,小数部分将被舍去。#include <iostream>#include <vector>using namesp原创 2022-03-22 21:28:36 · 917 阅读 · 0 评论 -
力扣面试题08.10颜色填充C++
题目:编写函数,实现许多图片编辑软件都支持的「颜色填充」功能。待填充的图像用二维数组 image 表示,元素为初始颜色值。初始坐标点的行坐标为 sr 列坐标为 sc。需要填充的新颜色为 newColor 。「周围区域」是指颜色相同且在上、下、左、右四个方向上存在相连情况的若干元素。请用新颜色填充初始坐标点的周围区域,并返回填充后的图像。示例:输入:image = [[1,1,1],[1,1,0],[1,0,1]]sr = 1, sc = 1, newColor = 2输出:[[2,2,2]原创 2022-03-22 09:39:47 · 442 阅读 · 0 评论 -
力扣765----情侣牵手(C++异或解法)
题目:n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。示例1:输入: row = [0,2,1,3]输出: 1解释: 只需要交换row[1]和row[2]的位置即可。示例2原创 2022-03-21 17:08:33 · 1139 阅读 · 0 评论 -
浅谈字典树(前缀树)
1.什么事字典树就是把英文单词中每个字符挂在树上。如果某些单词有共同的字串,就复用树上的边或者节点。2.字典树的三个基本性质Tire的核心思想是时间换空间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。(1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。(2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。(3)每个节点的所有子节点包含的字符都不相同。3.C++代码#include <iostream>#include <ve原创 2022-03-19 12:57:27 · 282 阅读 · 0 评论 -
10分钟默写快速排序
#include<iostream>using namespace std;void QuickSort(int a[], int l, int r){ //赋值排序,将数组第一个元素作为哨兵,把整个数组分为大于哨兵和小于哨兵两部分 int i = l, j = r, t = a[i]; //递归终止条件 if (i >= j)return; while (i < j) { //从最右侧开始如果大于哨兵,就判断前一个元素 while (i < j原创 2022-03-05 12:18:33 · 126 阅读 · 0 评论 -
深入理解分治算法(附上详例及代码)
分治算法分治算法,根据字面意思解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治策略:对于一个规模为n的 问题,若该问题可以容易解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归的解决这些子问题,然后将各子问题的解合并得到原问题的解。使用场景:·该问题的规模缩小到一定的程度就可以容易的解决。·该问题可以分解为若干原创 2021-11-18 11:20:31 · 1567 阅读 · 0 评论 -
深入理解Sunday算法(附上C++代码)
2.Sunday算法Sunday算法与KMP算法一样是从前往后匹配,在匹配失败时关注的是主串中参加匹配的最末位的下一位字符。如果该字符没有在模式串中出现则直接跳过,即移动位数=模式串长度+1;否则,其移动位数=模式串长度-该字符最右出现的位置(从0开始)=模式串中该字符最右出现的位置到尾部的距离+1例:假定现在要在主串substring searching xiaowu中查找search。1.刚开始时,把模式串与文本串左边对齐:2.结果发现在第2个字符处发现不匹配,不匹配时关注文本串中参加匹配原创 2021-11-16 18:06:07 · 1595 阅读 · 1 评论 -
深入理解BM算法(附上C++代码)
BM算法BM算法的一个特点是当不匹配的时候一次性可以跳过不止一个字符。即它不需要被搜索的字符串中的字符进行逐一比较,而会跳过其中的某些部分。通常搜索的关键字越长,算法速度越快。它的效率来源:对每一次失败的匹配尝试,算法都能够使用这些信息来排除尽可能多的无法匹配位置。它充分的利用待搜索字符串的一些特征,加快了搜索的步骤。基于以下两个规则让模式每次向右移动的尽可能大的距离:坏字符规则:当文本字符串中的某个字符跟模式串的某个字符不匹配时,我们称文本串中的这个失配字符为坏字符,此时模式串需要向右移动,移动的位原创 2021-11-15 21:11:29 · 2789 阅读 · 1 评论 -
数据结构与算法--算法复杂度
文章目录前言一、算法复杂度1. T(n)= O(F(n))2.复杂度分析法则3.时间复杂度分析4.常见时间复杂度实例分析5.复杂度增长趋势图6.复杂度分析概念总结前言常见数据结构与算法:<1>数据结构:数组,链表,栈,队列,散列表,二叉树,堆,跳图,树,Tire树<2>算法:递归,排序,二分查找,搜索,哈希算法,贪心算法,分治算法,回溯算法,动态规划,字符串匹配算法。一、算法复杂度1. T(n)= O(F(n))T(n)代表代码执行的时间;n表示数据规模的大小;F(n)原创 2021-07-07 21:01:58 · 484 阅读 · 0 评论