c++
文章平均质量分 83
Serendipity_筱楠
当你的才华还撑不起你的野心的时,你就应该静下心来学习;当你的能力还驾驭不了你的目标时,就应该沉下心来历练。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
回溯法 —— 判断子集和问题是否存在解
判断子集和问题是否存在解分析思路:采用回溯法针对问题存在解时求出相应的一个或多个解,或者最优解。如果需要判断问题是否存在解(一个或者多个),可以将求解函数改为bool型,当找到任何一个解时返回true,否则返回false,但当问题没有解时需要搜索所有空间。法一代码:#include<stdio.h>#define MAXN 20int n=4,W;int w[]={0,11,13,24,7}; //存放所有整数解,不用下标为0的元素bool dfs(int tw,int rw原创 2020-09-25 20:26:25 · 1246 阅读 · 0 评论 -
回溯法 —— 求解子集和问题
求解子集和问题的解题目描述:给定有n个不同正整数的集合w=(w1,w2,… ,wn)和一个正数W,要求找出w的子集s,式该子集中所有元素的和为W。例如,当n=4时,w=(11,13,24,7),W=31,则满足要求的子集为(11,13,7)和(24,7)分析思路:n=4时,解空间树如图(结点中的数字是结点的编号,例如结点18对应解向量为(1,1,0,1),选择的整数和=11+13+7=31),从i层到i+1层(1<=i<=n)的每一条边标有xi的值,xi或者为1或者为0,xi为1时表示取原创 2020-09-25 19:54:16 · 24479 阅读 · 3 评论 -
回溯法 —— 求解0/1背包问题(剪枝)
0/1背包问题题目描述:有n个重量分别为w1,w2,…,wn的物品(物品编号为1~n),它们的价值分别为v1,v2,…,vn,给定一个容量为W的背包。设计从这些物品中选取一部分物品放入该背包的方案,每个物品要么选中要么选不中,要求选中的物品不仅能够放到背包中,而且具有最大价值,并对下表所示4个物品求出W=6时的所有解和最佳解。分析思路:回溯法设n件物品重量分别为w1,w2,…,wn的物品,用数组w[1 … n]存放,物品的价值分别为v1,v2,…,vn,用数组v[n]存放;限制重量用W表示。用x[原创 2020-09-25 09:45:32 · 18292 阅读 · 8 评论 -
回溯法——设计一个算法在1、2、3... 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性和全排列
回溯法题目描述:设计一个算法在1、2、3… 9(顺序不能变)数字之间插入+ 或 - 或什么都不插入,使得计算结果总是100的程序,并输出所有的可能性。例如1+2+34-5+67-8+9=100分析思路:用数组a存放1 ~ 9的整数,用字符数组op存放插入的运算符,op[i]表示在a[i]之前插入的运算符。采用回溯法产生和为100的表达式,op[i]只能取+、- 或者空格。设计函数fun(op,sum,prevadd,a,i)sum:记录考虑整数a[i]时前面表达式计算的整数和(初始值为a[0])原创 2020-09-20 17:22:31 · 4395 阅读 · 2 评论 -
回溯法 —— 算法框架及应用
回溯法:思想:走不通退回走别的路在包含问题的所有解的空间树中,按照深度优先搜索策略,从根节点出发搜索解空间树。活结点:自身已生成但其孩子结点没有全部生成的结点扩展结点:指正在产生孩子结点的结点,E结点死结点:指其所有结点均已产生的节点首先根节点成为活结点,同时也成为当前的扩展结点在当前的扩展结点处,搜索向纵深方向移至一个新结点。这个新结点就成为新的活结点,并成为当前扩展结点。如果在当前扩展结点处不能在向纵深方向移动,则当前扩展结点就成为死结点。此时应往回移动(回溯)至最近的一个活结点处,并使这原创 2020-09-19 19:45:10 · 4605 阅读 · 0 评论 -
蛮力法 —— 求解迷宫问题 —— DFS和BFS
求解迷宫问题问题描述:有如图8×8的迷宫OXXXXXXXOOOOOXXXXOXXOOOXXOXXOXXOXOXXXXXXXOOOOXOOXXXXXXXO其中,O表示通路方块,X表示障碍方块。假设入口位置为(0,0)出口为右下角方块位置(7,7)设计一个程序求指定入口到出口的一条迷宫路径。分析用n表示迷宫大小,用二维数组Maze存放迷宫,从(x,y)方块可以试探上、下、左、右4个方位。假设总是按从方位0到方位3的顺序试探,各方位对应的水平方向偏移量H[4]={0,1,0,-1}、垂直原创 2020-09-01 12:04:35 · 3811 阅读 · 0 评论 -
蛮力法 —— 求解幂集问题
求解幂级问题问题描述:对于给定的正整数n(n>=1),求1~n构成的集合的幂集(即由1 ~ n的集合中所有子集构成的集合,包括空集合全集)思路一:穷举法时间复杂度:O(n × 2^n)f()的时间为O(n)将1 ~ n存放到数组a中,求解问题变为构造集合a的所有子集合。设集合a[0 … 2]={1,2,3},其所有集合元素对应的二进制及其十进制对于含n(n>=1)个元素的集合a,求解幂集过程如下:for(i=0;i<2^n;i++){ 将i转换为二进制数b原创 2020-09-01 10:26:35 · 3845 阅读 · 1 评论 -
蛮力法 —— 求解最大连续子序列和问题
问题:求解最大连续子序列和问题原创 2020-08-30 17:47:13 · 3244 阅读 · 0 评论 -
分治法 ——查找问题 —— 寻找两个等长有序序列的中位数
查找问题:问题一:寻找两个等长有序序列的中位数原创 2020-08-26 22:10:44 · 7104 阅读 · 4 评论 -
分治法——查找问题 —— 寻找一个序列中第k小的元素和查找最大和次大元素
问题:对于给定的含有n个元素的无序序列,求这个序列中第k(1<=k<=n)小的元素分析思路:假设无序序列存放在a[0 … n-1]中,若将a递增排序,则第k小的元素为a[k-1].对于无序序列a[s … t],在其中查找第k小的元素(1)若s>=t,其中只有一个元素或没有任何...原创 2020-08-25 20:00:36 · 7853 阅读 · 3 评论 -
分治法 —— 快速排序和归并排序(自底向上和自顶向下)
问题:对于给定的含有n个元素的数组a,对其按元素值递增排序。快速排序1.基本思想:划分:在待排序的n个元素中任取一个元素(通常取第一个元素)作为基准,把该元素放入最终元素后,整个数据序列被基准分割成两个子序列,所有小于基准的元素放在前子序列中,所有大于基准的元素放置在后子序列中,并把基准排在这两个子序列中间。2.分治策略:(1)分解:将原序列a[s…t]分解成两个子序列a[s … i-1]和a[i+1 … t],其中i为划分的基准位置,即将整个问题划分为两个自问题(2)求解子问题原创 2020-08-25 16:35:22 · 4379 阅读 · 0 评论 -
分治法 —— 折半查找(递归与非递归)
折半查找(二分查找)假设为递增有序基本思路时间复杂度:O(log2 n)设a[low…high]是当前查找区间,首先确定该区间的中点位置mid=L(low+high)/2I,然后将待查的k值与a[mid].key比较(1)若k==a[mid].key,则查找成功并返回该元素的物理下标(2)若k<a[mid],则由表的有序性可知a[mid…high]均大于k,因此若表中存在关键字等于k的元素。则该元素必位于左子表a[low…mid]中,新的查找区间是左子表a[low…mid-1](3)原创 2020-08-24 21:59:48 · 4625 阅读 · 0 评论 -
递归算法设计 —— 选择排序和冒泡排序
问题:对于给定的含有n个元素的数组a,分别采用选择排序和冒泡排序方法:将a[0…n-1]分为有序区a[0…n-1]和无序区两个部分,有序区中的所有元素都不大于无序区中的元素,初始时有序区为空,即i=0,经过n-1趟排序(i=1~n-2),每趟排序采取不同方式将无序区中的最小元素移动到无序区的开头,即a[i]处。选择排序采用比较方式在无序区中选择最小元素并放到开头设f(a,n,i)用于在无序区a[i…n-1] (共n-i个元素)中选择最小元素并放在a[i]处,是“大问题“则f(a,n,i原创 2020-08-24 12:11:24 · 2090 阅读 · 0 评论 -
队列的顺序存储框架搭建
队列的顺序存储#define MAX_SIZE 1024顺序队列结构体typedef struct SEQUEUE{ void* data[MAX_SIZE]; int size}Sequeue; 队列初始化Sequeue* Init_Sequeue(){ Sequeue* queue=(Sequeue*)malloc(sizeof(Sequeue)); for(int i=0;i<MAX_SIZE;i++){ queue->data[i]=NULL; }原创 2020-08-07 21:50:03 · 271 阅读 · 0 评论 -
栈的链式存储框架搭建
栈的链式存储链式栈的节点typedef struct LINKNODE{ struct LINKNODE* next;}Linknode;链式栈typedef struct LINKSTACK{ Linknode node; int size;}Linkstack;初始化函数Linkstack* Init_Linkstack(){ Linkstack* stack=(Linkstack*)malloc(sizeof(Linkstack)); stack->hea原创 2020-08-07 20:46:02 · 190 阅读 · 0 评论 -
栈的顺序存储结构框架搭建
栈的顺序存储结构数组模拟#define MAX_SIZE 1024#define SEQSTACK_TRUE 1#define SEQSTACK_FALSE 0结构体typedef struct SEQSTACK{ void* data[MAX_SIZE]; int size;}Seqstack;初始化栈Seqstack* Init_Seqstack(){ Seqstack* stack=(Seqstack*)malloc(sizeof(Seqstack)); for(原创 2020-08-06 22:06:50 · 220 阅读 · 0 评论 -
循环链表框架搭建
单向循环链表——框架搭建判断是否为循环链表方法1.判断最后一个节点的next是否等于头结点2.看size()链表小节点typedef struct CIRCLELINKNODE{ struct CIRCLELINKNODE* next;}CircleLinkNode;CircleLinklist结构体typedef struct CIRCLELINKLIST{ CircleLinkNode head; int size;}CirclrLinklist;链表操作函数原创 2020-08-05 22:36:15 · 215 阅读 · 0 评论 -
单向链表框架搭建
单向链表框架搭建原创 2020-08-04 22:36:53 · 312 阅读 · 0 评论 -
动态数组 —— 框架搭建
动态数组需考虑以下问题:动态增长内存,策略将存放收据的内存放在堆上动态数组 如果5个元素申请内存拷贝数据释放内存插入元素容量capacity:此时这块内存可以放多少元素size 概念 记录当前数组中具体元素的个数typedef struct Dynamicarr{ int * p arr; //存放数据的地址 int size; //当前有多少个元素 int capacity; //容量,当前容器所原创 2020-07-17 22:24:19 · 407 阅读 · 0 评论 -
出现(n+1)/2次的数 — 给n个数字,求至少出现(N+1)/2次的那个数字?
出现(n+1)/2次的数题目:give you N integers which include a SP number.The SP number appears at least (N+1)/2 times.So can you find the SP number?InputThe input contains several test cases. Each test case contains two lines.The first line of input contains a原创 2020-07-15 22:14:52 · 574 阅读 · 0 评论 -
栈实现 —— 二进制转换为十进制
二进制转换为十进制#include<iostream>#include<cstdio>#include<cstdlib>#include<cmath>using namespace std;#define STACK_INIT_SIZE 20 //定义栈长20 #define STACKINCREAMENT 10 //栈的增量10//自定义栈的结构 typedef char ElemType;typedef struct { El原创 2020-07-14 22:33:38 · 558 阅读 · 0 评论 -
合并数字 — m个数字消除相邻的差的绝对值为1的两个数中较大的那一个,直到没有两个相邻的差的绝对值为 1 的数(动态数组定义)
题目:合并数字消除相邻的差的绝对值为1的两个数中较大的那一个。这一天,她得到了 m 个数字,她只能选出最左边的相邻的差的绝对值为 1 的两个数,保留较小的数,泯灭较大的数,直到没有两个相邻的差的绝对值为 1 的数,问小铭学姐最多可以进行多少次这样的操作?输入格式输入第一行为一个整数 n(1 <= n <= 10^5),表示数字的总数第二行为 n 个整数,这些数字的范围为[0, 10^9]。输出格式输出一行,为一个整数,表示小铭学姐最多可以进行多少次这样的操作。Sample.原创 2020-07-15 21:56:15 · 615 阅读 · 0 评论 -
二进制转换为三进制 ——C++实现
二进制转换为三进制题目:输入一个2进制的数,要求输出该2进制数的3进制表示。在3进制的表示中,只有0,1,2三种符号Input第1行是测试数据的组数n,后面跟着n行输入。每组测试数据占1行,包括一个以0和1组成的字符串,字符串长度至少是1,至多是64Outputn行,每行输出对应一个输入。Sample Input2101101011Sample Output211102思路分析:先将二进制转化为十进制再将十进制转化为三进制代码:#include &l原创 2020-07-14 21:08:32 · 3662 阅读 · 0 评论 -
贪心法—LeetCode 452 用最少数量的箭引爆气球
用最少数量的箭引爆气球题目:在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以y坐标并不重要,因此只要知道开始和结束的x坐标就足够了。开始坐标总是小于结束坐标。平面内最多存在104个气球。一支弓箭可以沿着x轴从不同点完全垂直地射出。在坐标x处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以原创 2020-07-11 22:26:57 · 260 阅读 · 0 评论 -
贪心法—— LeetCode45 跳跃游戏II(跳跃游戏进阶版)
跳跃游戏II题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳 1 步,然后跳 3 步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。分析思路:最少的跳跃次数==最合适的跳跃从首元素开始跳,要让它能够跳到最远的位置i原创 2020-07-10 22:28:49 · 296 阅读 · 0 评论 -
贪心法——LeetCode 55 跳跃游戏
跳跃游戏题目:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个位置。示例 1:输入: [2,3,1,1,4]输出: true解释: 我们可以先跳 1 步,从位置 0 到达 位置 1, 然后再从位置 1 跳 3 步到达最后一个位置。示例 2:输入: [3,2,1,0,4]输出: false解释: 无论怎样,你总会到达索引为 3 的位置。但该位置的最大跳跃长度是 0 , 所以你永远不可能到达最后一个位置。原创 2020-07-09 22:14:21 · 310 阅读 · 0 评论 -
贪心法——LeetCode 402 移除K个数字
移除K个数字题目:给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。注意:num 的长度小于 10002 且 ≥ k。num 不会包含任何前导零。示例 1 :输入: num = “1432219”, k = 3输出: “1219”解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。示例 2 :输入: num = “10200”, k = 1输出: “200”解释: 移掉首位的 1 剩下的数字为 200. 注意输出原创 2020-07-08 22:35:13 · 538 阅读 · 0 评论 -
贪心法——LeetCode376 摆动序列
贪心法题目:摆动序列如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为摆动序列。第一个差(如果存在的话)可能是正数或负数。少于两个元素的序列也是摆动序列。例如, [1,7,4,9,2,5] 是一个摆动序列,因为差值 (6,-3,5,-7,3) 是正负交替出现的。相反, [1,4,7,2,5] 和 [1,7,4,5,5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。给定一个整数序列,返回作为摆动序列的最长子序列的长度。 通过从原始序列中删除一原创 2020-07-08 21:27:30 · 287 阅读 · 0 评论 -
贪心法——LeetCode Assign Cookies分饼干
贪心法遵循某种规律,不断贪心的选取当前最优策略的算法设计方法题目:LeedCode 455.Assign Cookies假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i ,都有一个胃口值 gi ,这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j ,都有一个尺寸 sj 。如果 sj >= gi ,我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。你可以假设胃口值为原创 2020-07-07 21:47:38 · 350 阅读 · 0 评论 -
学生信息管理系统(c++源代码实现)
学生成绩管理系统包括:学号姓名性别年龄系别学生成绩实现****************************************"1.增加学生信息2、显示学生信息3、删除学生信息4、学生信息查找"<<endl<<endl ;5、修改学生信息 ***************0、系统安全退出****************************************"请选择:#include<iostream>原创 2020-06-27 17:39:20 · 33001 阅读 · 23 评论 -
设计学生证信息管理系统(C++实现,附源代码,详细解析)
学生证信息管理系统C++实现录入学生的学生信息给定学号显示学生的信息和给定班级显示全班给定某位学生的学号,修改该学生的学生证信息给定某位学生的学号,删除该学生的学生证信息统计每班的某个号次代码#include<iostream>#include<cstdio>#include <stdlib.h>#include<cstring>#include<conio.h># define N 70us原创 2020-06-21 13:07:12 · 2539 阅读 · 0 评论 -
九键字母组合-深度优先遍历DFS
题目:九键字母组合在手机九键里按下某几个数字会得到哪些字母组合?例如,按下“23”的可能字母组合有9种 : ad ae af bd be bf cd ce cf请按字典序输出所有的组合情况输入第一行输入N 代表输入的数字个数(1 ≤ N ≤ 4)第二行N个数字,每个数字在2~9之间,每两个数字之间空格隔开输出按字典序输出全部可能的字母组合,每个可能的组合占一行示例输入:23 2输出:dadbdceaebecfafbfc分析思路:2:abc3:def原创 2020-06-02 22:07:27 · 2431 阅读 · 0 评论 -
Unique Binary Search Trees ll -深度优先遍历DFS
题目:Unique Binary Search Trees llEnglish:Given an integer n, generate all structurally unique BST’s (binary search trees) that store values 1 … n.Example:Input: 3Output:[[1,null,3,2],[3,2,null,1],[3,1,null,null,2],[2,1,3],[1,null,2,null,3]]Ex原创 2020-05-31 22:07:49 · 191 阅读 · 0 评论 -
Restore IP Address-深度优先遍历DFS
题目:Restore IP AddressEnglish:Given a string containing only digits, restore it by returning all possible valid IP address combinations.Example:Input: “25525511135”Output: [“255.255.11.135”, “255.255.111.35”]中文:给定一个只包含数字的字符串,通过返回所有可能的有效IP地址组合来还原它原创 2020-05-31 21:03:17 · 247 阅读 · 0 评论 -
Binary tree paths-深度优先遍历DFS
题目:Binary tree pathEnglish:Given a binary tree, return all root-to-leaf paths.For example, given the following binary tree: 1 / \2 3 \ 5All root-to-leaf paths are:[“1-&g原创 2020-05-30 18:56:20 · 248 阅读 · 0 评论 -
深度优先遍历(DFS)- Letter CasePermutation - Combinations
深度优先遍历(DFS)思路:从图中一个未访问的顶点V开始,沿着一条路一直走到尽头,然后从这条路尽头的节点回退到上一个节点,再从另一条路开始走到尽头…,不断递归重复此过程,直到所有顶点都遍历完成。特点:不撞南墙不回头,先走完一条路,再换另一条路,继续走,和数的前序遍历一样树的深度优先遍历1.从根节点1开始遍历,它的子节点有2,3,4,先遍历节点2,再遍历节点5,之后遍历节点9.2.第一...原创 2020-05-29 22:03:20 · 348 阅读 · 0 评论 -
C++ 标准模板库STL vector各种用法
C++标准模板库STLvector1.构造一个动态数组vector语句:vector vecvector<T> vec //定义一个名为vec的存储T类型数据的动态数组 T:存储数据类型,可以为int,float,double...初始化的时候vec是空的例如:vector<int> a2.插入元素语句:push_back()push_back()//在push_back()方法后面插入一个新的元素#include<vector&原创 2020-05-24 21:09:21 · 307 阅读 · 0 评论 -
试题19 双节棍
题目:小刚想买两根双节棍,左手一根,右手一根。他到商店里,发现共有n(2<=n<=100)根双节棍,第i根的长度为Li(1<=Li<=1000).他希望买下的两根双节棍的长度差尽可能的小,请帮它找到两根合适的双节棍,并输出最小的长度差。输入格式第一行:一个整数n,表示商店里出售双节棍的数量。第二行:n个正整数,用空格分开,第i个数Li表示第i根双节棍的长度。输出格式输出只有一个整数,为两根双节棍的长度差的最小值。样例输入53 4 &n原创 2020-05-23 22:02:29 · 812 阅读 · 0 评论 -
冒泡排序(画图分析)
1、定义:算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡排序”。2.步骤**:**(1)、从头开始,按照大的排在后面的次序(也可小的排在后面)进行两两交换,假定经过一轮两两交换后,最后一个数字为最大的;(2)、第二次,除最后一个不参与比较之外,其余数字按第一步骤依次进行。(3)、重复上述步骤,...原创 2019-12-08 16:46:20 · 1029 阅读 · 0 评论 -
递归法:从n个小球中取m个小球(不放回),共有多少种取法?
从n个小球中取m个小球(不放回),共有多少种取法?利用假设法设3个球A,B,C,任意取出2个,可分为取出的球中含A的部分和不含A的部分。即AB,AC为一组,BC为一组。4个A,B,C,D里面取3个,结果为:ABC,ABD,ACD,BCD,一共4种取法设函数F(n,m)return F(n-1,m-1)+F(n-1,m) 假设一个特殊的球A,把整个取法分为含A的部分和不含A的部分,进行...原创 2020-02-11 15:44:31 · 3302 阅读 · 0 评论
分享