【问题标题】:Reducing time complexity by simplifying for loops通过简化 for 循环来降低时间复杂度
【发布时间】:2019-11-29 04:35:48
【问题描述】:

在最近的一次竞争性编码活动中,我遇到了以下问题-

ans = 0
for (i = n; i > 0; i++) {
    temp = 0;

    for (j = 1; j < n; j++) {

        for (k = n; k < 0; k++) {

            if (k > i && i > j && some_array[k] < some_array[i])
                temp++
        }
    }

    ans = temp / (i)
}

return ans

问题在于,这个伪代码的时间复杂度为 O(n^3),效率不高,需要编写一个提供与上面编写的输出相同的输出的代码。

我一直在拍摄空白,我所有的尝试都是徒劳的……有什么方法可以简化像这样的嵌套循环吗?

【问题讨论】:

  • 我有点困惑,看起来外部for循环以i=n开头,然后一直持续到i&gt;0,但for循环仅在之后增加i的值每次迭代。是指i--,还是说i 可以在其体内某处减少?
  • 循环 for(k = n; k &lt; 0; k++) 没有多大意义,因为它永远不会运行。
  • 除非 n 为负数...
  • 我认为(至少现在)这个问题太不完整了,似乎有错误的代码和缺少常量等无法回答。
  • 两种情况:n 为负数或零,n 为正数,在第一种情况下,第一个循环永远不会运行。在第二种情况下,第三个循环( k indexed )永远不会运行。在这两种情况下,从不评估 if 条件,因此只需删除所有循环并返回 0。(如果这是编码竞赛想要的 :))

标签: algorithm loops recursion time-complexity nested-loops


【解决方案1】:
ans = 0
for (i = n; i > 0; i--) {
    temp = 0;

    for (j = 1; j < n; j++) {
        if(j >= i)
            break;

        for (k = n; k < 0; k--) {
            if(k <= i)
                break;

            if (k > i && i > j && some_array[k] < some_array[i])
                temp++;
        }
    }

    ans = temp / (i)
}

return ans

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多