560. 和为 K 的子数组 523. 连续的子数组和 525. 连续数组

560. 和为 K 的子数组

在这里插入图片描述

在这里插入图片描述

解法

在这里插入图片描述

python

class Solution:
    def subarraySum(self, nums: List[int], k: int) -> int:
        #枚举法,暴力搜索
        res=0
        for i in range(len(nums)+1):
            j=i-1
            b=0
            #反向过来,可以节省计算时间
            while j>-1 :
                print(j,i)
                b=b+nums[j]
                if b ==k:
                    res+=1
                j=j-1
        return res

c++

class Solution {
public:
    int subarraySum(vector<int>& nums, int k) {

        unordered_map<int,int> hash;
        int sum=0;
        int res=0;
        //必须添加为0的元素,次数为1
        hash[0]=1;
        for(int i =0;i< nums.size();++i){
            sum+=nums[i];
            //hash.find(sum-k) !=hash.end() or hash.count(sum-k)
            if (hash.count(sum-k)){
                cout<<sum;
                cout<<k;
                res+=hash[sum-k];}
            //如果[1]数组,k=0,这句放在前面容易报错;必须放在后面
            hash[sum]++;
        }
        return res;

    }
};

523. 连续的子数组和

在这里插入图片描述

解法

python

#两次循环暴力搜索太耗时啦
class Solution:
    def checkSubarraySum(self, nums: List[int], k: int) -> bool:
        #枚举法
        res=0
        for i in range(len(nums)+1):
            j=i-1
            sum1=0
            while j>-1:
                sum1+=nums[j]
    #%判断是否是k的倍数
                if sum1%k==0 and (i-j)>1:
                    return True
                j=j-1
        return False

c++

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int m = nums.size();
        if (m < 2) {
            return false;
        }
        unordered_map<int, int> mp;
        mp[0] = -1;
        int remainder = 0;
        for (int i = 0; i < m; i++) {
            remainder = (remainder + nums[i]) % k;
            if (mp.count(remainder)) {
                int prevIndex = mp[remainder];
                if (i - prevIndex >= 2) {
                    return true;
                }
            } else {
                mp[remainder] = i;
            }
        }
        return false;
    }
};

525. 连续数组

在这里插入图片描述

解法

在这里插入图片描述

python


class Solution:
    def findMaxLength(self, nums: List[int]) -> int:
        
        #转化为求最长的连续子数组,元素和为0
        for i in range(len(nums)):
            if nums[i] ==0:
                nums[i]=-1
        #设置一个字典a
        a=dict()
        sum1=0
        lenth=0
        a[0]=-1
        for i in range(len(nums)):
            sum1=sum1+nums[i]
            if  sum1 in a:
                if i-a[sum1]>lenth :
                   
                    lenth=i-a[sum1]    
                    #print(i,lenth)  
            else:
                #else很重要
                a[sum1]=i
        #print(nums,a)
        return lenth

c++



class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        unordered_map<int,int> hash;
        int sum=0;
        int maxlen=0;
        hash[0]=-1;
        for (int i =0;i<nums.size();++i){
            if (nums[i]==0){
            nums[i]=-1;}

        }
        for(int i =0;i<nums.size();++i){
            sum+=nums[i];
            if (hash.count(sum)){
                if ( i-hash[sum]>maxlen  ){
                    maxlen=i-hash[sum];
                    cout <<i;
                    cout<<maxlen;
                }
            }
            else{
                 hash[sum]=i;
            }
        }
        return maxlen;
    }
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值