zoukankan      html  css  js  c++  java
  • 算法——和为K的连续子数组

    给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
    输入:nums = [1,1,1], k = 2
    输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
    链接: leetcode.

    解题思路:

    1. 第一反应回想到双指针的算法,但是数组中的元素有可能为负数,所以,时间复杂度可能是n三方的。
    2. 然后到利用数组的前缀和,然后二次循环遍历,这样时间复杂都是n方的。
    3. 其实可以改进上一种算法,将已经遍历过的元素前缀和存到哈希表中,然后在计算之后的总和时,只要查询哈希表中相应值的数量,就能知道这个位置总和为K的数量。
    // created by lippon
    class Solution {
        public int subarraySum(int[] nums, int k) {
            int n = nums.length; 
            if(n == 0) return 0;
            int[] l = new int[n + 1];
            int res = 0, sum = 0;
    
            for(int i = 0; i < n; i++) {
                sum += nums[i];
                l[i + 1] = sum;
            }
            Map<Integer, Integer> map = new HashMap<>();
    
            for(int i = 0; i <= n; i++) {
            	// 查询表中,与当前前缀之差为k的值的个数
                if(i > 0 && map.containsKey(l[i] - k)) res += map.get(l[i] - k);
                // 再将当前前缀放入表中
                map.put(l[i], map.getOrDefault(l[i], 0) + 1);
            }
    
            return res;
        }
    }
    
  • 相关阅读:
    Django Rest Swagger生成api文档
    django 完整日志配置
    django解决跨域请求的问题
    Django REST framework 自定义字段
    Django model 定义属性
    mysql server has gone away的原因
    也谈时间管理和GTD
    MySQL之thread cache
    MySQL之aborted connections和aborted clients
    TokuDB的特点验证
  • 原文地址:https://www.cnblogs.com/lippon/p/14117696.html
Copyright © 2011-2022 走看看