【问题标题】:Same Occurrence of two numbers in sub arrays (contiguous)子数组中两个数字的出现相同(连续)
【发布时间】:2023-03-17 22:10:02
【问题描述】:

给定一个整数数组,找出x和y个数相同的连续子序列的总数。 例如数组 [1,2,1] 代表 x=1 和 y=2 ans = 2 为其两个子数组 [1,2] 和 [2,1]。 检查每个连续的子序列是 O(n^2),效率太低。有什么改进的想法吗?

这是我写的代码

int get_total(int* a,int x,int y,int n){
    int result=0;
    for(int i=0;i<n;i++){
        int x_c=0,y_c=0;
        for(int j=i;j<n;j++){
            if(a[j]==x){
                x_c++;
            }
            if(a[j]==y){
                y_c++;
            }
            if(x_c==y_c){
                result++;
            }
        }
    }
    return result;
}

int main(){
    int n,q;
    cin >>n >>q;
    int a[n];
    for(int i=0;i<n;i++){
        cin >>a[i];
    }
    while(q--){
        int x,y;
        cin >>x >>y;
        cout <<get_total(a,x,y,n)<<"\n";
    }
}

对于每个查询,它都在 n^2 中运行。 最大数组大小为 8*10^3,最大查询数为 10^5

【问题讨论】:

  • 请说明您是如何研究这个的以及到目前为止您发现了什么。
  • 这听起来像是字符串搜索问题。您可以使用(经过修改)Knuth-Morris-Pratt 或有限自动机。
  • 我不明白如何为这个问题应用 Knuth-Morris-Pratt 或有限自动机@macmoonshine
  • 功能代码的审查与 Stack Overflow 无关。此类问题属于Code Review
  • @Makyen 这不是代码审查问题。这是一个问题,提问者展示了他解决问题的尝试(并描述了为什么它不好),正如如何提出问题所预期的那样。

标签: c++ arrays algorithm


【解决方案1】:

创建一个辅助数组x_y_diffs,本质上是:

#(times_x_appeared_thus_far) - #(times_y_appeared_thus_far)

并且可以计算为:

x_y_diffs[0] = 0
x_y_diffs[i] = x_y_diffs[i-1] + 1         if array[i-1] == x
               x_y_diffs[i-1] - 1         if array[i-1] == y
               x_y_diffs[i-1]             otherwise

很容易看出它可以用线性时间计算出来。

现在,观察一个“好的”子序列 (i,j) 开始和结束于x_y_diffs[i+1] == x_y_diffs[j+1]

因此,您可以简单地迭代数组并维护一个直方图,计算每个值出现的次数。

std::map<int, int> histogram;
int count = 0;
for (int x : x_y_diffs) {
  count += histogram[x];
  histogram[x] = histogram[x] + 1;
}

这需要O(nlogn) 时间来计算(每个地图插入/搜索是O(logn)),并且可以通过从std::map 切换到std::unordred_map 来改进到O(n) 平均情况 .

所以,算法是总O(n)O(nlogn) 时间(基于地图选择)- 和O(n) 额外空间。

Demo on ideone

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-08
    • 2019-03-19
    • 2020-09-13
    相关资源
    最近更新 更多