【问题标题】:Lucky Day Hacker Earth Problem giving wrong answer幸运日黑客地球问题给出错误答案
【发布时间】:2021-05-19 06:44:15
【问题描述】:

给你一个整数数组。如果一个整数后面的每个整数都不大于所选整数,则称该整数为“幸运”。您必须计算数组中存在的 Lucky 整数的总数并在最后打印出来。

我尝试了解决方案的简单 O(n2) 复杂度,但我无法通过 4 个不幸隐藏的测试用例。你能猜出那些绕过下面给定算法的测试用例应该是什么,或者如果你有更好的解决方案,请告诉我。

**for(int i=0;i<array.length-1;i++){
       flag=true;
   for(int j=i+1;j<array.length;j++){
       if(a[j]>a[i]){
           flag=false;break;
       }
   }
   if(flag)
     count++;
}**

请注意count=1;最初是因为数组中的最后一个元素默认是幸运整数。

示例: 输入:[2,4,5,1,1] 输出:3

【问题讨论】:

  • 有一个 O(n) 的解决方案。您是否得到错误的答案或时间限制问题?
  • 一个刹车情况是空数组,好像不排除
  • 可能的O(n) 方法是从最后一个元素开始遍历,这总是很幸运的。找到幸运数字后,增加 count 并记住该幸运元素。现在您只需要比较 k-i th 元素是否为 greater 而不是之前找到的幸运数字。如果是,则再次增加计数并记住找到的幸运数字以供进一步使用。

标签: algorithm for-loop optimization integer complexity-theory


【解决方案1】:

您的问题很可能在于复杂性。此类问题的复杂度一般为 O(n^2)。

如果一个数字大于所有剩余数字,即大于这些剩余数字的最大值,则该数字是幸运的。

这个最大值可以迭代计算。

复杂度:O(n)

#include <iostream>
#include <vector>

int lucky (const std::vector<int> &A) {
    int n = A.size();
    if (n == 0) return 0;
    int count = 1;
    int vmax = A[n-1];
    for (int i = n-2; i >= 0; --i) {
        if (A[i] >= vmax) {
            count++;
            vmax = A[i];
        }
    }
    return count;
}

int main() {
    std::vector<int> A= {2,4,5,1,1};
    int count = lucky(A);
    std::cout << count << std::endl;
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-19
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多