算法
周周Stella
吃喝玩乐全栈
展开
-
(C/C++)统计1~n的排列有多少个长度为奇数的连续子序列的中位数是b
描述给出1~n的一个排列,统计该排列有多少个长度为奇数的连续子序列的中位数是b。中位数是指把所有元素从小到大排列后,位于中间的数。输入格式第一行为两个正整数n和b ,第二行为1~n 的排列。输出格式输出一个整数,即中位数为b的连续子序列个数。样例1样例输入15 41 2 3 4 5样例输出12样例2样例输入26 31 2 4 5 6 3样例输出21样例3...原创 2020-02-23 22:49:12 · 2134 阅读 · 0 评论 -
算法概论:多项式归约、P、NP、NP完全问题
归约设计一个函数f(x),把问题A的输入转换成问题B的一个输入,这样就能用问题B的解法来求解。(输出真或假)转换函数f(x)的设计必须要保证问题B的输出结果和相应的问题A上的答案保持一致。这样就是一个归约技术,将这个问题转换为类似的其他问题。多项式归约归约是指A的输入x经过f(x)转换成B的输入x’,所谓多项式归约是指转换函数f(x)不能太复杂,需要在多项式时间内完成。如果是指数级或其他...原创 2019-06-11 22:41:53 · 6215 阅读 · 0 评论 -
(C/C++)对具有负边的图实现Bellman-ford最短路径算法且判断是否具有负环
1.带负权值边的有向图中的最短路径路径问题【问题描述】对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环。例图思路使用dist[]数组存放每个结点距离起始点的距离,一共进行N-1次循环(因为一共有N个顶点,最多的路径也只有N-1条边),每次循环对每一条边进行一次update()。在开始bellman-for...原创 2019-06-08 19:11:29 · 945 阅读 · 0 评论 -
(C/C++)区间调度问题的解决及输出:动态规划、贪心算法(递归、递推)
给定n个活动,其中的每个活动ai包含一个起始时间si与结束时间fi。设计与实现算法从n个活动中找出一个最大的相互兼容的活动子集S。要求:分别设计动态规划与贪心算法求解该问题。其中,对贪心算法分别给出递归与迭代两个版本的实现。思路动态规划动态规划的思路则对此问题来说较为复杂,定义Sij为在i任务结束之后,j任务开始之间所包含的任务的子集。定义两个虚拟任务ai、an+1,则问题对应了S0,...原创 2019-04-23 19:07:08 · 1641 阅读 · 1 评论 -
(C/C++)给定一个带权无序数组,线性复杂度求出其带权中位数(select分治算法)
给定一个未排序的数组(x1, x2, … ,xn),其中每个元素关联一个权值:(w1, w2, … ,wn),且 。请设计一个线性时间的算法,在该数组中查找其带权中位数xk,满足:思路基于寻找无序数组第k小个数的select算法,以rand()选出的pivot将数组分为三个部分,并进行前后两部分权值总和的判断。若leftWeight <=0.5 && rightW...原创 2019-03-28 12:32:24 · 1432 阅读 · 1 评论 -
(C/C++)动态规划:多段图最短路径、有向无环图最短路径、最长递增不连续子序列
多段图的最短路径问题建立一个从源点S到终点T的多段图,设计一个动态规划算法求出从S到T的最短路径值,并输出相应的最短路径。思路首先确定能分段,即每一层的各个结点互不连通,后驱结点均在同一层。通过有一定修改的bfs进行分段,然后从最后一段,依段数逐段取最小路径,有点类似最小路径算法。#include <iostream>#include <vector>...原创 2019-04-03 21:07:47 · 4170 阅读 · 0 评论 -
(C/C++)给定一个数组,前n个为有序整数,剩余元素为无穷,以logn复杂度查找输入的数
无穷数组,前n个元素是整数且有序,剩余元素为无穷。设计算法,以一个整数x为输入,以logn时间复杂度找到其中一个位置,满足其上元素值为x。思路一开始没怎么看懂,后来查了一下即需要在二分查找前进行O(logn)复杂度的查找确定二分的范围。先比较数组的A[0]元素,若不相等接下来比较A[1],A[2],A[4],A[8]…,若找到一个区间A[2n-1]<x<A[2n],再对这个...原创 2019-03-17 22:16:44 · 272 阅读 · 0 评论 -
(C/C++)给定一个数组,确定是否存在一个主元素:分治法(nlogn)
当一个数组1…n超过半数的元素都相同时,该数组被称为含有一个主元素。给定一个数组,设计一个有效算法,确定该数组是否含有一个主元素,如果有,找出这个元素。该数组的元素之间不一定存在顺序,如果整数之间就存在顺序,可以作形如A[i]>A[j]的比较,与此不同的是,该数组的元素则不一定能做出这样的比较。(比如可以将该数组的元素想象成GIF文件)但是,却可以在常量时间内回答“A[i]==A[j]吗?...原创 2019-03-17 22:15:50 · 1559 阅读 · 0 评论 -
(C/C++)k个有序数组进行复杂度O(nlogk)的k-路归并
假定有k个有序数组,每个数组中含有n个元素,您的任务是将它们合并为单独的一个有序数组,该数组共有kn个元素。设计和实现 一个有效的分治算法解决k-路合并操作问题,并分析时间复杂度。思路分治算法即将有序数组两两归并#include <iostream>#define N 5#define INDEX_COUNT 5using namespace std;int IND...原创 2019-03-21 10:26:13 · 1356 阅读 · 0 评论 -
(C/C++)给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数
给定两个长度为m和n的有序列表,以O(logm+logn)复杂度找出有序列表第k小的数思路logm+logn即可推断是分治,每次折半得到两个数组的A[midA]和B[midB],有:A[midA]>B[midB]时:若midA+midB(实际上是midA+midB-beginA-beginB+2,下同)的元素个数>k,则midB之后的序列肯定不包含在最终的有序k个元素的...原创 2019-03-20 19:14:50 · 1470 阅读 · 0 评论