【算法学习】【数组】和为K的数组

Q:给定一个整数数组和一个整数 k,找到该数组中和为 的连续的子数组的个数。

我刚看到这题,扫描到关键词【数组】第一反应就是使用【双端指针】这种思路套用,但是有一个问题,这里并没有提示这是个有序的数组,也就是说,我移动指针并不能保证预期数组的膨胀和塌陷。

作为一个小白,我第一反应还是暴力的遍历,能做出来,但是时间复杂度很糟糕^_^

但是在这次遍历的过程中,还是能发现一些规律的 :

  1. 每次计算比较,都是与之前累加的和进行比较,关于这个和的存储是否可以直接查出来?
  2. 在不断的计算中,其实出现过几次结果满足预期K的场景,这个次数应该可以和做映射关系

那么根据以上的思路,有几个关键词就体现出来了【映射】【查找】,ok,这样子就可以确定辅助数据结构了 Map

还要注意的是,针对这类问题我们的思路要转变一下 。

题目中要求我们找到数组中和为K,那实际上我们要把这个问题拆解开。

当我们需要找到和为K的时候,其实是指我们需要找到是否存在一个值为 sum - k

综上所述,代码如下:

    public static void main(String[] args) {
       int k = 2;
       int [] array = new int []{1,1,1};
       System.out.println(getArray(array,k));
    }

    private static int getArray(int[] array, int k) {
        int count = 0;
        int sum = 0;
        //sum做key,count做value
        Map<Integer,Integer> table = new HashMap<>(2);
        table.put(0,1);
        for (int num :array) {
            //对数组进行累加
            sum = sum + num;
            //核心:从映射表查找之前是否出现过满足sum-k的值,如果出现过,这次加K,就满足预期等于K   
            count = count+ table.getOrDefault(sum - k, 0);
            table.put(sum,table.getOrDefault(sum,0)+1);
        }
        return count;
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值