zoukankan      html  css  js  c++  java
  • 523. Continuous Subarray Sum

    class Solution {
    public:
        bool checkSubarraySum(vector<int>& nums, int k) {
            unordered_map<int,int> allsum;
            allsum.insert(make_pair(0,-1));
            int sum=0;
            for(int i=0;i<nums.size();++i)
            {
                sum+=nums[i];
                if(k)sum%=k;
                auto j=allsum.find(sum);
                if(j!=allsum.end())
                {
                    if(i-j->second>1)return true;
                }
                allsum.insert(make_pair(sum,i));
            }
            return false;
        }
    };

    1

    之前见过的题结果还是没搞定, 思路是没问题的,但是细节处理错导致不能ac;  本题要求连续的子数组之和是k的倍数, 看起来好像要求和, 其实是用减法来做加法,  任何一个子数组的和= 前n个数的和-前m个数的和, m<n

    2

    注意题目要求subarry最少2个,所以这里必须存索引, 同时需要判断当前的索引i 和 j的关系;  如果没要求2个, 可以把map换成set

    3

    k为0的情况, 这里有点奇怪,题目并不认为任意数是0的倍数....  但0又是0的倍数, 我也是搞不懂什么鬼, 所以不能写出if k==0 return true/false的判断

    4

    边界考虑, 如果前n个数组就已经符合了,但是map里面是空的! 然后就认为找不到答案..  所以记得初始化一下, key=0  value=-1, 表明前 -1 个元素的和为0

  • 相关阅读:
    centos mongo数据库搭建
    闪屏页白屏或者显示旧图
    在Sqlserver下巧用行列转换日期的数据统计
    读 《.Net 之美》解析.Net Remoting (应用程序域)-- Part.1
    MVC的自定义动作过滤器(一)
    【算法】快排
    【编程范式】C语言1
    排序
    日志记录类
    邮箱发送类
  • 原文地址:https://www.cnblogs.com/lychnis/p/9281945.html
Copyright © 2011-2022 走看看