设一数组N个数,确定其中第K个最大值,这是一个选择问题,解决办法很多:所谓“第(前)k大数问题”指的是在长度为n(n>=k)的乱序数组中S找出从大到小顺序的第(前)k个数的问题。解法1:我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总的时间复杂度为O(n*logn+k)。解法2:利用选择排序或交互排序,K次选择后即可得到第k大的数。总的时间复杂度为O(n*k)解法3:利用快速排序的思想,从数组S中随机找出一个元素X,把数组分为两部分Sa和Sb。Sa中的元素大于等于X,Sb中元素小于X。这时有两种情况:1.Sa中元素的个数小于k,则Sb中的第k-|Sa|个元素即为第k大数;2 Read More
posted @ 2013-03-21 11:50 upon77 Views(294) Comments(0) Diggs(0)
编程之美中的“寻找发帖水王”描述的是这么一个问题,有一个ID列表,其中有一个ID(水王的ID)出现的次数超过了一半,请找出这个ID。书中的思路是每次从列表中删除两个不同的ID,不影响“水王的ID在剩余ID中仍然超过一半”这一事实,因此每次删除两个不同的ID,直到剩下的所有ID都相同,那么剩下的就是水王的ID。具体编程的时候,使用一个candidate记录当前猜测的水王ID,一个count记录其累计次数,然后遍历整个ID列表,对于当前所考查的ID,如果和candidate相同,那么count++,如果不同,那么count--,这个“count--;”的动作就是“删除两个不同的ID”在程序中的体现 Read More
posted @ 2013-03-21 11:44 upon77 Views(126) Comments(0) Diggs(0)
定义S为石头摆放的一个格局,格局标识石头目前的连续区段的状态以及每个连续区段的石头数目。初始状态下,N块石头连成一体,可以表示为{N},即N个连续的石头。取走第二块石头之后格局变成{1, N-2},即两段数目分别为1和N-2的连续的石头。这样,问题可以描述为:对于初始格局S_0={N},甲需要找到制胜的策略。甲取完石头将格局变为S_1后,无论乙怎么取(记乙取完后的格局为S_2),甲总能在当前格局S_2中找到制胜的策略。问题转化成S_2上的小一个规模的问题。需要注意,S_2实际应为从S_1中任意取一次石头后可能形成的众多格局中的一个,只要其中任意一个S_2能让甲无法找到制胜策略,那么甲这次从S_ Read More
posted @ 2013-03-21 11:34 upon77 Views(208) Comments(0) Diggs(0)
解法1枚举:省略解法2cost:i+1层: Y+N1+N2-N3 i层: Y i-1层 : Y-N1+N2+N3可知cost(i-1)>cost(i)的条件:N1<N2+N3,两边同时加N2得到,N1+N2<N2*2+N3 (1) cost(i+1)<cost(i)的条件:N1+N2<N3(2) cost(i+1) <cost(i-1)的条件:N1<N3即N1+N2<N2+N3(3)初始条件下:N1=0,N2<N3,(1)(2)(3)都满足,cost(i-1)>cost(i)>cost(i+1)之后随着电梯停留层数增加,N1增加 Read More
posted @ 2013-03-21 11:32 upon77 Views(148) Comments(0) Diggs(0)