首页 > 编程语言 >[算法/数据结构]系列 华为面试原题:和为n的子串(前缀和+哈希表)

[算法/数据结构]系列 华为面试原题:和为n的子串(前缀和+哈希表)

时间:2024-12-29 22:26:58浏览次数:3  
标签:子串 前缀 原题 sum prefixSumCount 数组 哈希 数据结构

[算法/数据结构]系列 华为面试原题:和为n的子串(前缀和+哈希表)

文章目录


面试原题

输入一串只有0和1的数组,返回输入和为n的子串的个数。

样例:
输入:[0 1 1 1 0 0], n = 3
输出:6

样例分析

输入数组:[0, 1, 1, 1, 0, 0]
目标和:n = 3
我们需要找到所有和为 3 的连续子数组(子串)。从给出的结果来看,允许 0 被并入子串。

前缀和:广泛用于解决区间查询问题,尤其是对数组元素进行快速求和(有些题目可能转换为异或)。它通过保存计算数组前n个数的结果,避免了重复计算,从而显著提高查询效率。一般会配合哈希表一起使用以获得最优的效率。

所有和为 3 的子串如下:
[0, 1, 1, 1](索引范围 [0, 3])
[1, 1, 1](索引范围 [1, 3])
[1, 1, 1, 0](索引范围 [1, 4])
[1, 1, 1, 0, 0](索引范围 [1, 5])
[0, 1, 1, 1, 0](索引范围 [0, 4])
[0, 1, 1, 1, 0, 0](索引范围 [0, 5])
这样就总共有 6 个子串满足条件。

代码及思路

前缀和一般表示为:
s u m [ n ] = s u m [ n − 1 ] + n u m s [ n ] sum[n] = sum[n - 1] + nums[n] sum[n]=sum[n−1]+nums[n]
如果问题可以由如上递推关系表示,且可以使用内存换时间,那么可以使用前缀和。

公式中的 + + +也可以替换为 ⊕ \oplus ⊕等其他任何可能的操作符。

实现的代码如下:
使用时候需要特别注意 对储存前缀和出现次数的哈希表的初始化

#include <iostream>
#include <vector>
#include <unordered_map>
using namespace std;

int main() {
    vector<int> nums = {0, 1, 1, 1, 0, 0}; // 输入数组
    int n = 3; // 目标和

    unordered_map<int, int> prefixSumCount; // 哈希表存储前缀和出现的次数  <前缀和,次数>
    prefixSumCount[0] = 1; // 初始化:前缀和为0的次数为1
    int sum = 0;           // 当前前缀和
    int count = 0;         // 符合条件的子数组个数

    for (int num : nums) {
        sum += num; // 更新前缀和

        // 查找是否存在前缀和为 sum - n 的记录
        if (prefixSumCount.find(sum - n) != prefixSumCount.end()) {
            count += prefixSumCount[sum - n]; // 增加符合条件的子数组个数
        }

        // 更新当前前缀和在哈希表中的出现次数
        prefixSumCount[sum]++;
    }

    cout << "result is:" << count << endl;

    return 0;
}


学习资料链接

标签:子串,前缀,原题,sum,prefixSumCount,数组,哈希,数据结构
From: https://blog.csdn.net/weixin_51226279/article/details/144809972

相关文章

  • 《数据结构》期末考试测试题【上】
    数据结构测试题1.数据结构是指什么?2.某语句时间复杂为?3.关于数据结构的说法那个正确?4.一个算法的评价标准包括哪些方面?5.时间复杂度指的是什么?6.算法的重要特征有那些?7.某语句时间复杂为?8.存储数据时要存储什么?9.某语句时间复杂为?10.某语句时间复杂为?11.某二叉树的遍历......
  • 数据结构与算法Python版 二叉堆与优先队列
    文章目录一、二叉堆与优先队列二、二叉堆的实现三、二叉堆的应用-堆排序一、二叉堆与优先队列优先队列PriorityQueue默认的队列是FIFO,队列有一种变体称为优先队列优先队列的出队:跟默认队列一样从队首出队优先队列的入队:数据项的次序由优先级来确定,高优先级的数据......
  • 【数据结构】二叉树
    二叉树1.树型结构(了解)1.1概念1.2概念(重要)1.3树的表示形式(了解)1.4树的应用2.二叉树(重点)2.1概念2.2两种特殊的二叉树2.3二叉树的性质2.4二叉树的存储2.5二叉树的基本操作2.5.1前置说明2.5.2二叉树的遍历2.5.3二叉树的基本操作2.6二叉树相关oj题【本节......
  • 头歌实训数据结构与算法-二叉树及其应用(第7关:由前序和中序遍历序列构造二叉树)
    任务描述本关任务要求采用前序遍历序列和中序遍历序列构造二叉树。相关知识给定一棵二叉树的前序遍历序列和中序遍历序列可以构造出这棵二叉树。例如前序序列是ABDECFG,中序序列是DBEAFCG,那么这颗二叉树的结构如图1所示。树结点结构定义为:structBTNode{    c......
  • 数据结构之线性表之链表(附加一个考研题)
    链表的定义链表的结构:单链表-初始化代码实现:单链表-头插法代码实现:这里我给大家分析一下我们每创建一个新的节点都要插在头节点的后面,我们一定要注意顺序一定要先让新节点指向头节点指向的下一个节点,再让头节点指向新的节点单链表-遍历代码实现:代码分析:这里我......
  • 数据结构之栈和队列
    栈的定义:我们要记住这8个字,先进后出,后进先出我们对于栈的操作只有两个,进栈和出栈栈的顺序结构初始化:(和顺序表差不多)代码实现:栈的顺序结构进栈:代码实现:栈的顺序结构出栈:代码实现:这里解释一下,让下标减一,下次进行进栈的时候就直接覆盖了,和顺序表的原理差不多获取栈......
  • 链表 实现复杂的数据结构
    `#includeusingnamespacestd;structNode{intdata;Node*next;};Node*CreateNode(intdata){Node*newNode=newNode();newNode->data=data;newNode->next=NULL;returnnewNode;}voidtraverseLinkedList(Node*head){Node*current=head;while(curre......
  • 数据结构与算法Python版 图
    文章目录一、图二、抽象数据类型图三、图的实现-邻接列表法一、图表示图的英文单词painting:用画刷画的油画drawing:用硬笔画的素描/线条画picture:真实形象所反映的画,如照片等,如takepictureimage:由印象而来的画,遥感影像做image,因是经过传感器印象而来figure:轮廓图的......
  • Javascript数据结构常见题目(一)
    以下是每个问题的JavaScript实现:1.下一个更大元素(循环数组)functionnextGreaterElements(nums){letn=nums.length;letresult=Array(n).fill(-1);letstack=[];for(leti=0;i<2*n;i++){letnum=nums[i%n];......
  • Javascript数据结构常见面试题目(全)
    以下是一个前端JavaScript数据结构常见题目框架,可以帮助你快速组织思路并解决问题:框架内容1.数组相关查找与排序:寻找数组的最大/最小值。快速排序、归并排序、冒泡排序。操作:移除重复项:newSet()或双指针法。滑动窗口法:求最大/最小子数组和。二分查找:查找有序数......