You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现O(n)算法,统计数组中以3开头以7结尾的子集数量

问题描述

给定每个元素均为数字的数组,要求统计其中所有以3开头、以7结尾的连续子集的总数量。

示例说明

给定数组:1,2,5,3,6,7,3,3,7,0,3,4,9,7,8
符合要求的子集总数为8,具体子集如下(仅需统计数量无需输出子集):

3,6,7
3,6,7,3,3,7
3,6,7,3,3,7,0,3,4,9,7
3,3,7
3,3,7,0,3,4,9,7
3,7
3,7,0,3,4,9,7
3,4,9,7

需求说明

现有如下代码框架,需要填充int o_n_alg(int arr[], int size)函数的逻辑,要求算法时间复杂度为O(n):

int o_n_alg(int arr[], int size)
{
  // To fill with O(n) Algorithm
}

int main(){
   int size = 1000000;
   int *array = new int[size];
   int ans_n;

   for (int i = 0; i < size; i++) 
     cin >> array[i];


   ans_n = o_n_alg(array, size);
}
实现思路

仅需一次遍历即可完成统计,逻辑如下:

  • 维护两个变量:count_3 记录遍历到当前位置之前遇到的数字3的总个数,res 记录最终符合要求的子集总数
  • 遍历数组的每个元素:
    • 如果当前元素是3,直接给count_3加1
    • 如果当前元素是7,说明这个7可以和之前出现的所有3分别组成符合要求的连续子集,直接把count_3的值累加到res上
    • 其他元素无需做任何处理
  • 遍历结束后返回res即可

该思路时间复杂度为O(n),空间复杂度为O(1),完全符合要求。代入示例验证:三个7分别出现时,前面的3的个数分别为1、3、4,累加结果为1+3+4=8,和示例结果完全匹配。

最终代码实现
int o_n_alg(int arr[], int size)
{
    int count_3 = 0;
    int res = 0;
    for (int i = 0; i < size; i++) {
        if (arr[i] == 3) {
            count_3++;
        } else if (arr[i] == 7) {
            res += count_3;
        }
    }
    return res;
}

内容的提问来源于stack exchange,提问作者Anıl

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 21:48:01