zoukankan      html  css  js  c++  java
  • Leetcode 327.区间和的个数

    区间和的个数

    给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。
    区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。

    说明:
    最直观的算法复杂度是 O(n2) ,请在此基础上优化你的算法。

    示例:

    输入: nums = [-2,5,-1], lower = -2, upper = 2,

    输出: 3

    解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。

     

    使用TreeMap来保存每个前缀和的计数

     1 import java.util.TreeMap;
     2 
     3 public class Solution {
     4 
     5     public static void main(String[] args){
     6         int[] nums={-2,5,-1};
     7         System.out.println(countRangeSum(nums,-2,2));
     8     }
     9 
    10     public static int countRangeSum(int[] nums, int lower, int upper) {
    11         if (nums == null || nums.length == 0) return 0;
    12         long[] sums = new long[nums.length];
    13         sums[0] = nums[0];
    14         for (int i = 1; i < nums.length; i++) sums[i] = sums[i - 1] + nums[i];
    15         int total = 0;
    16         TreeMap<Long, Integer> treemap = new TreeMap<>();
    17         for (int i = 0; i < nums.length; i++) {
    18             if (lower <= sums[i] && sums[i] <= upper) {
    19                 total++;
    20             }
    21             for (Integer count : treemap.subMap(sums[i] - upper, true, sums[i] - lower, true).values()) {
    22                 total += count;
    23             }
    24             Integer count = treemap.get(sums[i]);
    25             if (count == null) {
    26                 count = 1;
    27             }
    28             else {
    29                 count++;
    30             }
    31             treemap.put(sums[i], count);
    32         }
    33         return total;
    34     }
    35 }
  • 相关阅读:
    设置sudo的过期时间
    linux下tar.xz结尾文件的解压方法
    linux版本查看命令
    linux删除目录下所有文件,但是保留文件夹
    linux下更改文件夹名
    vim中跳到第一行和最后一行
    linux下编译安装python
    linux下 python源码包解压报错
    [Swift A]
    【构建Android缓存模块】(一)吐槽与原理分析
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10235219.html
Copyright © 2011-2022 走看看