当前位置: 首页 > news >正文

算法之区间和题目讲解

题干

难度:简单
在这里插入图片描述

题目分析

题目要求算出每个指定区间内元素的总和
然而,区间在输入的最下面,所以按照暴力破解的思路,我们首先要遍历数组,把它的值都存进去。
然后,遍历下面的区间,从索引a到b,累加元素。
根据这个思路,我们会发现,暴力破解的代码如下:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 读取数组的长度int len = in.nextInt();int[] s = new int[len];// 读取数组元素for (int i = 0; i < len; i++) {s[i] = in.nextInt();}// 读取区间并计算和while (in.hasNextInt()) {int a = in.nextInt();int b = in.nextInt();int sum = 0;// 暴力计算区间和for (int i = a; i <= b; i++) {sum += s[i];}// 输出结果System.out.println(sum);}in.close();}
}

我们分析一下这样写的时间复杂度。

假设数组长度为n,有m个查询,那时间复杂度就是O(m*n)级别的,有点太高了。

那么,有没有更好的时间复杂度的方法呢?

我们想到,如果算区间和,每次都从区间开始加到区间结束,那么要把区间从头到尾遍历一遍。

有没有什么办法,可以以O(1)级别的时间复杂度查询出区间和呢?

解决办法就是————前缀和

简而言之,就是创建一个数组,存储累加之和。

比如新数组sum,sum[0]代表s[0],sum[1]代表s[0]+s[1],sum[2]代表s[0]+s[1]+s[2]

这样我们如果需要s[1]+s[2],只需要用sum[2]-sum[0]就行

代码

根据这个思路,我们编写代码

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);int len = in.nextInt();int[] s = new int[len];for (int i = 0; i < len; i++) { //存储数组的值s[i] = in.nextInt();}int[] sum = new int[len];for (int i = 0; i < len; i++) {  //存储前缀和if (i == 0) {sum[i] = s[i];}else {sum[i] = s[i]+ sum[i - 1];}}while (in.hasNextInt()) {int a = in.nextInt();int b = in.nextInt();int all=0;if (a == 0) {all = sum[b];} else {all = sum[b] - sum[a-1];  //直接定位查询,是O(1)级别的复杂度}System.out.println(all);}in.close();}
}
http://www.lryc.cn/news/491797.html

相关文章:

  • 价格分类(神经网络)
  • 对智能电视直播App的恶意监控
  • 【JavaEE初阶】多线程初阶下部
  • macOS上进行Ant Design Pro实战教程(一)
  • 智能合约运行原理
  • 安卓动态添加View
  • 前端预览pdf文件流
  • 【测试工具JMeter篇】JMeter性能测试入门级教程(一)出炉,测试君请各位收藏了!!!
  • 【zookeeper03】消息队列与微服务之zookeeper集群部署
  • 从 Llama 1 到 3.1:Llama 模型架构演进详解
  • UE5肉鸽游戏教程学习
  • Vue3 - 详细实现虚拟列表前端虚拟滚动列表解决方案,vue3长列表优化之虚拟列表,解决列表动态高度不固定高度及图片视频图文异步请求加载问题,虚拟列表DOM大量数据同时加载渲染卡顿太慢及下滑列表闪烁
  • 英语知识网站开发:Spring Boot框架技巧
  • 基于lvgl+ST7735制作一款esp8285的控制面板程序
  • MySQL 索引详解
  • 区块链学习笔记(1)--区块、链和共识 区块链技术入门
  • 【Android+多线程】IntentService 知识总结:应用场景 / 使用步骤 / 源码分析
  • Python Tornado框架教程:高性能Web框架的全面解析
  • 通过端口测试验证网络安全策略
  • Excel把其中一张工作表导出成一个新的文件
  • 第四份工作的环境配置
  • SpringBoot开发——Maven多模块工程最佳实践及详细示例
  • C 语言面向对象
  • 无人机探测:光电侦测核心技术算法详解!
  • ffmpeg视频滤镜:替换部分帧-freezeframes
  • PHP 超级全局变量
  • Pytorch使用手册-Tensors(专题二)
  • centos安装小火车
  • 241125学习日志——[CSDIY] [InternStudio] 大模型训练营 [17]
  • sklearn中常用数据集简介