当前位置: 首页 > 知识库问答 >
问题:

单调对-协调

洪季萌
2023-03-14

我刚刚在Codity遇到了一个任务,我找不到目标O(n)效率的解决方案;我的解决方案运行为O(n2)。如果有人能给我一个提示,告诉我如何让它运行得更快,我会非常高兴。这是任务。

给出了一个由N个整数组成的非空零索引数组A。

monotonic_pair是一对整数 (P, Q),使得 0 ≤ P ≤ Q

目标是找到指数相距最远的monotonic_pair。更准确地说,我们应该最大化Q-P值。只找到距离就足够了。

例如,考虑数组A,如下所示:

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

有十一个单调_对:(0,0)、(0,2)、(1,1)、(1,2)、(1,3)、(1,4)、(2,2)、(3,3)、(3,4)、(4,4)、(5,5)。最大的距离是3,在对(1,4)中。

写一个函数:

class Solution { public int Solution(int[]A);}

给定N个整数的非空零索引数组A,返回任何monotonic_pairs内的最大距离。

例如,给定:

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

如上所述,函数应该返回3。

假设:

N 是 [1..300,000] 范围内的整数;数组 A 的每个元素都是范围 [−1,000,000,000..1,000,000,000] 内的整数。复杂性:

预期最坏情况时间复杂度为O(N);预期最坏情况空间复杂度为O(N),超出输入存储(不包括输入参数所需的存储)。可以修改输入数组的元素。

我的第一个想法解决方案(在O(n2)中运行):

    public static int solution(int[] A) {
    int max = 0;
    for(int i=0; i<A.length-1; i++) {
        for(int j=i+1; j<A.length; j++) {
            if(A[j] >= A[i] &&
                    (j - i) >= max) {
                max = j - i;
            }
        }
    }
    return max;
}

共有3个答案

卞经业
2023-03-14

还有另一种算法,基于查找对之间的最大距离(抱歉,PHP),它也具有O(n2)复杂度:

function solution($a) {

    $length = count($a);

    for($max = $length-1; $max > 0; $max-- ) {
        for($i = 0; $i < $length - $max ; $i++) {
            if ($a[$i] <= $a[$i+$max]) {
                return $max;
            }    
        }
    }

    return 0;
}
程景胜
2023-03-14

创建一个临时数组,其中包含按降序排列的最大值:

int[] top = new int[A.length];
int max = -Integer.MAX_VALUE;
for (int i=A.length-1; i>=0; i--) {
    if (A[i] > max) max = A[i];
    top[i] = max;
}

所以你可以用二分搜索法快速找到它们:

int find(int[] t, int min) {
    int s = 0;
    int e = t.length-1;

    if (t[e] >= min) return e;

    while (true) {
        int x = (s+e) / 2;
        if (x == t.length-1) return t.length-1;
        if (t[x] >= min && t[x+1] < min) return x;

        if (t[x] < min) e = x;
        else s = x;
    }
}

你得到了一个解决方案:

int best = 0;
for (int i=0; i<A.length; i++) {
    int c = find(top, A[i]) - i;
    if (c > best) best = c;
    if (best >= A.length-i) return best;
}

return best;
丁经略
2023-03-14

马辛勒的比n^2的好,但仍在伦敦运行。您可以通过不每次都进行登录查询来进行优化。相反,同时向前迭代max数组和输入A[]数组,以保证线性时间。

int[] top = new int[A.length];
int max = -Integer.MAX_VALUE;
for (int i=A.length-1; i>=0; i--) {
    if (A[i] > max) max = A[i];
    top[i] = max;
}

int best = 0;
int curMaxIndex = 0;
for (int i=0; i<A.length; i++) {
    while(curMaxIndex < top.length && top[curMaxIndex] >= A[i])
        curMaxIndex++;
    if((curMaxIndex - 1 - i) > best)
        best = curMaxIndex - 1 - i
}

return best; 
 类似资料:
  • VS Code 把 NodeJS 和 Mono 的调试功能抽象出来了,大家就可以通过自定义 Debugger Adapter 和 VSCode Debug Protocol 从而实现自己的调试器。现在 VS Code 插件中心 里,Go、PHP、Python、Ruby 的 Debugger 做的都比较成熟了 参见 https://code.visualstudio.com/Docs/extensi

  • 使用Swoole协程时,可以使用下面的方法进行调试 GDB调试 进入 gdb gdb php test.php gdbinit (gdb) source /path/to/swoole-src/gdbinit 设置断点 例如 co::sleep 函数 (gdb) b zim_swoole_coroutine_util_sleep 打印当前进程的所有协程和状态 (gdb) co_list coro

  • 在底层,Chrome 开发者工具是用 HTML,JavaScript 和 CSS 写的 Web 应用程序。在 Javascript 运行时,它提供一个特殊的绑定,这允许它与 chrome 网页进行交互并且容许装载它们。交互协议包括被发送到页面的命令,和该页面生成的事件。尽管 Chrome 开发者工具是该协议的主要客户,其中包括远程调试(remote debugging),但有很多办法可以让第三方能

  • 考虑一个编写为AWS Lambda函数的聊天机器人。它通过来自第三方服务的HTTP请求被调用,第三方服务是它集成的聊天服务。现在,第三方API有点…古怪。它的主要问题是:它需要一个身份验证令牌才能与之交互,但任何时候只能存在一个令牌。它的工作方式是: Bot创建一个带有一堆秘密信息的请求,并返回一个令牌作为响应。 然后,Bot向发出请求,并带有 请求会重置任何以前的令牌,并使持有令牌的所有其他客户

  • 问题内容: 这类似于在asyncio.Protocol.data_received中调用协程,但是我认为这值得一个新的问题。 我有一个像这样的简单服务器 如果我这样做的话,效果很好 我的客户得到答复。但是我无法让它与任何类型的呼叫一起使用。我尝试了以下所有方法,但没有一个起作用。 那个挂了并且什么也没打印(如果我用我装饰的东西得到的不是从中得到的),好,我得到了使用yieldin是不正确的。 如果

  • 问题内容: 我已经用JDK 10成功安装了netbeans(Apache版本),但是在我的项目中不能使用关键字,它一直在说。任何帮助,将不胜感激。 问题答案: 要将关键字与NetBeans中的 JDK 10结合使用 ,请执行以下操作: 确保您正在运行最新版本的Apache NetBeans。 在NetBeans中,将 JDK 10 添加为Java平台(“ 工具” >“ Java平台”>“添加Pla