当前位置:   article > 正文

力扣hot10---子串

力扣hot10---子串

题目:

思路:

一看到子数组的和,就很容易想到前缀和,求出来前缀和数组后,对前缀和数组进行两重for循环遍历,就大功告成啦!(感觉想一会儿就可以想到)

代码:

C++:

  1. class Solution {
  2. public:
  3. vector<int> calculate(vector<int>& nums){
  4. int len=nums.size();
  5. vector<int> total(len+1,0);
  6. for(int i=1;i<=len;i++){
  7. total[i]=total[i-1]+nums[i-1];
  8. }
  9. return total;
  10. }
  11. int subarraySum(vector<int>& nums, int k) {
  12. //前缀和
  13. vector<int> total=calculate(nums);
  14. int res=0;
  15. int len=total.size();
  16. for(int i=0;i<len-1;i++){
  17. for(int j=i+1;j<len;j++){
  18. if(total[j]-total[i]==k){
  19. res++;
  20. }
  21. }
  22. }
  23. return res;
  24. }
  25. };

注意一下:(给定空间后,vector可以通过 a [ i ] = 3 来进行赋值)

嗨嗨嗨!因为对应的python过不去呀,那就继续优化!!!

  1. vector<int> total(len+1,0);
  2. for(int i=1;i<=len;i++){
  3. total[i]=total[i-1]+nums[i-1];
  4. }

优化

  1. for(int i=0;i<len-1;i++){
  2. for(int j=i+1;j<len;j++){
  3. if(total[j]-total[i]==k){
  4. res++;
  5. }
  6. }
  7. }

看到这段代码有没有什么想法呢,我们依次遍历元素,假如遍历到了第 i 个元素,那么前 i 个元素的值(此时,元素的值为前缀和数组中的值)就要记录在哈希表中,于是又转换为了两数之和的问题!!!

把上面的代码改为下面的代码就可以啦

  1. for(int i=0;i<len;i++){
  2. int temp=total[i]-k;
  3. if(hmap.find(temp)!=hmap.end()){
  4. res+=hmap[temp];
  5. }
  6. hmap[total[i]]+=1;
  7. }

改进后的代码:

  1. class Solution {
  2. public:
  3. vector<int> calculate(vector<int>& nums){
  4. int len=nums.size();
  5. vector<int> total(len+1,0);
  6. for(int i=1;i<=len;i++){
  7. total[i]=total[i-1]+nums[i-1];
  8. }
  9. return total;
  10. }
  11. int subarraySum(vector<int>& nums, int k) {
  12. //前缀和
  13. vector<int> total=calculate(nums);
  14. unordered_map<int,int> hmap;
  15. int res=0;
  16. int len=total.size();
  17. /*
  18. for(int i=0;i<len-1;i++){
  19. for(int j=i+1;j<len;j++){
  20. if(total[j]-total[i]==k){
  21. res++;
  22. }
  23. }
  24. }
  25. */
  26. for(int i=0;i<len;i++){
  27. int temp=total[i]-k;
  28. if(hmap.find(temp)!=hmap.end()){
  29. res+=hmap[temp];
  30. }
  31. hmap[total[i]]+=1;
  32. }
  33. return res;
  34. }
  35. };

python:

  1. class Solution:
  2. def subarraySum(self, nums: List[int], k: int) -> int:
  3. len_nums=len(nums)
  4. total=[0]*(len_nums+1)
  5. for i in range(1,len_nums+1):
  6. total[i]=total[i-1]+nums[i-1]
  7. res=0
  8. hmap={}
  9. len_total=len(total)
  10. for i in range(0,len_total):
  11. temp=total[i]-k
  12. if temp in hmap:
  13. res+=hmap[temp]
  14. hmap[total[i]]=hmap.get(total[i],0)+1
  15. return res

注意:

hmap[total[i]]=hmap.get(total[i],0)+1

total [ i ]不在hmap中时,hmap [ total [ i ] ] += 1会报错 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/202662?site
推荐阅读
相关标签
  

闽ICP备14008679号