![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法学习
文章平均质量分 64
feiqiangs
这个作者很懒,什么都没留下…
展开
-
从大小为N的样本集中随机采集不同的K个样本
这类为题可以抽象为随机生成K个 1~N之间不同的整数。解决思路:a,选中第1个元素,将其与n个元素中的任意一个交换(包括第1个元素自己)。这时排序后的第1个元素已经确定。b,选中第2个元素,将其与n-1个元素中作任意一个交换(包括第2个元素自己)。c,重复上面步骤K次实现代码:#include#include#include#includeu原创 2016-10-28 18:07:37 · 1291 阅读 · 0 评论 -
leetcode:278. First Bad Version
278. First Bad VersionYou are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version原创 2016-08-24 16:10:04 · 201 阅读 · 0 评论 -
旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的的数组的旋转,输出旋转数组的最小元素,如{3,4,5,1,2}位{1,2,3,4,5}的数组旋转。最小值是1思路:用二分查找法#include#include#include#include#includeusing namespace std;/** * Definition原创 2016-09-13 17:29:08 · 204 阅读 · 0 评论 -
前序序列和中序序列还原树
题目:输入某二叉树前序中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复数字。例如 输入前序遍历{1,2,4,7,5,6,8} 和中序遍历{4,7,2,1,5,3,8,6}以下是我用c++的实现#include#include#include#include#includeusing namespace std;/** * Definition原创 2016-09-13 15:24:51 · 1110 阅读 · 0 评论 -
二维数组中的查找
在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的排列,请完成一个函数,输入这样的二维数组和一个整数,判断数组中是否有该整数,如果有返回true,没有返回false#include#include#includeusing namespace std;bool func(int nums[][10],int val,int row_len,int原创 2016-09-12 23:50:59 · 234 阅读 · 0 评论 -
二分查找的递归与非递归实现
假设有一个已经升序排好序的数组 nums,和一个数值val ,求val 是否在nums 中,如果存在则返回nums对应项的index ,否则返回-1;递归实现:#include#include#includeusing namespace std;int func(int val,int nums[],int begin,int end){ if(begin > end)原创 2016-09-12 21:44:38 · 208 阅读 · 0 评论 -
最长公共子串的动态规划解法及其优化
最长公共子串问题是:给定两个字符串str1和str2,返回两个字符串的最长公共子串(必须连续)举例: str1 = "abcd12" str2="ebcd32" 它们的最长公共子串是 "bcd"原始解法:设dp[i][j] 表示 以str1[i]和str2[j]最为公共子串的最后一个字符的情况下,公共子串最长能有多长。边界值: 如果 str1[i] = str2[0]则原创 2016-09-12 21:24:42 · 2816 阅读 · 0 评论 -
最长公共子序列
最长公共子序列问题是经典的动态规划问题:给定两个字符串str1和str2,返回两个字符串的最长公共子序列(不一定要连续)。举例: str1="a1b2c3d4" str2="a2b3c4e" 它们的最长公共子串是"abc"下面是c++代码实现#include#include#includeusing namespace std;int main(){ string st原创 2016-09-12 11:21:17 · 228 阅读 · 0 评论 -
260. Single Number III
Given an array of numbers nums, in which exactly two elements appear only once and all the other elements appear exactly twice. Find the two elements that appear only once.For example:Given nums =原创 2016-08-28 21:46:06 · 346 阅读 · 0 评论 -
LeetCode:Majority Element
LeetCode:Majority Element Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.You may assume that the array is non原创 2016-02-28 21:09:01 · 334 阅读 · 0 评论 -
235. Lowest Common Ancestor of a Binary Search Tree
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST.According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined betw原创 2016-03-13 16:26:36 · 233 阅读 · 0 评论 -
求不相邻的最大子数组和
问题1:给出一个数组,求出其中一个子集,使得子集中每个元素在原数组中两两都不相邻并使子集的和最大。解法:对任意一个元素ai ,有两种可能: 选ai ,单选了ai 就不能选ai-1 ;不选ai 那么ai-1 可以选也可以不选,主要根据ai-2的情况,因此动态规划是这样设计的。 ds[i] 表示选i,a0....ai的最大子数组和;ns[i]表示不选择 i,a0 ....ai 的最大子数组原创 2016-09-14 22:32:59 · 1801 阅读 · 0 评论 -
字符串的所有排列
输入一个字符串,打印出该字符串的所有排列,例如输入字符串abc ,则打印出a,b,c 所能排列出来的所有字符串 abc,acd,bac,bca,cab,cba。看似简单,其实不是很好做,应该把问题分解为子问题,我们把字符串看成两个部分,首字母自己作为一部分,后面的其他节点当做其它部分。可以看成两部走:求出所有课程出现在第一位的字符 a和后面的bc交换。第二步:固定第一个字符,求后面所有原创 2016-09-15 22:05:15 · 330 阅读 · 0 评论 -
归并排序的递归和非递归实现
归并排序是一个时间复杂度为O(nlogn)的算法,它可以由递归和非递归两种方式实现。递归:#includeusing namespace std;void combine(int *nums,int l,int m,int r){ // cout<<"combine"<<l<<" "<<m<<" "<<r<<endl; int len = r-l+1; int *t原创 2016-10-27 18:44:21 · 677 阅读 · 0 评论 -
蓄水池采样
问题描述:现实生活中有很多流式数据,在流式数据上采样可以抽象为:设几个中元素个数为N,并且N在不断的增大,如何在集合中采集K个样本,使得每个样本被采集到的概率相等(K/N)?蓄水池抽样法:算法思路是,先构造一个可以放K个元素的池子,池子中一开始放元素1~k。对于K+1~N 以K/N的概率决定是否被替换到池子中,遍历完所有元素后就可以得到一个等概率采样的K个元素,时间复杂度是O(原创 2016-10-27 17:31:18 · 531 阅读 · 0 评论 -
和为0的最长子串
已知一个数组只有 1和-1,求它和为0的最长子串长度。如 数组{-1,1,-1,-1,1,1,1,1,1} 和为0的最长子串为 {-1,1,-1,-1,1,1} 答案为6.之前一直想的是用动态规划,但是试了半天已知没有找到规律,后来看了看这篇文章:http://blog.csdn.net/fishermandong/article/details/52459059 顿时有了思路,下面是我实现转载 2016-09-07 22:47:28 · 1472 阅读 · 0 评论 -
快排的递归和非递归实现
快排的思路可以参考文章:http://developer.51cto.com/art/201403/430986.htm下面是我的递归和非递归实现。递归实现:int nums[100];void qsort(int left,int right){ if(left > right) return; int temp = nums[left]; int原创 2016-09-06 17:59:40 · 450 阅读 · 0 评论 -
数据流的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路:将数字放入两个堆,一个小堆 min_h 一个大堆max_h 大堆存放的是数组中最小的一半数据,小堆存放着数组中最大的一半数据。那么小堆的堆顶和大堆的堆顶就是构造中位数的关键数字: 如果大堆数原创 2016-09-18 02:29:42 · 243 阅读 · 0 评论 -
序列化二叉树
问题:实现两个函数,序列化一个二叉树。如果之前做过一个题目: 用一颗二叉树的中序和前序还原二叉树的话,最直观的解法是用把二叉树系列化成一个中序序列和一个前序序列,但是这个方法的缺陷是每个节点上的值不能相同,而且需要将整个序列都读入之后才能序列化,如果序列到一个流中,在从流中读出来还原二叉树效率将会比较低。其实序列化的时候只需要前序就可以了,只是遍历到每个NULL指针的时候对应的序列原创 2016-09-17 23:10:44 · 198 阅读 · 0 评论 -
正则表达式匹配
题目:请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配。1.如果pattern下一位是 *: 1.1 如果pattern 当前位和str 当原创 2016-09-17 15:35:49 · 259 阅读 · 0 评论 -
正整数的和
题目:输入一个正整数s打印出s的连续正整数合(至少含有两个数字)如15 ,由于1+2+3+4+5 = 4+5+6 = 7+8 = 15 所以结果是 {1,2,3,4,5}{4,5,6}{7,8}设两个数small big,求从small 到big连续正整数的和,如果和正好是目标值,则找到一个解,否则: 1.如果当前和大于目标值,则small ++ ,2.如果小于目标值则 big ++.原创 2016-09-16 21:32:23 · 672 阅读 · 0 评论 -
数组中的逆序对
问题:在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007 思路:最简单的思路是遍历数组,把当前数组元素和它后面的相比较,如果是逆序对,则计数器加1.时间复杂度是o(n^2),还有一个利用归并排序思想的方法时间复杂度是O(nlogn).下面是我用原创 2016-09-16 18:22:45 · 319 阅读 · 0 评论 -
把数组排成最小数
题目:输入一个正数数组,把数组中所有的数字拼接起来排成一个数,打印能排列出来的数的最小的那一个例如输入{3,32,321} 输出的应该是 321323这个题目的直观做法是先求出所有可能的排列,然后找到最小的那个。但是n个数字的排列有n!个,时间复杂度太高。同时应该注意,如果直接将输出类型定义为int类型的话,如果数组中的值比较大,加合完之后的值可能会超出int类型,因此最好用string原创 2016-09-16 12:42:12 · 357 阅读 · 0 评论 -
最长回文子串
描述输入一个字符串,求出其中最长的回文子串。子串的含义是:在原串连续出现的字符串片段。回文的含义是:正着看和倒着看是相同的,如abba和abbebba。在判断是要求忽略所有的标点和空格,且忽略大小写,但输出时按原样输出(首尾不要输出多余的字符串)。输入字符串长度大于等于1小于等于5000,且单独占一行(如果有多组答案,输出第一组)。输入输入一个测试数据n(1随后有n行,每行有一转载 2012-08-26 10:35:15 · 250 阅读 · 0 评论 -
poj 1088
深搜加剪枝#include#include#include#include#include#include#includeusing namespace std;int used[105][105];int R,C;int map[105][105];int ans=0;int dx[4]={0,0,1,-1};int dy[4]={1,-1,0,0};bool v原创 2012-08-08 11:06:57 · 251 阅读 · 0 评论 -
poj 1018
题目大意:一套通讯系统由一些设备组成,每种设备由不同的供应商供应,每个供应商供应的同种设备有各自的带宽(bandwidth)和价格(prices)。通讯系统的带宽(B)指的是组成该系统的所有设备的带宽的最小值,通讯系统的价格(P)指的是组成该系统的所有设备的价格之和。求最大的 (B / P)。思路分析:先枚举出所有供应商所供应的所有设备的最小带宽和最大的带宽,从最小带宽开始原创 2012-08-07 15:28:16 · 450 阅读 · 0 评论 -
poj 1125
floyd 算法的应用,一开始把三重循环的次序写错了,wa了好长一段时间!注意k的那层循环一定要放到外边#include#include#include#include#include#include#includeusing namespace std;int map[105][105];int main(){ int n,i,j,k,c,cid,clen;原创 2012-08-08 14:09:10 · 295 阅读 · 0 评论 -
按位dp的几个经典例题
最近在复习dp,dp最重要的是设定状态,和找到状态转移方程。问了一下大牛,问他设定状态是怎么设定的。大牛给出了以下三个词:–经验–分析–灵感dp在状态的设定,原来还真不是一个按照某个规定套路来设定的。但是我们可以从一些经典的dp题目中学习一些好的dp状态设定方法。从而能使我们更好的设计自己的状态。废话少说。01背包在M件物品取出若干件放在空间为W的背包里,每原创 2012-07-22 21:52:55 · 1414 阅读 · 0 评论 -
取小区间覆盖
问题阐述:一致给定一个总的区间。。然后再给定你一些小区间,让你用这些小区间去覆盖整个大区间。求最少取多少个这样的小区间。例题:zoj 3197地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3197有一本书总共有n页,你可以查询n次,而且它告诉你每一次可以查询的页码为ai 的页码原创 2012-07-19 22:46:30 · 446 阅读 · 0 评论 -
poj1050TotheMax
Given a two-dimensional array of positive and negative integers, a sub-rectangle is any contiguous sub-array of size 1*1 or greater located within the whole array. The sum of a rectangle is the sum转载 2012-07-18 10:55:06 · 259 阅读 · 0 评论 -
最大子字段和
很经典的一个动态规划题目。问题陈述给定n个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a+a+…+a[j]的子段和的最大值。当所给的整均为负数时定义子段和为0,依此定义,所求的最优值为Max{0,a+a+…+a[j]},1,状态方程,设定dp[j],表示 max{sum(a[i]+a[i+1]+.......+a[j])} 其中{ 1=那么原创 2012-07-18 09:46:02 · 818 阅读 · 0 评论 -
树状数组
树状数组复习。一个一维数组tree[]其中tree[i]表示[i-(i&(-i))+1,i]这个区间内a数组元素的和想求a[1]~a[15]的值?15=(1111)2tree[15]=sum[15,15]tree[14]=sum[13,14]tree[12]=sum[9,12]tree[8]=sum[1,8]原创 2012-07-08 08:27:08 · 315 阅读 · 0 评论 -
kmp算法
以前有学过,但是学的不精,现在决心彻彻底底的学一下。(参考文章:http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html,看了好几篇文章,感觉这篇还是比较好的吧,至少我是在这篇文章上看会的)这篇文章是借鉴别人的。大家想看原来的文章请看上边的地址。介绍kmp算法之前先先介绍一下BF算法。BF算法是普通的模式匹转载 2012-07-15 21:10:50 · 281 阅读 · 0 评论 -
线段树
好久没有写线段树了,最近比赛突然感觉到生疏了。今天特别写一些这个文章,温习一下。线段树就是把一个数列划分成一个树。 一般数这样分的。 构建一个结构体。结构体一般包括 left 区间段的左边界。 right 区间段的右边界。sum该段区间的值的和。max该段区间的最大值。min最小值。有时候要用到懒操作 就需要一个 lazy的变量。同城它的操作是: buildtre原创 2012-07-08 00:44:09 · 238 阅读 · 0 评论 -
克鲁斯卡尔总结
克鲁斯卡尔算法,是为了用来解决最小生成树问题的。同样功能的还有prim算法。但是由于克鲁斯卡尔的代码短小精悍,运算效率又高。所以经常被用来求最小生成树。下面我个人对克鲁斯卡尔算法进行下总结。算法的第一步是把所有的边权从小到大进行排列。,接着是对于每条边(u,v)(u,v分别是这条边的两个端点的标号).无非是会出现下边两种情况。 1:u,v在同一个连通分量中,那么链接u,v会产生环。所以不能原创 2012-07-07 20:13:05 · 784 阅读 · 0 评论