当前位置 博文首页 > 炸栈专家:leetcode 525. 连续数组

    炸栈专家:leetcode 525. 连续数组

    作者:[db:作者] 时间:2021-09-03 15:14

    题目:

    在这里插入图片描述

    该题和之前做过的 leetcode 513.连续的子数组和 类似的方法。
    只不过该题中规定的连续数组内容比较特殊,我们可以 将数组中的 0全部看作 -1 ,那么问题便简单多了。
    我们只需寻找元素和为0的数组就行了,因为 数组和为0 则表示 有相同数量的 1和 -1相互抵消。把-1换成0便是符合题目规定的连续数组了。

    方法:前缀和+哈希表

    哈希表中 key 为前缀和,val 为数组元素下标

    1. 判断数组大小,数组大小小于2则直接返回。
    2. 创建哈希表,将key==0置为-1。(这一步的目的是判断是否有从0下标开始便连续的数组)
    3. 初始化前缀和变量sum=0,返回值ret=0。
    4. 循环判断数组内容是否为1
    5. case1:如果为1,则sum++。
    6. case2:如果为0,则sum- -。(这里sum减1就相当于加-1,把所有0的值看作-1,那么和为0的数组便是题中规定的连续数组)
    7. 循环判断哈希表中是否存有key值与当前sum值相同。(寻找连续数组的左边界
    8. case 1:如果存在key==sum,则更新函数返回值ret=fmax(ret,i-tmp->val);
    9. case 2:如果不存在,则将当前sum值存入哈希表,可能后面循环中sum值与此次的sum值相等。
    10. 循环结束返回ret

    代码实现:

    C++:

    class Solution {
    public:
        int findMaxLength(vector<int>& nums) {
            int len=nums.size();
            int ret=0;//函数返回值
            if(len<2)//数组元素个数小于2则不满足连续数组的条件
                return 0;
            int sum=0;//前缀和的值
            unordered_map<int,int> hash;//定义哈希表
            hash[0]=-1;//存入前缀和key为0的下标值val为-1
            for(int i=0;i<len;++i){
                if(nums[i]==1)
                    ++sum;//当前元素值为1则++sum
                else
                    --sum;//当前元素为0时,把0当作-1,于是--sum 等于 sum+=(-1)
            	//查询哈希表中是否有key为sum的值
                if(hash.count(sum)){
                	//如果哈希表中有前缀和与当前前缀和相同的值,则 i-hash[sum] 是连续数组的长度
                    ret=fmax(ret,i-hash[sum]);
                }else{
                	//当哈希表没有和此次循环sum相同的值,则存入此次的sum值,以防后面的循环中有相同sum值
                    hash[sum]=i;
                }
            }
            return ret;
        }
    };
    

    C:

    struct HashTable{
        int key;
        int val;
        UT_hash_handle hh;
    };
    
    int findMaxLength(int* nums, int numsSize){
        struct HashTable *hashtable=NULL;
        struct HashTable *tmp=(struct HashTable *)malloc(sizeof(struct HashTable));
        tmp->key=0;
        tmp->val=-1;
        HASH_ADD_INT(hashtable,key,tmp);
        int ret=0;
        int sum=0;
        for(int a=0;a<numsSize;++a){
            if(nums[a]==1)
                sum++;
            else
                sum--;
            struct HashTable *tmp;
            HASH_FIND_INT(hashtable,&sum,tmp);
            if(tmp!=NULL){
                ret=fmax(ret,a-tmp->val);
            }else{
                tmp=(struct HashTable *)malloc(sizeof(struct HashTable));
                tmp->key=sum;
                tmp->val=a;
                HASH_ADD_INT(hashtable,key,tmp);
            }
        }
        return ret;
    }
    
    cs