连续的子数组和

2020-05-17  本文已影响0人  WAI_f

题目:

给定一个包含非负数的数组和一个目标整数 k,编写一个函数来判断该数组是否含有连续的子数组,其大小至少为 2,总和为 k 的倍数,即总和为 n*k,其中 n 也是一个整数。

示例:

输入: [23,2,4,6,7], k = 6
输出: True
解释: [2,4] 是一个大小为 2 的子数组,并且和为 6。

说明:

  • 数组的长度不会超过10,000。
  • 你可以认为所有数字总和在 32 位有符号整数范围内。

解题方法:

这道题是我在leetcode上面选的一道leetcode动态规划题,看到题目以后我也想不出怎么用动规做,所以就用了双重循环来实现。运行的时候报错,错误主要来源于:

  • k=0,不能取余
  • 求和值为0,k=0

这个小问题在leetcode上引起了强烈的反响,纷纷关心出题人的亲戚,哈哈哈。
回到正题,经过修改:

class Solution {
public:
    bool checkSubarraySum(vector<int>& nums, int k) {
        int end=nums.size()-1;

        vector<int> sum(nums.size());
        sum[0]=nums[0];
        for(int i=1;i<nums.size();i++)
        {
            sum[i]=sum[i-1]+nums[i];
        }

        for(int i=0;i<end;i++)
        {
            int sv=sum[i]-nums[i];
            for(int j=i+1;j<=end;j++)
            {
                int temp=sum[j]-sv;
                if((temp==0&&k==0)||(k!=0&&temp%k==0))
                {
                    return true;
                }
            }
        }

        return false;
    }
};
运行结果:

sum数组用来记录累加和,i,j分别是连续子数组开始和终止的下标,利用sum[j]-sum[i]+nums[i]来获得子数组的和,然后再判断是否满足题目要求就可以了。运行反正是通过了,但是效果不是很好,至于动规反应在哪里,我也不知道,看了一下这道题的解答,大部分都是用类似的方法,所以也就不深究了,就这样吧。

原题链接:https://leetcode-cn.com/problems/continuous-subarray-sum/

上一篇下一篇

猜你喜欢

热点阅读