给定一个整数组成的无序数组arr,值可能正、可能负、可能0 哪个子数组含有0和1的数量一样,并且是长度最大的,返回其长度
思路:
这道题和子数组和等于target的题很像,那能不能转换为那道题?本题数组内的元素只有三种,既不是0也不是1,0,1。
既不是0也不是1转变为0,0转变为-1。那么含有相同数量0、1的子数组和就为0。就和子数组和等于target的题一样了。
代码:
int subArrayMaxLength2(vector<int> &arr) {
vector<int> newArr;
for(int i = 0;i < arr.size();i++) {
if (arr[i] != 0 && arr[i] != 1) {
newArr.push_back(0);
}
else if (arr[i] == 0) {
newArr.push_back(-1);
}
else if (arr[i] == 1) {
newArr.push_back(1);
}
}
unordered_map<int, int> map;
map.insert(make_pair(0, -1));
int sum = 0, ans = 0;
for(int i = 0;i < newArr.size();i++) {
sum += newArr[i];
if (map.find(sum) != map.end()) {
ans = max(ans, i - map.at(sum));
}
else {
map.insert(make_pair(sum, i));
}
}
return ans;
}