【问题标题】:Array Manipulation HackerRank in PHP [closed]PHP中的数组操作HackerRank [关闭]
【发布时间】:2021-08-06 13:45:23
【问题描述】:

我尝试在 Hacker Rank 中解决 this 练习:

从 1 索引的零数组和操作列表开始,对于 每个操作为两个给定之间的每个数组元素添加一个值 指数,包括在内。完成所有操作后,返回 数组中的最大值。

示例:

n = 10
queries = [[1,5,3],[4,8,7],[6,9,1]]

查询解释如下:

a b k
1 5 3
4 8 7
6 9 1

在索引ab 之间添加k 的值:

index->  1 2 3  4  5 6 7 8 9 10
        [0,0,0, 0, 0,0,0,0,0, 0]
        [3,3,3, 3, 3,0,0,0,0, 0]
        [3,3,3,10,10,7,7,7,0, 0]
        [3,3,3,10,10,8,8,8,1, 0]

最大值是在所有操作都执行完之后。
功能说明

在下面的编辑器中完成函数arrayManipulation。

arrayManipulation 有以下参数:

int n - 数组中的元素个数 int queries[q][3] - 一个二维查询数组,其中每个 queries[i] 包含三个整数 a、b 和 k。 返回

int - 结果数组中的最大值 输入格式

第一行包含两个以空格分隔的整数和 ,数组的大小和操作数。 接下来的每一行都包含三个以空格分隔的整数 、 、 、左索引、右索引和求和。
我使用了这段代码:

function arrayManipulation($n, $queries) {
    for($i = 1; $i <= $n; $i++){
        $a[$i] = 0;
    }
    foreach($queries as $index => $query){   
            $e = $query[0];
            $p = $query[1];
            $value = $query[2];
            for($b = $e; $b <= $p; $b++){
                $a[$b] += $value;
            }
    }
    return max($a);
}

除了最大的测试用例(运行时错误)之外的所有工作,我该如何改进?
看起来很简单的任务,但我无法解决。

我使用的逻辑:

  • 创建一个array,索引 = $n(数组大小)
  • 开始到foreach $queries 并创建一个 tmp 变量:
    • $e 最小范围

    • $p 最大范围

    • $value求和所需的值

  • 使用 for-loop 将总和值放入数组 $a 基数中以从最小值和最大值开始索引
  • 返回max of $a

【问题讨论】:

  • 您的第二个链接以 401(未经授权)错误告终。您能否在问题本身中包含相关信息而不是链接到外部资源?
  • 是一个最大的测试用例,比如 20000 行,我不能在这里添加,因为会超过帖子的最大大小。
  • 请分享更多细节。什么是“这个问题”?什么样的输入会破坏算法?您尝试过什么来解决问题?
  • 运行时错误是问题
  • 由于您的代码没有打印任何与“运行时错误”相关的内容,您需要分享更多详细信息

标签: php arrays


【解决方案1】:

我在 O(m * log(m)) 中找到了解决这个问题的方法。它通过了所有测试用例。

看看我的解决方案:

function arrayManipulation($n, $queries)
{
    $arr = [];

    foreach ($queries as $query) {
        $start = $query[0] - 1;
        $end = $query[1];
        $value = $query[2];

        $arr[$start] = ($arr[$start] ?? 0) + $value;

        if ($end < $n) {
            $arr[$end] = ($arr[$end] ?? 0) - $value;
        }
    }

    ksort($arr);

    $answer = 0;
    $currentSum = 0;

    foreach ($arr as $change) {
        $currentSum += $change;
        $answer = max($answer, $currentSum);
    }

    return $answer;
}
  • 首先我们应该避免使用大小为n的数组。
  • 然后我们构造值更改数组$arr,而不是实际值(就像您所做的那样)。
  • 最后,我们只需遍历生成的数组并模拟每次迭代的真实值。当然,记住最大值。这将是我们的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-08
    • 1970-01-01
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多