算法笔记
文章平均质量分 52
hanyuu11
这个作者很懒,什么都没留下…
展开
-
《算法笔记》学习笔记(15):BFS和DFS
《算法笔记》学习笔记(15):BFS和DFS很久没有更新《算法笔记》的内容了,STL库除了vector之外的容器都不是很复杂书中第七章介绍的栈、队列和链表的应用在以前学习数据结构时学习过,所以只对我掌握不太好的DFS和BFS做一下笔记。目录《算法笔记》学习笔记(15):BFS和DFSDFS背包问题问题思路完整代码选数问题问题思路完整代码总结BFS模板求块问题问题思路完整代码迷宫问题问题思路完整代码总结DFSDFS(Depth First Serach),深度优先搜索就是在每次搜索时往最深的哪一条路走原创 2021-05-15 17:13:39 · 101 阅读 · 0 评论 -
《算法笔记》学习笔记(14):vector
vector是STL库中的一个容器,使用前要加上#include<vector>using namespace std;vector可以看作是一个变长数组,它的定义方式是vector<typename>name;元素的访问和数组类似,可以直接用下标访问,也可以用迭代器访问vectoe<typename>::iterator it;访问时和指针类似,*(it)常用函数push_back(x):在vector后面添加一个元素xpop_back():原创 2021-04-21 21:43:04 · 80 阅读 · 0 评论 -
《算法笔记》学习笔记(13):数学问题
1019 数字黑洞 (20 分)给定任一个各位数字不完全相同的 4 位正整数,如果我们先把 4 个数字按非递增排序,再按非递减排序,然后用第 1 个数字减第 2 个数字,将得到一个新的数字。一直重复这样做,我们很快会停在有“数字黑洞”之称的 6174,这个神奇的数字也叫 Kaprekar 常数。例如,我们从6767开始,将得到7766 - 6677 = 10899810 - 0189 = 96219621 - 1269 = 83528532 - 2358 = 61747641 - 1467 =原创 2021-04-17 23:00:14 · 139 阅读 · 0 评论 -
《算法笔记》学习笔记(12):其他高效技巧与算法
1.打表打表是一种典型的空间换时间的技巧,一般指将所有可能需要用到的结果事先计算出来,这样后面需要用到时就可以直接查表获得。打表常见的用法有如下几种:在程序中一次性计算出所有需要用到的结果,之后的查询直接取这些结果;在程序B中分一次或多次计算出所有需要用到的结果,手工把结果写在程序A的数组中,然后在程序A中就可以直接使用这些结果;对一些感觉不会做的题目,先用暴力程序计算小范围数据的结果,然后找规律,或许就能发现一些蛛丝马迹。2.活用递推1040 有几个PAT (25 分)字符串 APPAPT原创 2021-04-06 11:58:01 · 81 阅读 · 0 评论 -
《算法笔记》学习笔记(11):two pointers
two pointers更倾向于是一种编程技巧,而非一种算法。从一个例子引入:一个递增的正整数序列,查找两个数a和b,设的他们的和为m。若直接使用二重循环枚举,显然时间复杂度为O(n2),同时也会产生大量无效枚举,效率低下。若采用two pointers的方法,令下标i初值为0,j初值为n-1,通过移动i,j来寻找,直到i≥j成立。移动过程中有一下三种情况:1.若a[i]+a[j]==m,因为序列递增,则i++,j–2.若a[i]+a[j]>m,j–3.若a[i]+a[j]>m,i+原创 2021-04-05 18:07:03 · 88 阅读 · 0 评论 -
《算法笔记》学习笔记(10):二分
最经典的二分查找不再赘述#define _CRT_SECURE_NO_WARNINGS 1#include<cstdio>using namespace std;//二分查找int binarysearch(int A[], int left,int right, int x){ int mid; while (left <= right) { mid = (left + right) / 2; if (A[mid] == x)return mid; else原创 2021-04-04 11:38:17 · 87 阅读 · 0 评论 -
《算法笔记》学习笔记(9):贪心
贪心指的是考虑在当前状态下局部最优的策略,来使全局的结果达到最优。如果在想到某个似乎可行的策略,并且无法举出反例时,可以勇敢的实现它。1020 月饼 (25 分)月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一部分库存。样例给出的情形是这样的:假如我们有 3 种月饼,其库存量分别为 18、15、10 万吨,总售价分别为 75、72、45 亿元。如果市场的最大需求量只原创 2021-04-03 11:40:46 · 63 阅读 · 0 评论 -
《算法笔记》学习笔记(8):递归(recursion)
递归中有两个重要概念:1.递归边界2.递归式最简单的递归如阶乘,斐波那契数列全排列问题若把问题描述成“输出1-n这n个整数的全排列“,那么就可以将其分为若干个子问题:”输出以1开头的全排列””输出以2开头的全排列”……”输出以n开头的全排列”。不妨设一个数组P,用于存放当前的排列,在设一个散列数组hashTable,其中hashTable[x]当整数x已经在数组P中时为true。现在按顺序往P的第一位到第n位填入数字。不妨假设已经填好了P[1]-P[index-1],准备填入P[index].显原创 2021-04-01 18:51:28 · 89 阅读 · 0 评论 -
《算法笔记》学习笔记(7):散列
散列(hash)是常用算法之一。简单来说,散列就是将一个元素通过一个函数转换为整数,使得该整数可以尽量唯一的代表这个元素。将这个函数成为散列函数H,元素转换前为key,转换后为H(key)。key为整数时,常用的散列函数有直接定址法、平方取中法、除留余数法等。直接定址法有恒等变换H(key)=key和线性变换H(key)=a*key+b;平方取中法是指取key平方中间若干位作为hash值,很少使用。除留余数法是H(key)=key%mod,表长TSize必须不小于mod,而mod一般取素数,因此为了原创 2021-03-31 14:50:14 · 168 阅读 · 4 评论 -
《算法笔记》学习笔记(6):c++中的sort函数
sort()是一个排序函数,使用时需要引入algorithmvoid sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);表示对first到last范围的数据进行排序,comp不写则默认为升序https://pintia.cn/problem-sets/994805342720868352/problems/9948054743381278721025 PAT RankingProgramming原创 2021-03-27 17:00:18 · 138 阅读 · 0 评论 -
《算法笔记》学习笔记(5):进制转换
将一个p进制的数转换为q进制,需要两步:1.将p进制数x转换为十进制数y2.将十进制数y转换为Q进制数z对于第一步,有公式可以写出函数int convertToDecimal(int a, int p){ int ans = 0, product = 1; while (a) { ans = ans + (a % 10) * product; a = a / 10; product *= p; } return ans;}对于第二步,可以用短除法倒取余数求得int原创 2021-03-26 22:28:23 · 179 阅读 · 0 评论 -
《算法笔记》学习笔记(4):日期处理
题目描述有两个日期,求两个日期之间的天数,如果两个日期是连续的我们规定他们之间的天数为两天。输入有多组数据,每组数据有两行,分别表示两个日期,形式为YYYYMMDD输出每组数据输出一行,即日期差值样例输入2013010120130105样例输出5思路先检查输入的两个数据,不妨假设第一个小于第二个(不满足则交换)。创建一个存放非闰年和闰年每个月的天数的二维数组,用基础运算(/和%)求出输入的日期中的年、月、日。在计算时,现将天数+1,若其超出对应的月份的天数,则将天数置1,月份+1原创 2021-03-26 21:42:52 · 210 阅读 · 0 评论 -
《算法笔记》学习笔记(3):结构体的初始化
这部分的知识和java的类很相似构造函数是一种用来初始化结构体的函数,特点是不需要写返回类型,函数名与结构体名相同。定义一个结构体之后,系统会生成一个默认的构造函数(但不可见),我们也可以手动创建构造函数,对应不同的初始化方式示例程序#include<stdio.h>struct studentInfo{ int id; char gender; //默认构造函数 studentInfo(){} //只初始化gender studentInfo(char _gender)原创 2021-03-26 10:49:16 · 58 阅读 · 0 评论 -
《算法笔记》学习笔记(2):引用
引用是C++的知识,对引用变量的操作就是对原变量的操作,相当于起了个别名。引用只需在函数的参数类型后面或变量名前面加个&就可以了。示例程序#include<stdio.h>void swap(int&, int&);int main(){ int a = 10, b = 5; swap(a, b); printf("a=%d b=%d", a, b);}void swap(int& x, int& y){ int t = x; x原创 2021-03-25 22:39:28 · 60 阅读 · 0 评论 -
《算法笔记》学习笔记(1):sscanf和sprintf
最近开始学《算法笔记》这本书,如果遇到没学过的会记录sscanf的用法sscanf(str,"%d,&n);将字符串str中的内容以%d的格式写入n中示例程序#include <stdio.h>int main(){ int n; char str[100] = "123"; sscanf(str, "%d", &n); printf("%d\n", n); return 0;}输出为sprintf的用法sprintf(str,"%d",n)原创 2021-03-25 21:50:20 · 77 阅读 · 0 评论