20201107

题目:

给定一个整数数组 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。

抛砖引玉

思路:

首先忽略题目中的复杂度说明,使用两层遍历枚举所有区间的,统计枚举的区间和满足要求的数量

抛砖引玉
/** * @param {number[]} nums * @param {number} lower * @param {number} upper * @return {number} */var countRangeSum = function(nums, lower, upper) { let _result = 0 for (let i = 0; i   // 区间和  let item = 0  for (let j = i; j    item = item + nums[j]   if (item >= lower && item <= upper) _result++  } } return _result};

归并排序

归并排序是用于两个有序序列和并成一个有序序列的算分。

在本题中,考察的是数组子集的和是否在lower、upper之间,可先遍历nums求出其前缀和sum:0,nums[0],nums[0]+nums[1],nums[0]+nums[1]+nums[2]...

  • 枚举一sum的区间,用二分法切分成两个数组,两个数组分别取出一个值相减就形成了nums中一个区间
  • 对切分后的两个数组归并排序则枚举区间和时,指定一个指针就可以等到满足要求的边界区间
  • 归并排序,设两个子数组arr1、arr2(本题通过mid索引位置来划分两个子数组):
    • 先声明一个值长度arr1.length+arr2.length 的数组
    • 声明三个指针:一个为当前填充到结果位置的索引index,两位两个分别对应两个数组index1、index2
    • index1、index2位置上的数字,谁小谁先占据index位置,直到两个子数组遍历完
var countRangeSum = function (nums, lower, upper) {  // 前缀元素和  let sum = [0]   for (let  i = 1;i <= nums.length;i++) {    sum[i] = sum[i - 1] + nums[i - 1]  }

  function helper (left, right) {   if (left === right) return 0    let mid = Math.floor((left + right) / 2),        // 先递归切分区间        result = helper(left, mid) + helper(mid + 1, right);

    // 统计left到right之前满足条件的下标组合数量    let index = left,        l = mid + 1,        r = mid + 1;    while (index <= mid) {      while (l <= right && sum[l] - sum[index]       while (r <= right && sum[r] - sum[index] <= upper) r++;      result += (r - l);      index++;    }

    // 两个合并子树形成一个有序数组,保证后续切分的数组均为有序数组    let sorted = Array(right - left + 1),        p1 = left,         p2 = mid + 1,        p = 0;    while (p1 <= mid || p2 <= right) {      if (p1 > mid) {        sorted[p++] = sum[p2++];      } else if (p2 > right) {        sorted[p++] = sum[p1++];      } else {        if (sum[p1]           sorted[p++] = sum[p1++];        } else {          sorted[p++] = sum[p2++];        }      }    }    for (let i = 0; i       sum[left + i] = sorted[i];    }    return result;  }

  return helper(0, sum.length - 1);};

博客: 前端小书童

每天的每日一题,写的题解会同步更新到公众号一天一大 lee 栏目 欢迎关注留言

公众号:前端小书童

输出指定个数所有枚举_【一天一大 lee】区间和的个数 (难度:困难) Day20201107相关推荐

  1. python统计英文文章中单词的个数无文件_求Python统计英文文件内单词个数的思路...

    感谢微博上@刘鑫-MarsLiu的TAG每天一个小程序. 你会如何实现上述题目的要求? #!/usr/bin/env python # -*- coding: utf-8 -*- "&quo ...

  2. 【Java学习笔记】接收命令行参数输出指定个数的斐波那契数列

    /*斐波那契数列使用命令行输入参数 */ public class Fibonacci {public static void main(String[] args){if (args.length ...

  3. STM32F407-高级定时器输出指定个数PWM功能

    高级定时器输出指定个数PWM只需要设置好重复计数器寄存器RCR的值并打开更新中断即可. 一般情况下的更新中断是在CNT计数到ARR的时候产生,而在设置了RCR后,更新中断将会延迟,比如设置RCR的值为 ...

  4. python输出指定范围素数_怎么用python输出指定范围内的质数?

    想必初入python学习的小伙伴都会遇到这个问题吧,那怎么处理呢?下面小编就教大家最简单明了的办法,一起来看下吧~ 关于质数: 素数(prime number)又称质数,有无限个.除了1和它本身以外不 ...

  5. python求斐波那契数列前20项和、每隔5个数空一行_输出斐波那契数列的前20项(每行5个数)_学小易找答案...

    [单选题]The Third State Bank of Laramie has opened an office in Morocco. This office does not take depo ...

  6. java 枚举_深入理解Java枚举

    所有知识体系文章,[GitHub](https://github.com/Ziphtracks/JavaLearningmanual)已收录,欢迎Star!再次感谢,愿你早日进入大厂! https:/ ...

  7. c++ main函数调用 类中的枚举_为啥用枚举,枚举有哪些用法?

    Java基础:枚举的用法与原理 在学习过程中,我们也只是在定义常量的时候,会意识到枚举的存在,而定义常量其实可以在类中实现,这时就会感觉枚举有点鸡肋.但在实际项目开发的过程中,枚举因相当迷人的特性而受 ...

  8. Python案例:输出指定范围的闰年

    一.闰年判断条件 能被4整除,并且不能被100整除 能被400整除 二.输出指定范围的闰年 1.创建程序 - 输出指定范围的闰年及个数.py # -*- coding: utf-8 -*- " ...

  9. python输入一个三位数、输出它的逆序数_从键盘任意输入一个3位整数

    从键盘任意输入一个3位整数,编程计算并输出它的逆序数 程序哪里错了??为什么输出的是一个长长的负数 编写程序,输入一个3位正整数, www.zhiqu.org     时间: 2020-11-24 # ...

最新文章

  1. 超详细解读ORB-SLAM3单目初始化(下篇)
  2. wingIDE右侧文件列表移动到左侧
  3. 将excel多个工作表(表结构相同)合并后生成csv文件
  4. python红楼梦词频统计_用 Python 分析《红楼梦》(2)-阿里云开发者社区
  5. matlab特征值分解法求多自由度系统的固有频率和主振型
  6. oracle 10g oci.dll 下载,Oracle 11g oci.dll下载
  7. jlink6.80a烧写序列号(serial number)问题记录
  8. UCF101数据集提取帧+TDN部署(Anaconda+Python3.7+Pytorch)
  9. 斐讯K2路由器刷潘多拉(解决固件非法问题)(连接校园网锐捷)
  10. 离散数学---循环群,左陪集,子群
  11. web端实现二维码扫码记录
  12. 互联网公司常用架构模式梳理
  13. 8、16、32-BIT系列单片机区别与特点
  14. 团队协作效率低?多半是这5大障碍搞的鬼
  15. egg Cannot find module ‘diagnostics_channel‘
  16. 微信小程序注册入口及流程(完整版教程)
  17. PCB布局布线中地的设计(地与地使用跨接)。
  18. 微软服务器搭建ngrok,ngrok搭建(Windows服务端+Windows客户端)
  19. cloc工具 linux,Linux下源代码行数统计工具(sloccount, cloc等)
  20. 读《系统工程:21世纪的系统方法论》

热门文章

  1. 【论文写作】毕业论文写作——摘要篇
  2. linux drm 内存管理,Linux RK3399 DRM 框架及代码流程 · Younix’s Studio
  3. 如何用 Visual Studio 2017 开发 Arduino 应用程序
  4. malloc/free与new/delete的使用要点
  5. git clone github源码 下载速度很慢的解决方法
  6. 药师帮完成1.33亿美元D轮融资,投资方为老虎环球基金、H Capital和DCM...
  7. ajax请求返回整个页面,页面里的javascript执行问题(requireJS)
  8. 件测试专家分享III GUI自动化测试相关
  9. Hadoop MapReduce编程 API入门系列之wordcount版本3(七)
  10. vue-cli配置环境: