算法:含有相同数量的0、1的数组最大长度

给定一个整数组成的无序数组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;
}