- 博客(96)
- 收藏
- 关注
原创 题库随记:超快速排序
题库 18.超快速排序在这个问题中,您必须分析特定的排序算法----超快速排序。该算法通过交换两个相邻的序列元素来处理n个不同整数的序列,直到序列按升序排序。对于输入序列9 1 0 5 4,超快速排序生成输出0 1 4 5 9。您的任务是确定超快速排序需要执行多少交换操作才能对给定的输入序列进行排序。输入格式输入包括一些测试用例。每个测试用例的第一行输入整数n,代表该用例中输入序列的长度。接下来n行每行输入一个整数 ai ,代表用例中输入序列的具体数据,第i行的数据代表序列中第 i 个数。当输
2020-08-28 22:52:18
206
原创 题库随记:动态中位数
题库 17.动态中位数依次读入一个整数序列,每当已经读入的整数个数为奇数时,输出已读入的整数构成的序列的中位数。输入格式第一行输入一个整数 P ,代表后面数据集的个数,接下来若干行输入各个数据集。每个数据集的第一行首先输入一个代表数据集的编号的整数。然后输入一个整数 M ,代表数据集中包含数据的个数,M 一定为奇数,数据之间用空格隔开。数据集的剩余行由数据集的数据构成,每行包含10个数据,最后一行数据量可能少于10个,数据之间用空格隔开。输出格式对于每个数据集,第一行输出两个整数,分别代表数
2020-08-22 22:36:54
229
原创 题库随记:货仓选址
题库 16.货仓选址在一条数轴上有 N 家商店,它们的坐标分别为 A1 ~ AN 。现在需要在数轴上建立一家货仓,每天清晨,从货仓到每家商店都要运送一车商品。为了提高效率,求把货仓建在何处,可以使得货仓到每家商店的距离之和最小。输入格式第一行输入整数 N 。第二行N个整数 A1 ~ AN 。输出格式输出一个整数,表示距离之和的最小值。数据范围1≤ N ≤100000输入样例46 2 9 1输出样例12题解核心思路即 排序+中位数中位数有非常优秀的性质,比如说在这道题目中,每一
2020-08-19 22:32:16
239
原创 题库随记:最高的牛
题库 15.最高的牛题目描述有 N 头牛站成一行,被编队为1、2、3 … N ,每头牛的身高都为整数。当且仅当两头牛中间的牛身高都比它们矮时,两头牛方可看到对方。现在,我们只知道其中最高的牛是第 P 头,它的身高是 H,剩余牛的身高未知。但是,我们还知道这群牛之中存在着 M 对关系,每对关系都指明了某两头牛 A 和 B 可以相互看见。求每头牛的身高的最大可能值是多少。输入格式第一行输入整数N,P,H,M,数据用空格隔开。接下来M行,每行输出两个整数 A 和 B ,代表牛 A 和牛 B 可以相
2020-08-16 22:38:29
178
原创 题库随记:奇怪的汉诺塔
题库 14.奇怪的汉诺塔汉诺塔问题,条件如下:1、这里有A、B、C和D四座塔。2、这里有n个圆盘,n的数量是恒定的。3、每个圆盘的尺寸都不相同。4、所有的圆盘在开始时都堆叠在塔A上,且圆盘尺寸从塔顶到塔底逐渐增大。5、我们需要将所有的圆盘都从塔A转移到塔D上。6、每次可以移动一个圆盘,当塔为空塔或者塔顶圆盘尺寸大于被移动圆盘时,可将圆盘移至这座塔上。请你求出将所有圆盘从塔A移动到塔D,所需的最小移动次数是多少。没有输入输出格式对于每一个整数n(1≤n≤12),输出一个满足条件的最小移动
2020-08-11 22:47:09
247
原创 题库随记:递归实现排列型枚举
题库 13.递归实现排列型枚举把 1~n 这 n 个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数n。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1 ≤ n ≤ 9输入样例3输出样例1 2 31 3 22 1 32 3 13 1 23 2 1题解代码如下:#include <bits/stdc++.h>using n
2020-08-08 23:06:12
116
原创 题库随记:递归实现组合型枚举
题库 12.递归实现组合型枚举从 1~n 这 n 个整数中随机选出 m 个,输出所有可能的选择方案。输入格式两个整数 n,m,在同一行用空格隔开。输出格式按照从小到大的顺序输出所有方案,每行1个。首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如1 3 5 7排在1 3 6 8前面)。数据范围n > 0,0 ≤ m ≤ n,n + (n − m) ≤ 25输入样例5 3输出样例1 2 31 2
2020-08-06 23:30:21
172
原创 题库随记:递归实现指数型枚举
题库 11.递归实现指数型枚举从 1~n 这 n 个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤ n ≤15输入样例3输出样例322 311 31 21 2 3题解位运算+递归深度优先搜索代码如下:#include <bits/stdc++.h
2020-08-04 23:41:55
155
原创 题库随记:最短Hamilton路径
题库 10.最短Hamilton路径给定一张 n 个点的带权无向图,点从 0~n-1 标号,求起点 0 到终点 n-1 的最短Hamilton路径。 Hamilton路径的定义是从 0 到 n-1 不重不漏地经过每个点恰好一次。输入格式第一行输入整数n。接下来n行每行n个整数,其中第i行第j个整数表示点i到j的距离(记为a[i, j])。对于任意的x,y,z,数据保证 a[x,x]=0,a[x,y]=a[y,x] 并且 a[x,y]+a[y,z]>=a[x,z]。输出格式输出一个整数,
2020-08-01 22:13:05
125
原创 题库随记:64位整数乘法
题库 9.64位整数乘法求 a 的 b 次方对 p 取模的值。输入格式第一行输入整数 a,第二行输入整数 b,第三行输入整数 p。输出格式输出一个整数,表示a*b mod p的值。数据范围0≤a,b,p≤108输入样例345输出样例2题解(二进制思想) O(logn)如果直接计算a乘b这会超过 long long 的最大范围,所以采用类似于快速幂的思想:把 b 写成二进制形式,然后如果某位上为 1 就加上它a * (2n) 次方(n与这位的位置有关)并且每次计算后取模就可以了
2020-07-31 22:58:48
115
原创 题库随记:a^b
题库 8.a^b求 a 的 b 次方对 p 取模的值。输入格式三个整数 a,b,p, 在同一行用空格隔开。输出格式输出一个整数,表示a^b mod p的值。数据范围0≤a,b,p≤109数据保证 p ≠ 0输入样例3 2 7输出样例2题解表面AC实质是一道数论题数论题数论题(重要的事情说3遍QAQ )考虑到题目测试样例过于巨大(奇葩),因此暴力AC会TLE,需要快速幂的介入,因此,a^n 中的 n 用二进制数表示方法如下:f[c]=1;c++;f[c]=a%p;c++;fo
2020-07-29 22:27:03
140
原创 题库随记:找出数组中重复的数字
题库 7.找出数组中重复的数字给定一个长度为 n 的整数数组 nums,数组中所有的数字都在 0∼n−1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。注意:如果某些数字不在 0∼n−1的范围内,或数组中不包含重复数字,则返回 -1;样例给定 nums = [2, 3, 5, 4, 3, 2, 6, 7]。返回 2 或 3。题解(数组遍历) O(n)算法的主要思想是把每个数放到对应的位置上,即让nums[i] = i。
2020-07-25 22:32:58
238
原创 题库随记:多重背包问题III
题库 5.多重背包问题III有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V ,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0< N ≤ 10000< V ≤ 2
2020-07-23 22:50:29
146
原创 题库随记:多重背包问题II
题库 4.多重背包问题II有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V ,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0< N ≤10000< V ≤2000
2020-07-21 22:14:18
121
原创 题库随记:多重背包问题 I
题库 4.多重背包问题I有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。输出最大价值。输入格式第一行两个整数,N,V ,用空格隔开,分别表示物品种数和背包容积。接下来有 N 行,每行三个整数 vi,wi,si,用空格隔开,分别表示第 i 种物品的体积、价值和数量。输出格式输出一个整数,表示最大价值。数据范围0<N,V ≤1000<vi,wi, si
2020-07-20 22:56:07
164
原创 题库随记:完全背包问题
题库 3.完全背包问题有 N 件物品和一个容量是 V 的背包。每件物品都有无限件可用。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi, wi,用空格隔开,分别表示第 i 件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N, V ≤10000<vi, wi ≤100
2020-07-18 22:48:26
118
原创 题库随记:01背包问题
题库 2.背包问题有 N 件物品和一个容量是 ***V***的背包。每件物品只能使用一次。第 i 件物品的体积是 vi,价值是 wi。求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。输入格式第一行两个整数,N,V,用空格隔开,分别表示物品数量和背包容积。接下来有 N 行,每行两个整数 vi, wi,用空格隔开,分别表示第 i件物品的体积和价值。输出格式输出一个整数,表示最大价值。数据范围0<N, V ≤10000<vi, wi ≤10
2020-07-16 22:57:12
223
原创 题库随记: A + B
题库 1. A + B输入两个整数,求这两个整数的和是多少。输入格式输入两个整数A,B,用空格隔开,0≤A,B≤108输出格式输出一个整数,表示这两个数的和样例输入:3 4样例输出:7算法(模拟) O(1)C++ 样例代码如下:#include <iostream>using namespace std;int main () { int a, b; cin >> a >> b; cout << a +
2020-07-14 22:23:12
323
原创 TCP协议的三次握手和四次分手
通俗白话之TCP三握四挥通俗理解:引用的一些通俗易懂的例子,虽然不太正确,后面会指出,但是不妨碍我们理解,大体就是这么个理解法。第一次对话:老婆让甲出去打酱油,半路碰到一个朋友乙,甲问了一句:哥们你吃饭了么?结果乙带着耳机听歌呢,根本没听到,没反应。甲心里想:跟你说话也没个音,不跟你说了,沟通失败。说明乙接受不到甲传过来的信息的情况下沟通肯定是失败的。如果乙听到了甲说的话,那么第一次对话成功,接下来进行第二次对话。第二次对话:乙听到了甲说的话,但是他是老外,中文不好,不知道甲说的啥意
2020-07-13 22:32:23
161
原创 计算机网络家庭中的交换机与路由器
何为交换?何为路由?两者如何相爱相杀?通过理论课本的详细介绍,具体定义如下,仔(kan)细(kan)阅(jiu)读(hao)以便后面区别的解释:交换机用于同一网络内部数据的快速传输转发决策通过查看二层头部完成转发不需要修改数据帧工作在 TCP/IP 协议的二层----数据链路层工作简单,直接使用硬件处理路由器用于不同网络间数据的跨网络传输转发决策通过查看三层头部完成转发需要修改 TTL ,IP 头部校验和需要重新计算,数据帧需要重新封装工作在 TCP/IP 协议的三层 ——
2020-05-26 11:41:32
1193
原创 (C++)剑指offer-拓展:树中两个结点的最低公共祖先(树)
(C++)剑指offer-拓展:树中两个结点的最低公共祖先采用递归的方法,考虑在左子树和右子树中查找这两个节点,如果两个节点分别位于左子树和右子树,则最低公共祖先为自己(root),若左子树中两个节点都找不到,说明最低公共祖先一定在右子树中,反之亦然。考虑到二叉树的递归特性,因此可以通过递归来求得。时间复杂度为O(n),最坏的情况需要遍历全树,具体代码如下:class Solution {p...
2020-04-19 16:13:43
125
原创 (C++)剑指offer-49:把字符串转换成整数(模拟)
(C++)剑指offer-49:把字符串转换成整数模拟问题;1.忽略所有行首空格,找到第一个非空格字符,可以是 ‘+/−’ 表示是正数或者负数,紧随其后找到最长的一串连续数字,将其解析成一个整数;2.整数后可能有任意非数字字符,如果存在则返回0(牛客测试样例);3.如果整数长度为0,则返回0;4.如果整数大于INT_MAX,请返回INT_MAX;如果整数小于INT_MIN ,请返回INT_...
2020-04-19 15:37:36
139
原创 (C++)剑指offer-51:构建乘积数组(数组)
(C++)剑指offer-51:构建乘积数组B[i]的意义是A数组不包括i位置的所有乘积,分为i左边的元素乘积和i右边的所有元素乘积。第一个for计算i左边的乘积,第二个for计算右边的。初始化p=1,是因为0左边没有元素,所以乘积为1。时间复杂度为O(n),具体代码如下:class Solution {public: vector<int> multiply(cons...
2020-04-19 14:53:50
114
原创 (C++)剑指offer-48:不用加减乘除做加法(发散思维能力)
(C++)剑指offer-48:不用加减乘除做加法很容易想到通过位运算来解决问题。以5+17=22为例,参考十进制加法:1、只做各位相加不进位运算,即得到12,;2、做进位运算,即得到10,;3、把前面两个结果先相加,即得到22;同样二进制加法也一样:1、两个整数做异或^,得到各位相加不进位的运算结果;2、两个整数做与&,然后再左移一位,即得到进位的运算结果;3、将上面两个结果相...
2020-04-18 23:27:18
100
原创 (C++)剑指offer-47:求1+2+3+...+n(发散思维能力)
(C++)剑指offer-47:求1+2+3+…+n最直接的想法就是用递归,getSum(n) = n+getSum(n-1),但是要注意终止条件,由于求的是1+2+…+n的和,所以需要在n=0的时候跳出递归,但是题目要求不能使用if,while等分支判断,可以考虑利用&&短路运算来终止判断。时间复杂度为O(n),具体代码如下:class Solution {public:...
2020-04-18 22:42:44
274
原创 (C++)剑指offer-拓展:股票的最大利润
(C++)剑指offer-拓展:股票的最大利润由于只允许做一次股票买卖交易,枚举每一天作为卖出的日子,买入日子一定在卖出日子之前,为了获利最多,希望买入的日子的股票价格尽可能低。用minv记录当前最低的买入价格,用res记录当前最大利润,遍历更新这两项。时间复杂度为O(n),具体代码如下:class Solution {public: int maxDiff(vector<i...
2020-04-18 22:26:21
162
原创 (C++)剑指offer-46:圆圈中最后剩下的数(递归)
(C++)剑指offer-46:圆圈中最后剩下的数约瑟夫问题,n个人的编号为0~n-1,对删除的过程进行分析。假设m小于n,第一个删除的数字即为m-1,对应新的数编号为0,1,…;而上述旧编号为m,m+1,…;通过分析可以发现f(n,m) = f(n-1,m) + m;当然上述分析是m<n的情况,当m>n时,需要取模,因此递归通用公式为f(n,m) = (f(n-1,m) + m)%...
2020-04-15 23:10:40
93
原创 (C++)剑指offer-45:扑克牌顺子(模拟问题)
(C++)剑指offer-45:扑克牌顺子模拟所有顺子可以成立的前提条件为:除了0以外不能出现两个相同的数字;排序后最大最小数字的差值不能大于4。时间复杂度为O(n),具体代码如下:class Solution {public: bool IsContinuous( vector<int> numbers ) { if(numbers.empty()) r...
2020-04-15 22:35:41
119
原创 (C++)剑指offer-拓展:骰子的点数(动态规划)
(C++)剑指offer-拓展:骰子的点数考虑用动归,数组dp[i][j]表示用i个骰子扔出和为j的可能数,因为第i个骰子可能扔出1-6的点数,则dp[i][j]=dp[i-1][j-1]+dp[i-1][j-2]+dp[i-1][j-3]+dp[i-1][j-4]+dp[i-1][j-5]+dp[i-1][j-6];状态表示f[i][j]:表示前i次总和是j的方案数;状态转化:f[i][j] ...
2020-04-15 20:48:36
174
原创 (C++)剑指offer-64:滑动窗口是最大值(队列)
(C++)剑指offer-64:滑动窗口是最大值通过双向单调队列实现,窗口向右滑动的过程相当于把窗口第一个数字删除,同时在窗口末尾添加一个新数字,双向队列deque可以实现,并且在队列中只保留那些可能成为窗口最大元素的数字,因此队列中进入一个较大的数字,便把该队列中比这个进入的数字小的全部弹出,通过双向单调队列,将元素的下标存储,假定双向队列的队头是整个队列的最大元素所在的下标,至队尾下标代表的...
2020-04-15 19:35:31
85
原创 (C++)剑指offer-43:左旋转字符串(知识迁移能力)
剑指offer-43:左旋转字符串枚举法,通过规律找出,如str=“abcdef”,n = 2第一次reverse得到 fe dcba;第二次对每部分进行reverse得到 ef abcd;从而符合样例要求efabcd,时间复杂度为O(n),具体代码如下:class Solution {public: string LeftRotateString(string str, in...
2020-04-15 14:55:44
84
原创 (C++)剑指offer-44:翻转单词顺序列(知识迁移能力)
剑指offer-44:翻转单词顺序列利用双指针进行,大致步骤如下:1.反转整个字符串(reverse实现);2.通过双指针找到字符串中的一个个单词;3.逐个反转这些单词即可。时间复杂度为O(n),具体代码如下:class Solution {public: string ReverseSentence(string str) { reverse(str.begin()...
2020-04-15 14:30:10
100
原创 (C++)剑指offer-41:和为S的连续正数序列(知识迁移能力)
(C++)剑指offer-41:和为S的连续正数序列利用双指针进行扫描,设置两个指针i和j,分别指向连续正数序列的起始和终止;用s表示当前连续正数序列的和,即s=i+(i+1)+…+j;以i递增的方式遍历整个序列(1到n),代表查找以i开头的时候结尾j应该是多少。当s<sum说明j应该往后移动,当s=sum说明满足题意,当s>sum说明向后走即可;上述遍历过程中,s=sum的情况下不...
2020-04-13 22:50:35
84
原创 (C++)剑指offer-42:和为S的两个数字(知识迁移能力)
(C++)剑指offer-42:和为S的两个数字使用哈希表进行时间复杂度*O(n)*的方法,循环一遍 nums数组,在每步循环中我们做两件事:1.判断 target−nums[i]是否在哈希表中;2.将nums[i]插入哈希表中;具体代码如下:class Solution {public: vector<int> findNumbersWithSum(vector<...
2020-04-13 22:25:26
87
原创 (C++)剑指offer-拓展:数组中唯一只出现一次的数字(位运算)
(C++)剑指offer-拓展:数组中唯一只出现一次的数字首先将数组中每个数字进行二进制表示,这样便可以统计每个位上对应1的次数,如果次数%3多1,则说明唯一出现一次的数字在该二进制位为1,因此记录到ans结果中并移一位ans = ans * 2 + 1;如果次数%3为0,说明该位只有三个相同的数字,因此直接移至下一位ans = 2 * ans,上述方法的整体时间复杂度为O(n),具体代码如下:...
2020-04-13 17:39:56
174
原创 (C++)剑指offer-40:数组中只出现一次的数字(位运算)
(C++)剑指offer-40:数组中只出现一次的数字如果数组中只有一个数组出现一次,其余数字出现两次的情况,直接对数组中所有数组进行位运算,这样相同的两个数字变相互抵消为0,最后的结果就是只出现一次的数字;针对数组中出现一次的数字有两个的情况可以先通过异或得到 x^y;再取x与y中第k位为1的数作为判断条件;将数分为两个集合,第k位为1的集合和第k位不是1的集合;这样x,y分别在这两个集合之...
2020-04-13 16:32:12
190
原创 (C++)剑指offer-39:平衡二叉树(知识迁移能力)
(C++)剑指offer-39:平衡二叉树和二叉树深度同理进行递归,额外判断每一个结点的左右子树是否都满足深度相差小于1的条件,时间复杂度同样为O(logn),具体代码如下:class Solution {public: bool ans = true; bool IsBalanced_Solution(TreeNode* pRoot) { ...
2020-04-12 23:10:14
85
原创 (C++)剑指offer-38:二叉树的深度(知识迁移能力)
(C++)剑指offer-38:二叉树的深度从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度,因此递归每个结点的左右子树,选择深度更大的再加当前结点1即为所求,整体时间复杂度为O(logn),具体代码如下:class Solution {public: int TreeDepth(TreeNode* pRoot) { i...
2020-04-12 22:49:37
62
原创 (C++)剑指offer-62:二叉搜索树的第k个结点(树)
(C++)剑指offer-62:二叉搜索树的第k个结点二叉搜索树按照中序遍历的顺序打印出来即是从小到大排序的顺序,因此第k个结点即为结果。先找根节点对应的左子树,再找根节点,每找一个结点k–,如果k等于0,此时对应的结点即为所求,否则继续找根节点的右子树,依次遍历。时间复杂度为O(n),1<=k<=TreeNodeNum,具体代码如下:class Solution {public...
2020-04-12 17:08:31
129
原创 (C++)剑指offer-拓展:数组中数值和下标相等的元素
(C++)剑指offer-拓展:数组中数值和下标相等的元素数组为单调递增的数组,可以判断出nums[i] - i也为单调递增,因此便可以通过二分法进行处理,当nums[mid] - mid >= 0时,取左半部分,否则取右半部分,依次递归,整体时间复杂度为O(logn),具体代码如下:class Solution {public: int getNumberSameAsInde...
2020-04-12 15:27:48
135
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人