未排序数组中累加和为给定值的最长子数组长度

Posted vector6_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未排序数组中累加和为给定值的最长子数组长度相关的知识,希望对你有一定的参考价值。

未排序数组中累加和为给定值的最长子数组长度

描述

给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度

输入描述:

第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出
第二行N个整数表示数组内的数

输出描述:

输出一个整数表示答案

示例1

输入:

5 0
1 -2 1 1 1

输出:

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

int getSubArray(int array[], int n, int k)
{
    //key:和  value:当前位置索引
    unordered_map<int, int> sum_index_map;
    sum_index_map[0] = -1;                 //sum与k相等时,长度为索引差+1,所以初始value为-1
    int sum = 0;
    int maxLength = 0;
    for(int i=0; i<n; ++i)
    {
        sum+=array[i];
        int diff = sum - k;     
        if(sum_index_map.find(diff)!=sum_index_map.end())//这里sum-k其实也是和,若sum与k的差在表里存在,即可以减去之前的得到该和(差值)达到目标
        {
            int index = sum_index_map[diff];
            maxLength = max(i-index,maxLength);//此时长度为当前索引位置减去之前和(差值)的索引位置
        }
        if(sum_index_map.find(sum)==sum_index_map.end()) //每次将表中没有存的和存入
        {
            sum_index_map[sum] = i;
        }
    }
    return maxLength;
}

int main()
{
    int n,k;
    cin>>n>>k;
    int array[n];
    for(int i=0; i<n; ++i)
    {
        cin>>array[i];
    }
    int res = getSubArray(array, n, k);
    cout<<res;
}

以上是关于未排序数组中累加和为给定值的最长子数组长度的主要内容,如果未能解决你的问题,请参考以下文章

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度

一天一道算法题---未排序数组中累加和为给定值的最长子数组

读书笔记之《程序员代码面试指南(数组和矩阵问题)》

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度

未排序数组中累加和小于或等于给定值的最长子数组长度

[算法]最长子数组问题