题目是这样的,给定一个整数序列,比如[1, 2, -1, 8, -9],要求找出一个子序列,其所有数字的和为0,比如子序列[2, -1, 8, -9],并输出子序列在主序列中的位置,比如[2, -1, 8, 9]在主序列[1, 2, -1, 8, -9]中的位置为[1, 4]。
以下是我想到的一个方法,暂时不清楚怎么计算这个的时间复杂度。原理是这样的,对于序列[1, 2, -1, 8, -9],设置一个和序列。初始为[0, 0, 0, 0, 0],长度和输入序列一致。
顺序读取输入序列,第一次遇到1,尝试在和序列的[0, 0]区别内增加1,结果为[1, 0, 0, 0, 0]。为什么这么做呢,这样,输入序列区间[0, 0]的和就计算出来了。
第二次遇到2, 尝试在和序列[0, 1]区间内增加2,结果为[3, 2, 0, 0, 0],这样,输入序列区间[0, 1], [1, 1]的和就计算出来了。没有发现0和序列。
接下来依此类推,发现[1, 4]区间的和为0,输出为(1, 4)。代码如下(python):
#!/usr/bin/env python import sys def find_zero_sum_seq(seq): sums = [0] * len(seq) for i, x in enumerate(seq): for j in range(0, i + 1): sums[j] += seq[i] if sums[j] == 0: return (j, i) print 'debug', sums if __name__ == '__main__': seq = [int(x) for x in sys.argv[1:]] print find_zero_sum_seq(seq) or 'not found'
执行和输出,debug为和序列的内容。
$ python zero-sum.py 4 1 1 1 1 2 4 -1 -6 10 debug [4, 0, 0, 0, 0, 0, 0, 0, 0, 0] debug [5, 1, 0, 0, 0, 0, 0, 0, 0, 0] debug [6, 2, 1, 0, 0, 0, 0, 0, 0, 0] debug [7, 3, 2, 1, 0, 0, 0, 0, 0, 0] debug [8, 4, 3, 2, 1, 0, 0, 0, 0, 0] debug [10, 6, 5, 4, 3, 2, 0, 0, 0, 0] debug [14, 10, 9, 8, 7, 6, 4, 0, 0, 0] debug [13, 9, 8, 7, 6, 5, 3, -1, 0, 0] (4, 8) $ python zero-sum.py 1 2 -1 8 -9 debug [1, 0, 0, 0, 0] debug [3, 2, 0, 0, 0] debug [2, 1, -1, 0, 0] debug [10, 9, 7, 8, 0] (1, 4)
One response to “zero sum subsequence problem solution 1”
连续子列的话先求出a[0], a[0] + a[1], …, a[0] + … + a[k], …, a[0] + … + a[n-1]这n个数,然后排序看有没有重复元素出现,O(nlgn)时间应该是最优的