一道穷举法算法题

题目是在topcoder看到的,但是不小心关了,不记得是题号了。

题目如下:

给定一组数,求哪这组数字能够组成的最长连续子序列,但其中比较特殊的是0可以代替任何数

注意: 其中的数字可以重复

限制条件:

数字的返回是从 0 ~ 1000000 包含0, 1000000

这组数的数量不超过 50

1)  0, 6, 5, 10, 3, 0, 11

返回    5

解释: 

如果把两个0,一个当做4, 一个当做7

那么可以得到最长连续子序列是 3, 4,  5,  6,  7

如果把两个0, 一个当做2, 一个当做4

那么可以得到最长连续子序列是 2, 3, 4, 5, 6


2) 100,100,100,101,100,99,97,103

返回    3

解释: 

最长连续子序列是 99, 100, 101


3) 0,  0,  0,  1 , 2, 6, 8, 1000

返回    6

解释: 

最长连续子序列是 1, 2,  3, 4,  5,  6


解法:

思路: 先将这组数排序,然后在不连续的数字中插入0,  然后从这组数的头部开始遍历尝试找到最长的连续子序列

# -*- coding:utf-8 -*-
class CardStraights(object):
    def longestStraight(self, tp):
        res = 0
        count = 0
        ll = sorted(tp)
        for i in range(len(ll)):
            if ll[i] == 0:
                count =  count + 1
        #print count
        
        new_list = []
        last = None
        for i in range(len(ll)):
            if ll[i]!=0:
                if ll[i]!= last:
                    new_list.append(ll[i])
                    if i < len(ll) -1 and ll[i + 1] != ll[i] + 1:
			# 插入0的个数
                        zero_count = min(50, ll[i + 1] - ll[i] - 1)
                        for j in range(zero_count):
                            new_list.append(0)
            else:
                new_list.append(ll[i])
                
            last = ll[i]    
                
        for i in range(count):
            new_list.append(0)  
        
        print new_list
        ll = new_list
        length = len(ll)
        for i in range(length):
            curr = 0
            curr_zero = 0
            for j in range(i, length):
                curr = curr + 1
                if ll[j] == 0:
                    curr_zero = curr_zero + 1
            
                if curr_zero > count:
                    curr = curr -1 
                    break
            if curr > res:
                res = curr
        
        return res  
        
def min(a,b):
    if a<b:
        return a
    else:
        return b

c = CardStraights()
print c.longestStraight((0,6,5,10,3,0,11))
print c.longestStraight((100,100,100,101,100,99,97,103))
print c.longestStraight((0,0,0,1,2,6,8,1000,1005,1010))




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值