【问题标题】:What's wrong with my solution for Max Counters codility challenge我的 Max Counters codility 挑战的解决方案有什么问题
【发布时间】:2021-02-26 03:05:10
【问题描述】:

我正在尝试解决最大计数器编码问题here。在这个问题中:

给你 N 个计数器,初始设置为 0,你有两种可能的操作:

(i) increase(X) - 计数器 X 加 1; (ii)max counter - 所有计数器都设置为任何计数器的最大值。

给出了一个由 M 个整数组成的非空数组 A。这个数组代表连续的操作:

(i) 如果 A[K] = X,使得 1 ≤ X ≤ N,那么操作 K 是增加(X), (ii) 如果 A[K] = N + 1 那么操作 K 是最大计数器。

目标是计算所有操作后每个计数器的值。

以下是我的解决方案:

// you can also use imports, for example:
import java.util.*;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int[] solution(int N, int[] A) {
        // write your code in Java SE 8
        int[] counters = new int[N];
        int maxVal = 0;
        int MAX_COUNTER = N+1;

        for(int i=0;i<A.length;i++) {
            if(A[i] == MAX_COUNTER) {
                Arrays.fill(counters, maxVal);
            } else {
                counters[A[i]-1]++;
                maxVal = counters[A[i]-1];
            }
        }
        return counters;
    }

Codility 报告显示该解决方案为 small_random1small_random2 产生了不正确的输出。

【问题讨论】:

  • 在这篇文章中解释您的代码,而不是引用外部链接,显示预期返回的内容、当前执行的内容以及到目前为止您尝试过的内容。
  • 您应该始终将实际问题陈述或至少提及您在帖子中实际尝试解决的问题。您共享的外部链接在登录该站点之前并未显示实际问题。
  • 注意:这个问题的一个好的解决方案需要线性时间。你的需要二次时间。

标签: java arrays algorithm


【解决方案1】:

您更新maxVal 的方式有误。例如,给定整数 N = 5 和数组 A 使得:

A[0] = 3
A[1] = 4
A[2] = 4
A[3] = 1

如果你运行你的代码,每次连续操作后countersmaxVal的值将是:

(0, 0, 1, 0, 0) maxVal = 1
(0, 0, 1, 1, 0) maxVal = 1
(0, 0, 1, 2, 0) maxVal = 2
(1, 0, 1, 2, 0) maxVal = 1

显然,在A[3] 之后,maxVal 仍将是2 而不是1。在这里,我通过正确更新maxVal 解决了这个问题:

// you can also use imports, for example:
import java.util.*;
import static java.lang.Math.max;

// you can write to stdout for debugging purposes, e.g.
// System.out.println("this is a debug message");

class Solution {
    public int[] solution(int N, int[] A) {
        // write your code in Java SE 8
        int[] counters = new int[N];
        int maxVal = 0;
        int MAX_COUNTER = N+1;

        for(int i=0;i<A.length;i++) {
            if(A[i] == MAX_COUNTER) {
                Arrays.fill(counters, maxVal);
            } else {
                counters[A[i]-1]++;
                maxVal = max(maxVal, counters[A[i]-1]);
            }
        }
        return counters;
    }
}

但是,使用此解决方案,您将无法通过此测试,因为它将获得TIMEOUT ERROR 用于大输入。要通过这一点,您需要使用高效的数据结构(例如,在更新期间具有延迟传播的分段树)。

【讨论】:

    最近更新 更多