
数据结构与算法
文章平均质量分 80
supermouse_
软件工程硕士
展开
-
跟硬币杠上了!!!
最近遇到了好几个跟硬币有关的问题,特地总结一下,下次再遇到就不会混淆了。问题一:换零钱需要最少几个硬币**问题描述:**给你几个不同面额的硬币以及一个总金额 amount,求组成 amount 所需的最少硬币数,如果无法组成 amount,则输出 -1。样例 1:输入: coins = [1, 2, 5], amount = 11输出: 3 解释: 组成 11 最少需要 3 个硬币——...原创 2020-03-02 22:22:06 · 206 阅读 · 0 评论 -
栈
概述栈是一种线性序列结构,它的特殊之处在于,栈对于其中的元素的访问做了限制,只能从序列的某一端进行读写操作。我们知道,看过我之前文章的读者应该知道,对于向量或者是列表,我们可以访问其中的任意一个元素。但是对于栈,我们只能访问位于栈的某一特定端的元素。而禁止操作的另一端,我们称之为盲端。既然栈是一种数据结构,那么它必然也有自己的操作接口,栈所支持的操作接口有以下几种:操作接口功能...原创 2018-12-14 19:35:18 · 352 阅读 · 0 评论 -
「栈」的应用系列之「表达式求值」
说到表达式求值,我不禁想起了我大二那会儿,刚刚开始自学Java,正好我女朋友她们专业那学期也开了 Java 这门课,期末的时候,老师布置了一个作业,让她们用 Java 做一个小东西,计算器、日历、记事本都可以,我女朋友的作业自然落到了我头上。这可是展示我大好才华的机会啊,于是我雄心勃勃地想要做一个计算器出来。刚开始很顺利,图形界面很快就做出来了,结果到了核心部分,也就是计算表达式的时候,我绞尽了...原创 2018-12-20 14:04:00 · 320 阅读 · 0 评论 -
「栈」的应用系列之「进制转换」
大家都知道,计算机底层计算采用的是二进制,计算机的数据存储也是采用二进制,在网络上,设备与设备之间的通信,最终还是要通过二进制比特流来实现。可以说,二进制是信息时代的基础。那么大家有没有想过,既然计算机采用的是二进制,那为什么我们在电脑、手机上看到的信息是多种多样的呢?这就涉及到进制转换的问题了。比如当我们使用电脑上的计算器计算 98 + 56 时,计算机是先把十进制的 98 和 56 转换成二进...原创 2018-12-15 12:37:32 · 778 阅读 · 0 评论 -
「栈」的应用系列之「括号匹配」
人非圣贤,孰能无过。即使是程序员大牛,在写程序时也难免会遇到编译器报错的情况。其中相信大家在写程序的时候都遇到过,那就是括号不匹配,特别是当一条表达式比较长时,各种括号互相嵌套,稍不留神就会出错。那么大家有没有想过,编译器是怎么知道我们写的程序括号不匹配的?答案其实就是栈。对于栈不熟悉的小伙伴可以参考我的这篇文章:栈假设字符序列名为C,则利用栈来判别括号是否匹配的过程如下:自左向右地逐个考查...原创 2018-12-17 16:25:13 · 235 阅读 · 0 评论 -
队列
概述顾名思义,队列其实就类似于我们现实生活中的排队。在计算机科学中,队列是一种特殊的抽象数据类型(ADT)或集合,保存在这个集合中的实体按线性的逻辑次序排列。对队列中元素的操作,仅限于在队尾和队首进行,其中包括在队尾添加元素(入队,enqueue)以及移除队首的元素(出队,dequeue),这就使队列成为一种先进先出(FIFO,First-In-First-Out)的数据结构。就像大家都知道的...原创 2018-12-29 10:47:08 · 278 阅读 · 0 评论 -
如何利用栈解决八皇后问题
追本溯源,什么是八皇后问题?什么是八皇后问题?八皇后问题(Eight queens puzzle)起源于国际象棋,在国际象棋中,皇后的势力范围是它所在的行、列以及对角线,八皇后问题就是如何在一个 8×8 的棋盘上放置八个皇后,使得这八个皇后不能互相攻击(怎么听起来像是后宫戏啊)。换句话说就是,任何一个皇后都不会与其他皇后在同一行、同一列或者同一条对角线上。八皇后问题是一个古老而又著名的问题,提...原创 2018-12-25 10:03:28 · 5983 阅读 · 1 评论 -
详解二叉树的遍历
概述二叉树的遍历是一个很常见的问题。二叉树的遍历方式主要有:先序遍历、中序遍历、后序遍历、层次遍历。先序、中序、后序其实指的是父节点被访问的次序。若在遍历过程中,父节点先于它的子节点被访问,就是先序遍历;父节点被访问的次序位于左右孩子节点之间,就是中序遍历;访问完左右孩子节点之后再访问父节点,就是后序遍历。不论是先序遍历、中序遍历还是后序遍历,左右孩子节点的相对访问次序是不变的,总是先访问左孩子...原创 2019-02-16 19:30:14 · 17399 阅读 · 3 评论 -
约瑟夫问题
约瑟夫问题描述如下:约瑟夫问题解题思路如下:用单循环链表模拟犯人,链表中的每一个节点代表一个犯人。假设总共有 n 个犯人,每隔 m 个犯人处决一个,起始位置是 k,那么从第 k 个节点开始遍历,遍历到第 m+1 个节点时,移除该节点。然后再从 1 遍历到 m+1……如此循环往复,直到只剩下一个节点,就是幸存的犯人。代码如下:/** * 约瑟夫问题 * filename: Josephu...原创 2019-09-03 16:47:23 · 166 阅读 · 0 评论 -
插入排序
原理插入排序是一种简单的排序算法,它将待排序的序列看作两部分,左半部分已经有序,右半部分则是乱序,初始状态下,左半部分只有一个元素,整个排序过程就是从第二个元素开始,不断地依次从右边乱序部分中取出元素,放到左边有序部分中的合适位置,直到最后右边乱序部分中的元素全部被取走,整个序列就被排好序了。与其他高级排序算法(比如快速排序、堆排序、归并排序)相比,插入排序算法的效率低得多,但是这并不意味着它...原创 2018-12-14 11:07:21 · 223 阅读 · 0 评论 -
手把手教你实现一个链表
写在前面这篇文章是看了清华大学邓俊辉教授的《数据结构(C++语言版)》(第三版)中的「列表」那一章之后写的,列表是链表结构的一般化推广,我在这篇文章中是以双向链表为例写的代码,故类名为LinkedList,但是文章中的代码是基于书中代码进行修改的。概述关于链表(LinkedList)的定义,在这里我不做过多的解释了,如果有不知道什么是链表的读者,请参考维基百科,戳这里:维基百科-链表。简单...原创 2018-12-13 12:44:35 · 1129 阅读 · 0 评论 -
手把手教你实现一个向量
文章目录什么是向量向量提供哪些接口实现宏定义定义类成员变量构造函数与析构函数构造函数析构函数成员函数size()get(r)put(r, e)expand()insert(r, e)remove(lo, hi)remove(r)disordered()sort(lo, hi)find(e, lo, hi)search(e, lo, hi)deduplicate()uniquify()重载 “[]”...原创 2018-11-28 21:13:42 · 2430 阅读 · 0 评论 -
二分(折半)查找
二分查找前提条件: List——一个元素有序存放的线性列表; k——待查找的元素。 二分查找法的原理是:这里假设List是按照递增顺序排列,对于给定的关键字k,比较k和处于List的中间位置的元素的大小关系,根据这个大小关系来确定k是在List的中间还是在List的前半段或后半段,以此类推,知道找到元素k或者查找失败。 C++实现:/*------------------------原创 2017-05-13 16:08:10 · 259 阅读 · 0 评论 -
插入排序(INSERTION-SORT)
插入排序的基本思想:将序列(或数组)看作两部分,前半部分已经排好序,后半部分是待排序的。将后面待排序的元素一个一个插入到排好序的序列中,最后整个序列就是有序的了。 伪代码描述: C++实现:/*插入排序*/#include <iostream>using namespace std;template<typename ElementType>void InsertionSort(Eleme原创 2017-07-08 19:57:14 · 317 阅读 · 0 评论 -
归并排序(MERGE-SORT)
归并排序算法完全遵循分治模式。直观上其操作如下: 分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列。 解决:除非分解后得到的两个子序列的元素个数为1,否则继续使用归并排序递归地排序两个子序列。 合并:合并两个已排序的子序列以产生已排序的答案。 当待排序的序列长度为1时,递归“开始回升”,在这种情况下不要做任何工作,因为长度为1的每个序列都已排好序。归并排序算法的关键操作是“合并原创 2017-07-30 14:23:01 · 594 阅读 · 0 评论 -
用汉语阅读的方式输出数字
该程序的功能是输入一个不超过9位的整数,以汉语的方式输出。比如: 输入:-123456789 输出:Fu yi Yi er Qian san Bai si Shi wu Wan liu Qian qi Bai ba Shi jiu输入:100800 输出:yi Shi Wan ling ba Bai下面用C++来实现,参考代码:#include <cstdio>#i...原创 2018-07-01 17:19:02 · 429 阅读 · 0 评论 -
最长公共子序列
问题描述序列可以理解成一个字符串,比如“Chinese”就是一个序列,而子序列指的是由序列中的若干字符,按原相对次序构成的序列。需要注意的是,子序列中的各个字符的相对次序一定和原来序列中的相对次序一样。比如,“Cin”是“Chinese”的子序列,而“sin”就不是“Chinese”的子序列。最长公共子序列(Longest Common Subsequence)问题,就是要找出两个序列的最长的公...原创 2018-11-12 13:21:40 · 139 阅读 · 0 评论 -
你真的了解二分查找吗?
传统的二分查找算法提到二分查找,相信很多人都不陌生,大学学数据结构的时候老师都讲过,它是一种效率较高的查找方法,基于顺序存储结构的线性表,且要求表中元素按关键字有序排列。假设元素非递减排列,则常见的二分查找过程如下:1.将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;2.否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子...原创 2018-11-16 23:50:18 · 726 阅读 · 0 评论 -
冒泡排序的一次自我救赎
快不一定就好,比如说。。。咳咳,你们懂得。但是在排序界,排序速度的快慢可以说是衡量一个算法好坏的重要指标。今天AP哥要给大家介绍的这一款排序算法,可以说是出了名的慢,以至于好像只在书上见过它,在实际应用中并没有它的影子,那就是冒泡排序。可是,它就真的一无是处吗?先别着急下结论,且听我慢慢道来。首先我们来看一下冒泡排序的原理,然后你就知道为什么它这么不受待见了。以整型数组A = { 19,14,...原创 2018-11-19 20:09:48 · 455 阅读 · 0 评论 -
归并排序
概述1945年,约翰·冯·诺依曼(John von Neumann)发明了归并排序,这是典型的分治算法的应用。在计算机科学中,归并排序是一种高效、通用、基于比较的排序算法。此外,归并排序还是稳定的,因为相同元素的相对次序在排序后不会发生变化。最开始,归并排序采用的是自顶向下的模式,后来,到了1948年,冯大神和赫尔曼·海因·戈德斯坦(Herman Heine Goldstine)两人共同撰写了一...原创 2018-11-22 17:18:03 · 532 阅读 · 0 评论 -
计算f(x)=a0+a1x+•••+an-1xn-1+anxn的值
计算多项式函数在指定点x处的值原创 2017-03-03 17:30:02 · 2958 阅读 · 2 评论