算法设计与分析
算法设计与分析
JLUspring
这个作者很懒,什么都没留下…
展开
-
priority_queue 大/小根堆互换
c++的priority_queue相当于一个大(小)根堆。priority_queue默认是大根堆,即top元素对队列中最大的元素。那么怎么将其变成小根堆呢?下面以int类型为例子。priority_queue<int,vector<int>,greater<int> > p; //小根堆,//默认大根堆为less<int>struct...原创 2020-03-23 14:05:28 · 608 阅读 · 0 评论 -
腾讯校园招聘笔试——逛街能看到楼的数量
小Q在周末的时候和他的小伙伴来到大城市逛街,一条步行街上有很多高楼,共有n座高楼排成一行。小Q从第一栋一直走到了最后一栋,小Q从来没有看到过这么多高楼,所以他想知道他在每栋楼的位置处能看到多少栋楼呢?(当前面的楼的高度大于等于后面的楼时,后面的楼将被挡住)输入描述:输入第一行将包含一个数字n,表示楼的栋数,接下来的一行将包含n个数字wi(1<=i<=n),代表一栋楼的高度。1&...原创 2020-02-21 16:52:07 · 1945 阅读 · 1 评论 -
动态规划求解币值找零最优解
币值为1、3、5.总额可自设。空间复杂度O(n),时间复杂度O(n*n)。n为总额。均为近似。#include <iostream>using namespace std;int number(int totalNumber){ bool flag[totalNumber+1]={false}; flag[0]=true; int i=1; ...原创 2020-02-20 08:35:46 · 689 阅读 · 0 评论 -
满二叉树求根到叶子节点的最短路径
用动态规划的思想以下图为例子:可以用递归(dfs)、bfs等算法,接下来介绍dp的思想。主要是以下递推方程:a[j]=min(a[j/2],a[j/2+1])+a[j]; for(int i=2;i<stage;i++) { int num=i*(i+1)/2; //开始的下标 num+...原创 2020-02-19 20:40:15 · 689 阅读 · 0 评论 -
八皇后问题(C++回溯法求解)
#include <iostream>using namespace std;int row_col[8];int count=0;bool isOk(int row,int col){ int leftUp=col-1; int rightUp=col+1; for(int i=0;i<row;i++) { if(r...原创 2020-02-19 14:28:53 · 1038 阅读 · 0 评论 -
邻接表实现图的深搜、广搜(C++实现)
大体思路:一个邻接节点类adjNode,一个顶点类vertexNode,一个图类Graph。邻接表的主要结构:顶点数组每个顶点下接一个邻接点的链表大致结构如图所示为了方便代码没有加非法值判断默认输入格式正确且节点存储的信息默认就是数字了,如果要存字母什么的可以在类中加一个数据项。#include <iostream>#include <vector>#i...原创 2020-02-18 11:55:57 · 561 阅读 · 0 评论 -
快速排序(C++实现)
快速排序如果要排序数组中下标从 p 到 r 之间的一组数据,我们选择 p 到 r 之间的任意一个数据作为 pivot(分区点)。我们遍历 p 到 r 之间的数据,将小于 pivot 的放到左边,将大于 pivot 的放到右边,将 pivot 放到中间。经过这一步骤之后,数组 p 到 r 之间的数据就被分成了三个部分,前面 p 到 q-1 之间都是小于 pivot 的,中间是 pivot,后面的 ...原创 2020-02-15 19:52:22 · 184 阅读 · 0 评论 -
归并排序(C++实现)
如果要排序一个数组,我们先把数组从中间分成前后两部分,然后对前后两部分分别排序,再将排好序的两部分合并在一起,这样整个数组就都有序了。实现代码:#include <iostream>#include <vector>using namespace std;vector<int> combine(vector<int>& nums...原创 2020-02-15 17:49:25 · 236 阅读 · 0 评论 -
冒泡排序、插入排序、选择排序、希尔排序(C++实现)
冒泡排序:冒泡排序只会操作相邻的两个数据。每次冒泡操作都会对相邻的两个元素进行比较,看是否满足大小关系要求。如果不满足就让它俩互换。一次冒泡会让至少一个元素移动到它应该在的位置,重复 n 次,就完成了 n 个数据的排序工作。最优时间复杂度:O(n)最差时间复杂度:O(n^2)平均时间复杂度:O(n^2)稳定排序class Solution {public: vector&l...原创 2020-02-15 14:46:30 · 241 阅读 · 1 评论 -
C++快慢指针法判断回文串
简要概述快慢指针法(单向链表):设置两个指针,初始值均为头节点。快指针为一次前进两个节点。慢指针为一次前进一个节点。快指针走到头的时候慢指针应该恰好到中点位置,慢指针在前进过程中顺便将链表反向链接。快指针走到头之后,慢指针走到中点,此时慢指针继续向前走,而慢指针建立的反向链表则掉头往回走,此时判断两个链表是否值相等。该算法时间复杂度为O(n)当快指针走到为空(回文串为偶数个字符),或者其...原创 2020-02-13 14:30:27 · 993 阅读 · 1 评论 -
稳定匹配问题
稳定匹配问题有多种叙述方式:医院和医学院毕业生的分配问题。一组男性和一组女性的恋爱关系的分配问题。问题的关键在于不出现不稳定对既A更倾向于B,B亦更倾向于A,但是A和B却没有配对。下面列举一下匹配算法(以婚姻配对问题为例):此算法为男性优先算法,简单证明是每次都是由男性按照自己喜欢的女性列表从高到低进行表白,而女性只能选择接受与否。在这种情况下,女性一旦有了配偶就不可能恢复单身,而...原创 2020-01-03 14:10:29 · 1355 阅读 · 0 评论