求数组中等于给定值的最长子数组
//数组中等于给定值的最长子数组 #include <iostream> #include <map> #include <vector> using namespace std; int longest_sum_sub(const vector<int> &a,const int &aim) { if(a.empty()||a.size()==0) return -1; map<int,int> map;//sum,pos; map.insert({0,-1}); int maxLen=0; int curSum=0; for(int i=0;i<a.size();++i) { curSum+=a[i]; if(map.find(curSum-aim)!=map.end()) maxLen=max(maxLen,i-map.find(curSum-aim)->second); if(map.count(curSum)==0) map.insert({curSum,i}); } return maxLen; } int main() { vector<int> a{6,1,3,2,-1,1,5}; cout<<longest_sum_sub(a,6)<<endl; return 0; }
拓展
一个数组中既有奇数又有偶数,求奇数和偶数个数相等的最长的子数组
将奇数记为-1,偶数记为1,题目转换为求数组中等于0的最长子数组
//一个数组中既有奇数又有偶数,求奇数和偶数个数相等的最长的子数组 #include <iostream> #include <map> #include <vector> using namespace std; int odd_and_even_equal_num(const vector<int> &a) { if(a.empty()||a.size()==0) return -1; int curSum=0; int maxLen=0; map<int,int> map; map.insert({0,-1}); vector<int> temp(a.begin(),a.end()); for(int i=0;i<temp.size();++i) { if((temp[i]&1)==1) temp[i]=-1; else temp[i]=1; } for(int i=0;i<temp.size();++i) { curSum+=temp.at(i); if(map.count(curSum)!=0) maxLen=max(maxLen,i-map.find(curSum)->second); if(map.count(curSum)==0) map.insert({curSum,i}); } return maxLen; } int main() { vector<int> a{6,8,2,6}; cout<<odd_and_even_equal_num(a)<<endl; return 0; }