拟人算法系列文章,以容易理解的方式描述算法,点赞收藏不迷路
和为 s 的连续正数序列
def get_continuous_sequence(target: int) -> list[list[int]]:
i, j = 1, 2
mid = target / 2
cur_sum = i + j
result = []
while i < mid:
if cur_sum > target:
cur_sum -= i
i += 1
elif cur_sum < target:
j += 1
cur_sum += j
else:
result.append([x for x in range(i, j+1)])
cur_sum -= i
i += 1
j += 1
cur_sum += j
return result
if __name__ == '__main__':
target = 15
print(get_continuous_sequence(target)) # [[1, 2, 3, 4, 5], [4, 5, 6], [7, 8]]
好比走的一快一慢的两个人,先初始慢的人在第一个位置,快的人在第二个位置,于是目前累加值为1+2=3,然后只要走的慢的人没有超过一半(如果慢的人都超过一半,两人之间的累加和肯定超过目标值),那么
- 如果累加和大于目标值,于是减去走得慢的人的值,并让走的慢的人往前走一步,
- 如果累加和小于目标值,于是让走得快的人往前走一步,并加上走的快的人的值
- 如果累加和等于目标值,于是让两个人都往前走一步,同时也相应改变当前和