560. 和为 K 的子数组-前缀和+暴力解法和前缀和+哈希表解法

560. 和为 K 的子数组-前缀和+暴力解法和前缀和+哈希表解法

给你一个整数数组 nums 和一个整数 k ,请你统计并返回 该数组中和为 k 的连续子数组的个数 。

示例 1:

输入:nums = [1,1,1], k = 2
输出:2

示例 2:

输入:nums = [1,2,3], k = 3
输出:2

暴力解法如下:

int subarraySum(int* nums, int numsSize, int k){


   for(int i=1;i<numsSize;i++){
       nums[i]=nums[i]+nums[i-1];

   }
   int count =0;
   for(int i=0;i<numsSize;i++){
       for(int j=0;j<=i;j++){
           if(j==0){
               if(nums[i]==k){
                   count++;
               }
              
           }
            else{
                   if(nums[i]-nums[j-1]==k){
                       count++;
                   }

               }

       }

   }
   return count;

}

上面时间开销 不能通过,这里有一个哈希表法,解题代码如下:


#define size 137
struct hash{
    int val;
    int index;
    struct hash *next;

};

void hash_add(struct hash *h,int val,int index){
    struct hash *p=(struct hash *)malloc(sizeof(struct hash));
    p->val=val;
    p->index=index;
    p->next=h->next;
    h->next=p;
}

int find(struct hash *h,int index,int val){
    struct hash *p=h->next;
    int count=0;
    while(p){
       if(p->index<index&&p->val==val){
           count++;

       }
       p=p->next;
    }
    return count;
    
    
}



int subarraySum(int* nums, int numsSize, int k){
   struct hash *h=(struct hash *)malloc(sizeof(struct hash )*size);
    for(int i=0;i<size;i++){
        (h+i)->next=NULL;

    }

   for(int i=1;i<numsSize;i++){
       nums[i]=nums[i]+nums[i-1];

   }
 
   for(int i=0;i<numsSize;i++){
       hash_add(h+(abs(nums[i])%size),nums[i],i);
      

   }
   int count =0;
   for(int i=0;i<numsSize;i++){
       if(nums[i]==k){
           count++;
       }
       count=count+find(h+(abs(nums[i]-k)%size),i,nums[i]-k);

       

   }
   return count;

}

你可能感兴趣的:(c++与c语言,力扣刷题,散列表,哈希算法,数据结构)