刷题参考:https://blog.csdn.net/IBelieve2016/article/details/104544763
#include<iostream>
#include<vector>
#include <unordered_map>
using namespace std;
/*
Given an unsorted array of nonnegative integers, find a continous subarray which adds to a given number.
Examples:
Input: arr[] = {1, 4, 20, 3, 10, 5}, sum = 33
Ouptut: Sum found between indexes 2 and 4
Input: arr[] = {1, 4, 0, 0, 3, 10, 5}, sum = 7
Ouptut: Sum found between indexes 1 and 4
Input: arr[] = {1, 4}, sum = 0
Output: No subarray found
*/
int solution(vector<int> nums,int k){
int res=0;
int s=0;
bool flag=false;
unordered_map<int,int> smap;
for(int i=0;i<nums.size();i++){
s+=nums[i];
//纪录第一个等于k的值的位置,它是最小值
if(s==k&&!flag){
flag=true;
res=i+1;
}else if(smap.count(s-k)!=0){
//如果前面的序列和 存在刚好等于s-k的值,那么就可以得到中间一个序列长
//比较当前最短和存在的序列最短,取最短的序列长
res=min(res,i-smap[s-k]);
}
if(smap.count(s)==0){
smap[s]=i;
}
}
return res;
}
int main(){
vector<int> nums {2,-1,2};
cout<<solution(nums,3);
return 0;
}