约瑟夫环是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围.从编号为k的人开始报数(从1开始报数),数到m的那个人出列:他的下一个人又从1开始报数,数到m的那个人又出列:依此规律重复下去,直到圆桌周围的人全部出列. 首先从编程的角度声明一下上面描述中的一点,就n,k,m这些都是下标从1开始的.而在实际编程中,我们一般将下标从0开始.所以这一点要注意一下. 第一种方法:使用队列. 这种解法直观,简单.首先你要明白队列这种数据结构,是一种先进先出的线性结构,如同生…
在上一篇文章 小小c#算法题 - 10 - 求树的深度中,用到了树的数据结构,树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.但在那篇文章中,只是简单地把结点组合到了一块. 这次,我们来简单定义一棵二叉树的数据结构,并实现其先序(根)遍历.中序(根)遍历.后序(根)遍历算法. 下面先来看一下先序遍历,中序遍历,后序遍历的定义: 先序遍历: 若二叉树为空,则空操作,否则 (1)访问根结点: (2)先序遍历左子树: (3)先序遍历右子树: 中序遍历:…
 Joseph  The Joseph's problem is notoriously known. For those who are not familiar with the original problem: from among n people, numbered 1, 2, ..., n, standing in circle every mth is going to be executed and only the life of the last remaining per…
题目链接: POJ  1012: id=1012">http://poj.org/problem?id=1012 HDU 1443: pid=1443">http://acm.hdu.edu.cn/showproblem.php? pid=1443 约瑟夫环(百度百科): fr=aladdin" target="_blank">http://baike.baidu.com/view/717633.htm?fr=aladdin Descri…
题目 题意:一共有2k个人,分别为k个好人和k个坏人,现在我们需要每隔m个人把坏人挑出来,但是条件是最后一个坏人挑出来前不能有好人被挑出来..问最小的m是多少 约瑟夫环问题,通常解决这类问题时我们把编号设为从0~n-1. 求出每一轮出列的人:start = (start + m - 1) % n 模拟过程如下(以六个人,第五为例): 1 2 3 4 5 6 易发现start1 = (0 + 5 - 1)% 6 = 4, 即a[4] = 5这个人出列 #include <stdio.h> #in…
基数排序和前几篇博客中写到的排序方法完全不同.前面几种排序方法主要是通过关键字间的比较和移动记录这两种操作来实现排序的,而实现基数排序不需要进行记录项间的比较.而是把关键字按一定规则分布在不同的区域,然后再重新整合,使之有序,属于分布排序的一种. 基数排序是一种借助多关键字排序的思想对单逻辑关键字进行排序的方法.基数排序是借助“分配”和“收集”两种操作对单逻辑关键字进行排序的一种内部排序方法. 下面举一个书上的例子,扑克牌的排序.对于扑克牌,在比较任意两张牌的大小时(暂不考虑大王和小王),首先要…
1.来源LeetCode91 一条包含字母 A-Z 的消息通过以下方式进行了编码: 'A' -> 1 'B' -> 2 ... 'Z' -> 26 给定一个只包含数字的非空字符串,请计算解码方法的总数. 示例 1: 输入: "12" 输出: 2 解释: 它可以解码为 "AB"(1 2)或者 "L"(12). 示例 2: 输入: "226" 输出: 3 解释: 它可以解码为 "BZ" (2…
树型结构是一类重要的非线性数据结构,树是以分支关系定义的层次结构,是n(n>=0)个结点的有限集.关于树的基本概念不再作过多陈述,相信大家都有了解,如有遗忘,可翻书或去其他网页浏览以温习. 树中结点的最大层次数称为树的深度(Depth)或高度. 本文中以二叉树为例来讲述求树的深度的算法. 在算法开始之前,我们要有数据,即一棵树,树又是结点的集合.所以,应该先定义结点的数据结构(结点的基本属性和操作),然后再定义树的数据结构(树的基本属性和操作).本文的重点不是讲如何去创建树的数据结构,所以一切从…
“归并”的含义是将两个或两个以上的有序序列组合成一个新的有序序列.这个“归并”可以在O(n+m)的数量级上实现,但这同时也需要O(n+m)的空间复杂度.具体为:首先分配一个新的长度为n+m的空序列,然后对于序列1(长度为n),序列2(长度为m),从每个序列的第一个元素开始比较,将较小的元素放入新的序列,然后较小元素原来所在序列的下标加1,这样一直比较下去,最终把这两个序列有序的放入新的序列中.在2-路归并排序中,这里的序列1,序列2表现为待排序列的两个相邻子序列. 2-路归并排序的定义:假设初始…
在讨论堆排序之前,我们先来讨论一下另外一种排序算法——插入排序.插入排序的逻辑相当简单,先遍历一遍数组找到最小值,然后将这个最小值跟第一个元素交换.然后遍历第一个元素之后的n-1个元素,得到这n-1个元素中的最小值,即整个序列的次小值,将其跟第二个元素交换.接下来对后n-2个元素进行相同的操作,直到得到有序序列. 很显然,插入排序的时间复杂度是O(n2).在n个关键字中选出最小值,至少进行n-1次比较,然而,继续在剩余的n-1个关键字中选择次小值就并非一定要进行n-2次比较,若能利用前n-1次比…