打表

打表这个技巧其实我们在素数部分的题已经涉及到了。还是要仔细思考,什么时候应该打表,打表有助于减少后续的计算的时候,我们应该打表, 特别是查询量特别大,即时计算无论多么快都会超时的情况。或者逆向运算比较快的时候,比如我们用开方求9的开方,和用3直接算出9是它的平方,从而3是9的开方,这两种速度差别非常大。在某些需要找平方因子的题里,可以先通过这种办法把平方因子预先计算然后存起来。
A1100 Mars Numbers
这题其实也不一定要打表,但是打表方便。

DFS和BFS

BFS的最经典的应该就是找最短路,其他一些变种的话,就是在迷宫类的最短路问题里,加上一些,走过消耗大于1的点,或者设置一个门,只允许最后到达门之类的,基本是这种套路。
DFS遍历连通分量的时候记得过滤无效点。(比如求海岛数量,忽略掉代表海洋的点等等)

DFS求连通分量模板

int count = 0;for(int i = 0; i < row; i++){for(int j = 0; j < col; j++){if(!marked[i][j] && data[i][j]){dfs(i, j);count++;}}
}
void dfs(int i, int j){if(!data[i][j]) return;marked[i][j] = true;// 遍历marked值为false的临界点
}

BFS模板1

  q.push(s);marked[s] = true;// 记得要将起点标记为已访问,以免重复访问起始结点。while (!q.empty()) {int u = q.front();q.pop();for(int v : adj[u]){if(!marked[v]){q.push(v);marked[v] = true;// 要在这个地方马上标记为已访问,否则会出错}}}

基本上是这个模板,在A1076和后面树专题的很多题里,我采用了一次取出一层的写法,这样的好处是不需要建立结构体来记录层次。

BFS模板2

     int floor = 0, maxFloor = L;q.push(s);marked[s] = true;// 记得要将起点标记为已访问,以免重复访问起始结点。while (!q.empty()) {if(++floor == maxFloor) break;for(int i = 0, l = (int)q.size(); i < l; i++){int u = q.front();q.pop();for(int v : adj[u]){if(!marked[v]){q.push(v);marked[v] = true;// 要在这个地方马上标记为已访问,否则会出错}}}}

这样就可以妥妥的遍历L层了。

A1004 Counting Leaves

A1004 Counting Leaves
妥妥的水题。DFS遍历并计数每层的叶子结点。

A1076 Forwards on Weibo

A1076 Forwards on Weibo
BFS搜索题,我分别用了模板1和模板2。

A1103 Integer Factorization

A1103 Integer Factorization
DFS+打表,好题。

HDU1241 Oil Deposits

HDU1241 Oil Deposits
DFS算连通分量模板题,这题是下面那题的二维版本。

A1091 Acute Stroke

A1091 Acute Stroke
这道题也是算连通分量,BFS和DFS都可以的,只是遍历的顺序不同。这道题不能用递归写法,会爆栈。《算法笔记》里用的是BFS,这里给出DFS的写法。(感觉它就是为了讲BFS而给这道题用BFS,但是这道题并不是典型的BFS的题目)。

【BFS】UVA439 Knight Moves 骑士的移动

【BFS】UVA439 Knight Moves 骑士的移动
模仿象棋里的马一样走日字的最短路问题。

链表

链表题,至少对于PAT来说,主要就是先遍历一遍把链表的地址顺序存放在一个数组中,然后问题就解决大半了。

A1032 Sharing

A1032 Sharing
这道题我利用了一些规律,使用两个指针就可以找到公共结点而不需要开数组存储遍历情况,这个思路来自于《算法竞赛入门》,记得里面是有一道一模一样的题目。

A1074 Reversing Linked List

A1074 Reversing Linked List
逻辑最麻烦的一道题,要考虑每组后面是下一组还是剩余的几个还是没有了。

A1032 Sharing A1133 Splitting A Linked List 俩水题

A1133 Splitting A Linked List
A1052 Linked List Sorting|链表

A1097 Deduplication on a Linked List

A1097 Deduplication on a Linked List
遍历的时候多一点逻辑处理

对于栈的题目,要注意判断栈是否为空,然后做响应的处理。

A1051 Pop Sequence

A1051 Pop Sequence
栈最经典的题目了,蓝桥杯也考过,《算法竞赛入门》里也有,是一道很老的题目了,原题应该是UVA514。

UVA673 Parentheses Balance 括号验证

【栈】UVA673 Parentheses Balance 括号验证
说到栈的应用还是得有它,经典题。

队列

【队列】HDU1276 士兵队列训练

【队列】HDU1276 士兵队列训练
这题和老鼠那道题几乎是一样的。我估计老鼠那道题就是这道题改了一下。

A1056 Mice and Rice

A1056 Mice and Rice
这题除了比士兵那道题难在,它还给了个操作顺序。所以要多做一点处理,将老鼠按照给出的序列入列。

排序算法

插入排序

    for(int i = 1; i < N; i++){for(int j = i - 1; j >= 0 && a[j] > a[j + 1]; j--){swap(a[j], a[j + 1]);}//......}

最简单的写法,交换次数比较多,不过对于PAT够用。

归并排序

  for(int l = 2; l / 2 <= N; l += l){for(int i = 0; i < N; i += l){sort(a + i, a + min(i + l, N));// PAT里归并过程可以用sort代替}//......}

这部分题都不难,关键是要熟练掌握归并排序、快速排序、希尔排序的写法。还有一个堆排序,放到后面堆的专题里。

堆排序

// 下沉
void sink(int k, int l){int j;while ((j = 2 * k) <= l) {if(j < l && heap[j + 1] > heap[j]) j++;if(heap[j] <= heap[k]) break;swap(heap, k, j);k = j;}
}
void sort(){// 建立堆for(int k = N / 2; k > 0; k--){sink(k, N);}// 排序for(int i = N; i > 0; i--){swap(heap, 1, i);sink(1, i - 1);}
}

A1089 Insert or Merge

A1089 Insert or Merge
插入排序、归并排序

A1101/B1045 Quick Sort/快速排序

A1101/B1045 Quick Sort/快速排序
快速排序选主元的问题,考虑主元需要满足的条件,遍历两次得到答案。这个一轮从左往右一轮从右往左的方法和PAT Judge那道题很像。

POJ2388 Who’s in the Middle

【中位数】【快速排序】POJ2388 Who’s in the Middle
这题在数学篇已经出现过了,不过我觉得毕竟还没考过快速排序,很有可能出个插入排序和快速排序的题,多看看。

A1098 Insertion or Heap Sort

A1098 Insertion or Heap Sort
插入排序+堆排序,要掌握堆的构造、下沉等等。
因为堆是从1号下标开始存放的,为了方便,这类题我们将所有的数组都从1号下标开始存放,会比较方便。

二叉堆

A1147 Heaps
A1155 Heap Paths
这两个题都是递归验证二叉堆的性质,然后递归输出,题目简单,只要掌握二叉堆的定义即可。

hash

模板

bool insert(int n){int M;int step = 0;while (step < MSize) {M = (n + step * step) % MSize;if(table[M] == 0){table[M] = n;return true;}step++;}return false;
}
void search(int n){int M;int step = 0;while (step < MSize) {M = (n + step * step) % MSize;if(table[M] == 0 || table[M] == n){cnt += step + 1;return;}step++;}cnt += MSize + 1;
}

这里cnt算的是搜索次数,为了偷懒直接把第一次搜索看做是step为0的探测,这样代码简洁很多,也不是很难理解。

A1078 Hashing A1145 Hashing - Average Search Time

A1078 Hashing
A1145 Hashing - Average Search Time
这两题会写A1145就可以了。主要是掌握平方探测算法。

分治

目前好像只有这道题是分治,这类题就比较抽象了。分治只是一种思想,具体实现可以有很多,比如上面经典排序算法里的希尔排序、归并排序、快速排序都是基于这一思想。

A1057 Stack

A1057 Stack

值得二刷的题目

  • A1103 Integer Factorization
    DFS+打表,好题。
  • A1074 Reversing Linked List 链表最难的题。
  • A1056 Mice and Rice
  • A1089 Insert or Merge 掌握归并排序
  • A1098 Insertion or Heap Sort 掌握堆排序
  • A1145 Hashing - Average Search Time 掌握平方探测
  • A1057 Stack分块题,有一定难度

【PAT】PAT总结《搜索、打表、分治、排序算法、队列、栈、堆、Hash》相关推荐

  1. Airbnb搜索:深度学习排序算法如何进化?

    导读 本文将基于Airbnb KDD 2018年到2020年的论文,介绍深度学习在Airbnb搜索排序场景落地的宝贵经验,对工业界搜索.推荐.广告算法的改进,具有很好的指导意义. 2018年,Airb ...

  2. 值得收藏的时间复杂度速查表:数据结构操作、排序算法、图操作、堆操作

    时间复杂度速查表 这篇文章覆盖了计算机科学里面常见算法的时间和空间的大 OBig-O 复杂度. 在参加面试前,我们经常需要花费很多时间从互联网上查找各种搜索和排序算法的优劣,了节省大家的时间,我收集了 ...

  3. 阿里文娱搜索排序算法实践和思考(附交流视频和PPT下载链接)

    开工大吉! 本次分享以优酷为例介绍阿里文娱视频搜索的相关业务和算法体系,视频搜索基础相关性和排序算法的特点和挑战以及技术实践方案:听众还了解了优酷在多模态视频搜索上的探索和实践技术方案. 内容摘要 ▽ ...

  4. 必须知道的八大种排序算法【java实现】

    一.冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...

  5. 8种排序算法 java_必须知道的八大种排序算法【java实现】

    一.冒泡排序 冒泡排序是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成. ...

  6. 数据结构学习笔记——基数排序 | 排序算法总结

    目录 一.基数排序排序思想 二.基数排序算法分析 三.排序算法总结 (一)分类 (二)比较 (三)详细分析 一.基数排序排序思想 基数排序与前面的排序算法不一样,它不基于比较和移动元素来进行排序,而是 ...

  7. 【排序算法】快速排序的分析改进

    基本的快速排序 最基本的快速排序是由C.A.R.Hoare在1960年提出的,快速排序的算法是一种分治排序算法 它将数组划分为两个部分,然后分别对两个部分进行排序 快速每次对数组重新排序,选择一个基准 ...

  8. DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台.刷题集合.问题为导向的十大类刷题算法(数组和字符串.栈和队列.二叉树.堆实现.图.哈希表.排序和搜索.动态规划/回溯法/递归/贪心/分治)总 ...

  9. 51Nod-1010 只包含因子2 3 5的数【打表+排序+二分搜索】

    1010 只包含因子2 3 5的数 基准时间限制:1秒 空间限制:131072KB 分值:10难度:2级算法题 收藏 关注 K的因子中只包含2 3 5.满足条件的前10个数是:2,3,4,5,6,8, ...

最新文章

  1. python3 模板库 好用_良心整理15个超级Python库,不要错过
  2. centos php pdo mysql_mysql - CentOS6.5下php无法使用pdo - Pho
  3. 无法启动outlook “外出时的助理程序”
  4. Hibernate调用存储过程
  5. Linux日常命令使用记录
  6. svn+post-commit实现自动部署(转)
  7. 哪里可以培训计算机运维,临武县运维工程师培训班_郴州科泰计算机学校
  8. 京东与中国石化全面深化战略合作 涉及能源供应服务等
  9. MySQL 主从复制与读写分离概念及架构分析
  10. Java基础概念干货(字符、标识符、数据类型... ...)
  11. 浅谈C++的智能指针
  12. 源码分析之String
  13. C++ Primer 学习笔记_98_特殊的工具和技术 --优化内存分配
  14. PriorityQueue 优先队列
  15. 渗透测试各种扫描工具集合(好用)
  16. 大数据开发离线计算框架知识点总结
  17. 网络舆情监测关键词怎么设置与搜集的方法技巧
  18. iOS开发实用技术之音频播放(QQ音乐)
  19. 计算机组成原理实验一:运算器组成的实验
  20. 图片格式及其内存占用

热门文章

  1. python京东抢购 github_11月份GitHub上最热门的Python开源项目
  2. BIM-建筑信息模型
  3. 钉钉群机器人关键词自动回复_企业微信机器人可以这样用
  4. 5G破题 成本压力待解
  5. MBD开发模式下的XIL仿真测试
  6. 学习Emacs系列教程(一):基本使用
  7. C语言 蓝桥杯 1221是一个非常特殊的数,它从左边读和从右边读是一样的,编程求所有这样的四位十进制数。
  8. 单片机裸机-软件定时
  9. 【Python】实训8:企业所得税回归模型(Pearson相关系数、Lasso、灰色预测模型、SVR)
  10. 潍坊申报高新技术企业的税务优惠