• Java实现 LeetCode 560 和为K的子数组(某著名排序大法改编)


    560. 和为K的子数组

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

    示例 1 :

    输入:nums = [1,1,1], k = 2
    输出: 2 , [1,1] 与 [1,1] 为两种不同的情况。
    说明 :

    数组的长度为 [1, 20,000]。
    数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。

    PS:
    先附上简单一些的

    class Solution {
         public int subarraySum(int[] nums, int k) { 
            Map<Integer, Integer> map = new HashMap<>();
            map.put(0, 1);
            int sum = 0, ret = 0;
    
            for(int i = 0; i < nums.length; ++i) {
                sum += nums[i];
                if(map.containsKey(sum-k))
                    ret += map.get(sum-k);
                map.put(sum, map.getOrDefault(sum, 0)+1);
            }
            
            return ret;
        }
    }
    

    PS:
    改编自某排序大法

    class Solution {
         public int subarraySum(int[] nums, int k) {
            int sum = 0;
            int min = Integer.MAX_VALUE;
            int max = Integer.MIN_VALUE;
            for (int n : nums) {
                sum += n;
                min = Math.min(min, sum);
                max = Math.max(max, sum);
            }
            int[] sums = new int[max - min + 1];
            int count = 0;
            sum = 0;
            for (int n : nums) {
                sum += n;
                int target = sum - min - k;
                if (target >= 0 && target < sums.length) {
                    count += sums[target];
                }
                sums[sum - min]++;
            }
            if (k - min >= 0 && k - min < sums.length) {
                count += sums[k - min];
            }
            return count;
        }
    }
    
  • 相关阅读:
    拷贝构造函数与赋值运算符的区别(待完善)
    概念学习(Concept Learning)
    函数对象适配器之ptr_fun的使用示例
    SynchronizationContext的研究之一(非WPF及Forms)
    ESLint
    Vue CLI 4.0 关于 webpack 基本配置范例
    Hdu3787
    Cf393A
    Cf387A
    Cf386B
  • 原文地址:https://www.cnblogs.com/a1439775520/p/13074929.html
Copyright © 2020-2023  润新知