数据结构与算法
文章平均质量分 72
mandagod
这个作者很懒,什么都没留下…
展开
-
排序算法集合 -1
1. 冒泡排序 Bubble Sort冒泡排序的执行时间和空间复杂度: 平均情况与最差情况为O(n2), 存储空间为O(1)。// test_manda.cpp : Defines the entry point for the console application.//#include "stdafx.h"void budleSort(int *a, int n);void testSort原创 2015-07-29 11:11:19 · 454 阅读 · 0 评论 -
Lintcode - 整数排序
class Solution {public: /* * @param A: an integer array * @return: */ void sortIntegers(vector &A) { // write your code here //SelectionSort(A); //bubl原创 2018-01-30 09:19:34 · 207 阅读 · 0 评论 -
从前缀树谈到后缀树
前一阵看的数据结构比较多,刚好放假没事,把一些我认为重要的写成博客记录下来。今天主要看的是树中的两个比较重要的数据结构前缀树和后缀树这两个树的应用特别广,但是我认为常看课外技术书籍的,博客的都知道,但是一些专注于课本的同学可能就没听说过了。比如我们的课本 - -。开始吧 ^_^先说下前缀后缀的概念吧。比如单词apple。app和appl是单词的前缀,ple和pple是单词的后缀,前缀必须从开头字符...转载 2018-02-12 18:25:40 · 495 阅读 · 1 评论 -
彻底弄懂后缀数组
什么叫后缀数组 首先要知道什么叫后缀 ?比如 字符串 abcdef 那么 abcdef bcdef cdef def ef f 就叫做后缀 也就是从最后一个字母之前的一个字母开始一直到最后一个字母(所以所 bcd不是后缀 因为没有到最后一位f) 所构成的字符串就叫做后缀 至于后缀数组能干什么?我在这就不介绍了 这不是本文的重点!本文主要讲解后...转载 2018-02-12 18:38:57 · 767 阅读 · 0 评论 -
Manacher算法总结
部分图片转自:http://www.cnblogs.com/grandyang/p/4475985.html manacher算法(民间称马拉车算法233)是用来找字符串中的最长回文子串的,先来说一下什么是回文串,像这样“abcba”这样一个字符串找到一个中间位置,然后分别向他的左边和右边相等的距离位置的字符是相同的,那么这个字符串就称为回文串,“abcba”这个字符串的len为5是奇数,...转载 2018-02-12 19:12:44 · 161 阅读 · 0 评论 -
KMP算法最浅显理解——一看就明白
说明KMP算法看懂了觉得特别简单,思路很简单,看不懂之前,查各种资料,看的稀里糊涂,即使网上最简单的解释,依然看的稀里糊涂。 我花了半天时间,争取用最短的篇幅大致搞明白这玩意到底是啥。 这里不扯概念,只讲算法过程和代码理解:KMP算法求解什么类型问题字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。 如下面两个字符串:char *str = "bac...转载 2018-02-12 19:17:04 · 189 阅读 · 0 评论 -
Trie(字典)树的应用:求数组中异或最大的两个数
最暴力也最容易想到的是遍历数组中每一个数,计算与其他数的异或,并记录最大值,时间复杂度为O(n^2),oj上提交一定会超时,最多的解法是利用字典树,将数组中每个数字的二进制保存在树中,由于异或的规则是相同为0不同为1,要获得最大的异或值,则希望异或的结果又尽可能多的1,所以对数字进行取反后在字典树中寻找,记录每次寻找到最大的异或值,对于int数据,只要构建深度为32的字典树,搜索效率为O(32),...原创 2018-03-16 14:43:57 · 446 阅读 · 0 评论 -
求一个数组中右边第一个比他大的数(单调栈)
思路:这个问题,从直觉上来讲,应当是一遍遍历,便可以解决问题。这类问题的特点是,一部分要详尽保留信息,另一部分呈现未解决问题的积累特性。具体到这个问题,创建一个数据结构保留未解决的子问题,根据特点选择栈。1、栈里面保留是索引,而非元素,其实这是一个很关键的地方,索引的信息要比内容多,因为可以索引本身就可以确定内容。要牢记这一特点2、初始栈,里面为第一个元素3、如果栈不为空,而且当前处理元素比栈顶元...转载 2018-03-16 18:43:24 · 809 阅读 · 0 评论 -
某算法题1
时间限制:1秒空间限制:32768KP为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。输入描述:第一行输入点集的个数...原创 2018-03-16 20:43:50 · 533 阅读 · 0 评论 -
某算法题2
时间限制:3秒空间限制:131072K给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值: [6] = 6 * 6 = 36;[2] = 2 * 2 = 4;[1] = 1 * 1 = ...原创 2018-03-16 20:45:07 · 468 阅读 · 0 评论 -
0-1背包
文章作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathinking.com) 转载请注明,谢谢合作。 ---四月份还没写,不能这么荒废了呀,赶紧水一篇吧,哈哈。前些日子回顾了DP的一些基础,就做一下整理吧,从0-1背包开始。本节回顾0-1背包的基本模型,关于它的实现有很多种写法,这里对不同实现做个简单列举,主要是写代码练手了,主要有以下几方面内容:==...转载 2018-03-17 07:48:02 · 241 阅读 · 0 评论 -
有趣的算法:捞鱼问题
文章作者:Yx.Ac 文章来源:勇幸|Thinking (http://www.ahathinking.com) 转载请注明,谢谢合作。 ---话说这道题还是三年前径点公司来学院笔试中的一道题目,当时刚进入实验室,师兄在带着我们做新生培训的时候做过这道题,最近回顾DP的一些基础,翻找以前写的程序,发现了这道题,就贴一下,给出两种方法的代码,并对比了它们在不同规模问题下的效率。题目:20个...转载 2018-03-17 08:21:33 · 1245 阅读 · 0 评论 -
01背包问题变种:从给定的N个正数中选取若干个数之和最接近M
这道题跟捞鱼问题一样,都是刚进实验室新生培训那会儿做过的题目,不过这个是一师姐当时找工作的面试题。如题,并输出该子序列测试用例:2,9,5,7,4,11,10分别输出最接近33、40、47、60的子序列分析:N个数之和接近M,将M看做一个容量的背包,这个题目就变成了典型的01背包,M容量下求最优解并输出最优方案。#include <iostream> using namespace...转载 2018-03-17 08:29:41 · 3689 阅读 · 1 评论 -
01背包问题变种:从长度为n的数组里选出m个数使和为固定值sum
这个问题是我从leetcode上一道问题所想到的,原题:如果是从数组中选出2个数相加使之成为固定的数sum,这当然很简单,把数组中的数字遍历一遍,判断另一个数字是否也在数组中即可。代码如下。vector<int> twoSum(vector<int>& nums, int target) { vector<int> result; ...转载 2018-03-17 08:59:21 · 3853 阅读 · 1 评论 -
给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合
【题目】给定一个数t,以及n个整数,在这n个数中找到加和为t的所有组合,例如t = 4, n = 6,这6个数为 [4, 3, 2, 2, 1, 1],这样输出就有4个不同的组合它们的加和为4: 4, 3+1, 2+2, and 2+1+1. 请设计一个高效算法实现这个需求。-----阿里2011实习生笔试题之前只是看了一下网上这个题的写法没自己动手写,以下为自己所写的程序。注:此题可与创新工厂...转载 2018-03-17 09:37:35 · 1979 阅读 · 0 评论 -
二分写法详解-求上下界
说实话,我之前也不完全理解二分查找的各种写法,导致在写各种二分的边界时我总是弄不清边界值,于是我只能通过暴力枚举这些边界值,去一个一个试,这样子效率真的很低下。于是,痛定思痛,一定要把二分的写法吃透,就有了这篇文章。二分写法的种类二分写法的种类很多,最常见的就是二分查找了的最普遍写法了。代码如下:bool bFind(int a[], int left, int right, int tag){...转载 2018-03-17 14:06:56 · 1215 阅读 · 1 评论 -
第k个字典序全排列(kth permutation)- 康托排列
给定一个数字n和k,表示求一个由n个数字组成的序列的第k个字典序排列。比如给定n=3,k = 2则求由数字【1,2,3】组成的所有序列中的安字典序排列的第k个。不难看出这三个数字组成的序列的按字典序排序如下:1,2,31,3,22,1,32,3,13,1,23,2,1所以得到的第k=2个序列就是1,3,2。分析:可以用上一篇文章所说的NextPe转载 2018-01-28 20:54:47 · 1506 阅读 · 0 评论 -
自动生成格雷码算法
典型的二进制格雷码(Binary Gray Code)简称格雷码,在一组数的编码中,若任意两个相邻的代码只有一位二进制数不同,则称这种编码为格雷码(Gray Code),另外由于最大数与最小数之间也仅一位数不同,即“首尾相连”,因此又称循环码或反射码。自动生成格雷码的算法主要利用以下规则:1. 1位格雷码有两个码字。2. (n+1)位格雷码中的前2n个码字等于n位格雷码的码字,按顺序书写,加前缀0转载 2018-01-18 16:55:46 · 810 阅读 · 0 评论 -
程序设计竞赛网站集锦
程序设计竞赛网站集锦 (1)信息学初学者之家:http://oibh.ioiforum.org/(2)大榕树编程世界:http://www.fjsdfz.org/~drs/program/default.asp(3)中国教育曙光网:http://www.chinaschool.org/aosai/(4)福建信息学奥林匹克:http://www.cfcs.com.cn/fjas/原创 2018-01-25 17:35:46 · 412 阅读 · 0 评论 -
反转一个单链表的循环和递归实现
// 方法一, 递归实现ListNode* ReverseList(ListNode* pHead){ return ReverseListRecursive(NULL,pHead); }// 返回反转后的头结点ListNode* ReverseListRecursive(ListNode* pPrev, ListNode* pNode){ // 空链表 if (原创 2015-07-29 10:57:41 · 556 阅读 · 0 评论 -
排序算法集合 -3
7. 插入排序 Insertion Sort插入排序最好的运行时间是O(n),已经排序好了情况下,平均情况最情况都是O(n2),所以处理随机的未排序数据时并不是好的算法。通过将每个新元素与已经排序好的元素做比较,并将其插入到正确的位置来建立一个排序的数组,就像玩扑克一样,拿到新的牌放入到已经排序好的中间。插入排序是稳定的原地排序算法,特别适合对小的数据集合进行排序,通常作为其他更复杂的排序算法的构建原创 2015-07-29 11:22:18 · 417 阅读 · 0 评论 -
优先队列 - 堆
一些简单的实现 a. 可以用链表,在头以O(1)执行插入操作,并遍历该链表删除最小的元素,这需要O(n)的时间。或者是链表始终保持排序状态,插入的时间花费O(N),而删除最小元素需要的时间为O(1)。删除的操作次数不多于插入操作次数,应此前一种结构更好。 b. 二叉查找树, 删除和插入操作的时间都为O(logN)。但是会破坏树的平衡性。二叉堆 a. 堆是一棵完全二叉树(complete原创 2015-07-29 11:34:18 · 314 阅读 · 0 评论 -
合并两个有序列表的循环和递归实现
// 方法一, 循环实现ListNode* Merge(ListNode* pHead1, ListNode* pHead2){ if(pHead1 == NULL) return pHead2; else if(pHead2 == NULL) return pHead1; ListNode* pMergedHead = NULL;原创 2015-07-29 10:59:30 · 630 阅读 · 0 评论 -
查找算法
1 循环实现int binarySearch(int *a, int len, int x) { int low = 0; int high = len-1; int mid; while (low <= high) { mid = (low + high) / 2; if (a[mid] < x) low = m原创 2015-07-29 11:32:27 · 424 阅读 · 0 评论 -
教你透彻了解红黑树
原文地址:教你透彻了解红黑树 作者:bjpiao转 推荐阅读:Left-Leaning Red-Black Trees, Dagstuhl Workshop on Data Structures, Wadern, Germany, February, 2008. 直接下载:http://www.cs.princeton.edu/~rs/tal转载 2015-07-29 11:38:04 · 367 阅读 · 0 评论 -
排序算法集合 -2
4. 快速排序 Quick Sort快速排序的执行时间和空间: 平均情况为O(nlog(n)), 最差情况为O(n2), 存储空间:O(log(n))。//------------------------------------------------------------void swap(int *a, int left, int right) { int temp = a[left原创 2015-07-29 11:18:04 · 361 阅读 · 0 评论 -
并查集(Union-Find) 应用举例 --- 基础篇
本文是作为上一篇文章 《并查集算法原理和改进》 的后续,焦点主要集中在一些并查集的应用上。材料主要是取自POJ,HDOJ上的一些算法练习题。首先还是回顾和总结一下关于并查集的几个关键点:以树作为节点的组织结构,结构的形态很是否采取优化策略有很大关系,未进行优化的树结构可能会是“畸形”树(严重不平衡,头重脚轻,退化成链表等),按尺寸(正规说法叫做秩,后文全部用秩来转载 2018-01-11 12:44:17 · 229 阅读 · 0 评论 -
斐波那契数列
// ====================方法1:递归====================long long Fibonacci_Solution1(unsigned int n){ if(n <= 0) return 0; if(n == 1) return 1; return Fibonacci_Solution1(n -原创 2017-12-19 09:36:09 · 221 阅读 · 0 评论 -
算法练习:重叠区间个数
一、题目描述给定多个可能重叠的区间,找出重叠区间的个数。举例如下:输入:[1,5],[10,15],[5,10],[20,30]输出:2 说明:题意应该是找出重叠区间中区间的最大个数,当没有区间重叠时,重叠个数最大为1,比如输入为:[1,5],[10,15],则输出为1;输入为:[1,2],[2,3],[3,4],[4,5],则输出为转载 2018-01-23 13:54:13 · 2003 阅读 · 0 评论 -
Lintcode - 整数排序 II
class Solution {public: /* * @param A: an integer array * @return: */ void sortIntegers2(vector &A) { // write your code here quickSort(A, 0, A.size()原创 2018-01-30 09:20:50 · 267 阅读 · 0 评论 -
Lintcode - 中位数
class Solution {public:#if 0 /* * @param nums: A list of integers * @return: An integer denotes the middle number of the array */ int median(vector &nums) { // write y原创 2018-01-30 22:08:20 · 300 阅读 · 0 评论 -
Lintcode -第K大元素
class Solution {public:#if 0 /* * @param n: An integer * @param nums: An array * @return: the Kth largest element */ int kthLargestElement(int n, vector &nums) {原创 2018-01-30 22:54:01 · 398 阅读 · 0 评论 -
Tromino谜题
Tromino 谜题 问题描述:Tromino是一个由棋盘上的三个邻接方块组成的L型瓦片。我们的问题是,如何用Tromino覆盖一个缺少了一个方块(可以在棋盘上的任何位置)的2^n*2^n棋盘。除了这个缺失的方块,Tromino应该覆盖棋盘上的所有方块,而且不能有重叠。这也是一道很经典用分治法解决的题目,摘自《算法分析与设计基础》一书。算转载 2018-01-16 13:29:47 · 1273 阅读 · 0 评论 -
螺钉螺母的匹配问题
螺钉螺母的匹配问题很早之前就看到一道关于螺钉螺母的ACM题目的。最近又看了“分治法”的思想,于是强迫自己去把这个代码写出来!题目如下:给你一堆螺母和螺帽,每个螺母都有一个相对应的螺帽,但是他们之间的对应关系已经打乱。你可以比较螺母和螺帽的大小关系,但是你无法比较螺母和螺母的大小关系,你也无法比较螺帽和螺帽的大小关系。设计一个算法,找出螺母和螺帽的对应关系。当然,我肯定是冲着转载 2018-01-16 20:12:46 · 16122 阅读 · 7 评论 -
为什么要模1000000007
为什么要模1000000007刷OJ时,经常会遇到要模1000000007。先看一下常用数据类型的数值范围(32位系统)字节类型范围长度一字节(2^8)char-128 ~ 1273一字节(2^8)unsigned char0 ~ 2553二字节(2^16)short-32768 ~ 327675二字节(2^16)unsigned short0 ~ 655355四字节(2^32)unsigned ...转载 2018-03-31 12:12:15 · 11883 阅读 · 2 评论