加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 解密系列 – 找到连续整数序列的数量,使得它们的和为零

发布时间:2020-12-13 21:51:35 所属栏目:PHP教程 来源:网络整理
导读:以下是编程任务. 您将获得一系列N个整数.任务是找到连续的整数序列的数量,使得它们的和为零. 例如,如果序列是: 2,-2,6,-6,8 有3个这样的序列: ’2,-2′ ’6,-6′ ’2,-6′ 我已经有了用PHP编写的以下程序,它读取STDIN的输入(第一行包含后面的整数数.) ?php
以下是编程任务.

您将获得一系列N个整数.任务是找到连续的整数序列的数量,使得它们的和为零.

例如,如果序列是:
2,-2,6,-6,8
有3个这样的序列:

>’2,-2′
>’6,-6′
>’2,-6′

我已经有了用PHP编写的以下程序,它读取STDIN的输入(第一行包含后面的整数数.)

<?php

$n = fgets(STDIN) * 1;
$seq = array();

for ($i = 0; $i < $n; $i++) {
    $seq[] = fgets( STDIN ) * 1;
}

$count = 0;
for( $i = 0; $i < $n; $i++)
{
    $number = 0;
    for( $j = $i; $j < $n; $j++)
    {
        $number += $seq[$j];
        if( $number == 0 )
            $count++;
    }
}

echo 'count: ' . $count . PHP_EOL;

输入示例

5
2
-2
6
-6
8

这适用于较小的序列,但其效率为O(n ^ 2).

对于包含100.000个整数的序列,什么算法适合 – 可能有O(n)效率?

解决方法

我们假设您的数据存储在一个数组中,并让它成为arr.
创建一个数组总和,这样:

sum[i] = arr[0] + arr[1] + ... + arr[i]

并且,另外一个开头的单个条目为0(处理从开头开始并总和为零的子数组)

现在,很容易看出,对于每两个索引i,j使得i element distinctness problem)中完成,但可以使用排序然后迭代和计数在O(nlogn)中求解,这对于100,000个条目仍然非常快. 和sum>

注意,如果例如在数组和中有数字k的n个重复,则存在为这些重复生成的Choose(n,2)= n(n-1)/ 2个连续子序列.

例:

arr = [1,2,5,-5,8]
sum = [0,1,3,12,9]
sorted(sum) = [0,9,12]

有3个重复的1和2个重复的6,所以你总共:

Choose(3,2) + Choose(2,2) = 3*2/2 + 2/2 = 3+1 = 4

这确实匹配4个子序列:

2,-2
2,-5
6,-6
5,-5

(1)没有散列,然后你会衰减到O(n ^ 2)最坏情况,但是会受益于O(n)平均情况,代价是O(n)额外空间.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读