随笔分类 -  算法

摘要:前言目前我掌握的排序算法有冒泡排序、插入排序、堆排序、快速排序,这几个排序算法的过程和思想包括时间复杂度我都能快速的讲出个1234来,唯独对归并排序理解的不够深入,这里重新学习一下归并排序分治思想将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题的解建立原问题的解,归并排序完全遵循分治模式:分解:分解待排序的n个元素的序列成各具n/2个元素的两个子序列解决:使用归并排序递归地排序两个子序列合并:合并两个已排序的子序列以产生已排序的答案归并排序算法归并排序算法的关键操作是“合并”步骤中两个已排序序列的合并。我们通过调用一个辅助过程merge(A, p, 阅读全文
posted @ 2013-05-31 11:36 java程序员填空 阅读(152) 评论(0) 推荐(0)
摘要:前言我做八皇后的题目是利用了字符串全排列的思想,递归+回溯,需要再理解全排列作为前提,没理解的同学可以参考这个链接:http://blog.csdn.net/zinss26914/article/details/8939140题目题目描述: 会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题。 对于某个满足要求的8皇后的摆放方法,定义一个皇后串a与之对应,即a=b1b2...b8,其中bi为相应摆法中第i行皇后所处的列数。已经知道8皇后问题一共有92组解(即92个不同的皇后串). 阅读全文
posted @ 2013-05-18 23:12 java程序员填空 阅读(273) 评论(0) 推荐(0)
摘要:前言字符串的排列组合问题,困扰了我好久,递归的思想我今天一定要掌握,擦,话不多说,博客走起!问题输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba思路这是典型的递归求解问题,递归算法有四个特性:必须有可达到的终止条件,否则程序陷入死循环子问题在规模上比原问题小子问题可通过再次递归调用求解子问题的解应能组合成整个问题的解对于字符串的排列问题:如果能生成n-1个元素的全排列,就能生成n个元素的全排列。对于只有一个元素的集合,可以直接生成全排列。所以全排列的递归终止条件很明确,只有一个元素 阅读全文
posted @ 2013-05-17 15:15 java程序员填空 阅读(1941) 评论(0) 推荐(0)
摘要:历史这个问题是以弗拉维奥.约瑟夫斯命名的,它是1世纪的一名犹太历史学家。他在自己的日记中写道,他和他的40个战友被罗马军队包围在洞中。他们讨论是自杀还是被俘,最终决定自杀,并以抽签的方式决定谁杀掉谁。约瑟夫斯和另一个人是最后两个留下的人。约瑟夫斯说服那个人,他们向罗马军队投降,不再自杀。约瑟夫斯把他的存活归因于运气或天意,他不知道是哪一个约瑟夫环问题 N个人围成一圈顺序编号,从1号开始按1、2、3......顺序报数,报p者退出圈外,其余的人再从1、2、3开始报数,报p的人再退出圈外,以此类推。 请按退出顺序输出每个退出人的原序号算法思想这里介绍3种算法,两种直观,一种运用数学循环链表... 阅读全文
posted @ 2013-05-14 20:46 java程序员填空 阅读(466) 评论(0) 推荐(0)
摘要:动态规划算法基本概念动态规划的过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划基本思想和策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题阶段,按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决策保留那些有可能达到最优的局部解,丢弃其他局部解。依次解决各子问题,最后一个子问题就是初始问题的解由于动态规划解决的问题多数有重叠子问题这个特点,为减少重复计算,对每一个子问题只解一次,将其不同阶段的不同状态保存在一个二维数 阅读全文
posted @ 2013-03-22 23:59 java程序员填空 阅读(582) 评论(0) 推荐(0)
摘要:题目题目描述: 打印所有不超过n(n<256)的,其平方具有对称性质的数。 如11*11=121 输入: 无任何输入数据 输出: 输出具有题目要求的性质的数。如果输出数据不止一组,各组数据之间以回车隔开。 样例输入: 样例输出:思路比较数组的数据是否满足对称的性质对整数取余求每一位数AC代码(c)#include <stdio.h> #include <stdlib.h> int judgeSymmetry(int square); int main() { int i; for(i = 0; i < 256; i ++) { if(i == 0) { pr 阅读全文
posted @ 2013-02-27 15:02 java程序员填空 阅读(258) 评论(0) 推荐(0)
摘要:前言这道题耗时将近半个月,期间我复习了几处基础知识贪心算法堆排序哈夫曼树最后在参考我同学的博客,终于通过最小堆构建最小优先级队列ac了这道题!优先级队列参考链接:http://blog.csdn.net/zinss26914/article/details/8614022推荐一下我同学的博客,内容很好而且人也很犀利 :http://blog.csdn.net/cscmaker/article/details/8138870题目题目描述: 在一个果园里,小明已经将所有的水果打了下来,并按水果的不同种类分成了若干堆,小明决定把所有的水果合成一堆。每一次合并,小明可以把两堆水果合并到一起,消... 阅读全文
posted @ 2013-02-26 07:36 java程序员填空 阅读(278) 评论(0) 推荐(0)
摘要:堆排序概述堆排序定义n个关键字序列k(1), k(2), ..., k(n)称为堆,当且仅当该序列满足如下性质(简称为堆性质)k(i) <= k(2i) && k(i) <= k(2i+1)k(i) >= k(2i) && k(i) >= k(2i+1)若将此序列所存储的向量R[1..n]看做是一颗完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若存在)结点的关键字。大根堆和小根堆根结点(亦称堆顶)的关键字是堆里所有结点关键字中最小者的堆称为小根堆根节点(亦称堆顶)的关键 阅读全文
posted @ 2013-02-25 23:28 java程序员填空 阅读(196) 评论(0) 推荐(0)
摘要:前言由于是周末,这道九度贪心算法的题目进行了整整两天的时间,挺不错的,这里分析记录一下题目题目描述: With highways available, driving a car from Hangzhou to any other city is easy. But since the tank capacity of a car is limited, we have to find gas stations on the way from time to time. Different gas station may give different price. You are asked 阅读全文
posted @ 2013-02-24 18:16 java程序员填空 阅读(195) 评论(0) 推荐(0)
摘要:前言学习贪心算法的时候复习了一下哈夫曼树的构造,这里记录一下,参考链接:http://blog.csdn.net/zinss26914/article/details/8461596主要是记录一道九度的哈夫曼树的题目题目题目描述: 哈夫曼树,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成哈夫曼树,根据哈夫曼树的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。 输入: 输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2<=n<=1000)。 输出: 输出权值。 样例输入: 5 1 2 2 5 9 样例输 阅读全文
posted @ 2013-02-17 23:46 java程序员填空 阅读(146) 评论(0) 推荐(0)
摘要:引言事先声明,我学习贪心算法之前只是理解了动态规划的装配线调度问题,其它的动态规划基础基本为零,我感觉很多问题都可以用贪心来解决,因此在这里总结一下我学习贪心算法的过程,很多东西是靠做题和死记硬背理解的,唉,为自己的智商着急啊!我采用通过acm题的方式来分析一下我理解的贪心算法!例题题目描述: 又到毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。 输入: 第一行n,有n个招聘会,接下来n行每行两个整数表示起止时间,由从招聘会第一天0点开始的小时数表示。 n <= 1000 。 输出: 最多参加的招聘会 阅读全文
posted @ 2013-02-13 15:25 java程序员填空 阅读(3153) 评论(0) 推荐(0)
摘要:前言闲来无事,又ac了一道水题题目题目描述: “臭味相投”——这是我们描述朋友时喜欢用的词汇。两个人是朋友通常意味着他们存在着许多共同的兴趣。然而作为一个宅男,你发现自己与他人相互了解的机会并不太多。幸运的是,你意外得到了一份北大图书馆的图书借阅记录,于是你挑灯熬夜地编程,想从中发现潜在的朋友。 首先你对借阅记录进行了一番整理,把N个读者依次编号为1,2,…,N,把M本书依次编号为1,2,…,M。同时,按照“臭味相投”的原则,和你喜欢读同一本书的人,就是你的潜在朋友。你现在的任务是从这份借阅记录中计算出每个人有几个潜在朋友。 输入: 每个案例第一行两个整数N,M,2 <... 阅读全文
posted @ 2013-02-07 10:41 java程序员填空 阅读(328) 评论(0) 推荐(0)
摘要:前言比较简单的一道acm题,用一个bool类型数组求解即可!春节在家无聊写篇博客记录一下自己的acm过程吧,反正也没闲着,督促一下自己假期也是需要努力的!题目题目描述: 有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,...,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数 阅读全文
posted @ 2013-02-07 10:00 java程序员填空 阅读(126) 评论(0) 推荐(0)
摘要:前言这篇博客主要是参考网上的一个帖子,然后自己推断验证,在原创和转载之间犹豫了很久,鉴于我确实做了很多推导工作,姑且就认为我是原创吧!简介星期制度星期制度是一种古老的制度。据说因为《圣经×创世纪》中规定上帝用六天的时间创世纪,第七天休息,所以人们也就以七天为一个周期来安排自己的工作和生活,而星期天是休息日。求星期几的思路原点差值取余法首先,先要知道在想算的日子之前的一个确定的日子是星期几,拿这一天作为推算的标准,也就是相当于一个计算的“原点”。其次,知道想算的日子和这个确定的日子之间相差了多少天,用7除以这个日期的差值,余数就是想算的日子的星期在确定的日子的星期之后的多少天。如果余数 阅读全文
posted @ 2013-01-30 11:08 java程序员填空 阅读(586) 评论(0) 推荐(0)
摘要:前言中午在微薄上看道了九度的这道题,把题目先贴出来,分享一下我的解题思路吧题目描述: 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 输入: 每个测试案例包括两行: 第一行包含一个整数n,表示数组大小。2<=n <= 10^6。 第二行包含n个整数,表示数组元素,元素均为int。 输出: 对应每个测试案例,输出数组中只出现一次的两个数。输出的数字从小到大的顺序。 样例输入: 8 2 4 3 6 3 2 5 5 样例输出: 4 6排序方法思路最容易想的方法当然也是时间复杂度最高的算法,我开始分两步完成:快速排序,将数按照从小到大的顺序排序 阅读全文
posted @ 2013-01-29 14:59 java程序员填空 阅读(246) 评论(0) 推荐(0)