首页 > 编程语言 >【华为OD-E卷 - 数组连续和 100分(python、java、c++、js、c)】

【华为OD-E卷 - 数组连续和 100分(python、java、c++、js、c)】

时间:2025-01-17 20:03:12浏览次数:3  
标签:满足条件 right 窗口 python OD int 数组 java total

【华为OD-E卷 - 数组连续和 100分(python、java、c++、js、c)】

题目

给定一个含有N个正整数的数组, 求出有多少个连续区间(包括单个正整数), 它们的和大于等于x

输入描述

  • 第一行两个整数N x(0 < N <= 100000, 0 <= x <= 10000000)

第二行有N个正整数(每个正整数小于等于100)

输出描述

  • 输出一个整数,表示所求的个数

备注

  • 注意:此题对效率有要求,暴力解法通过率不高,请考虑高效的实现方式

用例

用例一:
输入:
3 7
3 4 7
输出:
4
用例二:
输入:
10 10000
1 2 3 4 5 6 7 8 9 10
输出:
0

python解法

  • 解题思路:
  • 这道题的目标是计算数组中满足子数组和大于等于给定值 x 的子数组数量。以下是解题的基本思路:

双层循环遍历:

外层循环选择子数组的起始点 i。
内层循环选择子数组的结束点 j,计算从 i 到 j 的子数组和 total。
提前终止内层循环:

一旦找到一个子数组的和 total 大于等于 x,就可以确定从 j 开始到数组末尾的所有子数组都满足条件。原因是这些子数组都以 i 为起点,而子数组越长,和只会更大。
优化:

当找到第一个满足条件的 j 后,直接计算满足条件的子数组数量 N - j,并结束内层循环

def count_subarrays(N, x, nums):
    # 初始化满足条件的子数组计数器
    count = 0

    # 遍历数组的每个起始点
    for i in range(N):
        # 初始化当前子数组的和
        total = 0

        # 遍历从起始点到末尾的所有子数组
        for j in range(i, N):
            total += nums[j]  # 累加当前子数组的和

            # 如果当前子数组的和 >= x,计算满足条件的子数组数量
            if total >= x:
                count += N - j  # 从 j 开始到数组末尾的子数组都满足条件
                break  # 结束内层循环,跳到下一个起始点

    return count  # 返回满足条件的子数组总数

if __name__ == "__main__":
    import sys

    # 读取标准输入的多行数据
    input_lines = sys.stdin.read().strip().splitlines()

    # 解析第一行,得到数组长度 N 和目标值 x
    N, x = map(int, input_lines[0].split())

    # 解析第二行,得到数组 nums
    nums = list(map(int, input_lines[1].split()))

    # 调用函数并输出结果
    print(count_subarrays(N, x, nums))

java解法

  • 解题思路
  • 这道题的目标是计算数组中满足子数组和大于等于给定值 limit 的子数组数量。为了解决问题,我们使用 滑动窗口 技巧来高效计算:

滑动窗口的概念:

通过两个指针 start 和 end 来定义一个窗口,窗口表示当前子数组的范围。
指针 end 用于扩展窗口,增加子数组的范围。
指针 start 用于收缩窗口,排除不必要的元素,保证子数组和小于 limit。
操作逻辑:

每次将 values[end] 加入当前窗口的和 sum。
如果 sum 大于等于 limit,说明从 start 到 end 的子数组满足条件,而对于当前 end,从 start 到数组末尾的子数组也都满足条件,可以直接计算这些子数组的数量:num - end。
然后收缩窗口,即移动 start 指针并从 sum 中减去 values[start]。
优化:

通过滑动窗口,只需遍历每个元素一次(每个元素最多被加入和移除一次),时间复杂度为

标签:满足条件,right,窗口,python,OD,int,数组,java,total
From: https://blog.csdn.net/CodeClimb/article/details/145185130

相关文章

  • python——句柄
    一、概念    句柄指的是操作系统为了标识和访问对象而提供的一个标识符,在操作系统中,每个对象都有一个唯一的句柄,通过句柄可以访问对象的属性和方法。例如文件、进程、窗口等都有句柄。在编程中,可以通过句柄来操作这些对象,从而实现对系统资源的控制和管理。二、实战1......
  • 【Nameko库】一个用于构建分布式系统的Python库
    1.微服务介绍微服务架构是一种将应用程序拆分为多个小型服务的方法,每个服务都可以独立开发、部署和扩展。这种架构使得应用程序更加模块化、可维护和可扩展。微服务架构的核心在于服务间的通信,主要有同步通信(如RESTful和RPC)和异步通信(如消息中间件)两种方式。典型的微服务架构有......
  • 2025高级java面试精华及复习方向总结
    1. Java基础顶顶顶顶的点点滴滴1.1java集合关系结构图 1.2 如何保证ArrayList的线程安全方法一:使用Collections工具类中的synchronizedList方法    List<String>synchronizedList=Collections.synchronizedList(newArrayList<>());使用锁机制     ......
  • Python 自动识别验证码的详细指南
    验证码(CAPTCHA)广泛应用于在线表单和注册页面,旨在防止自动化攻击。尽管验证码设计旨在增加机器识别的难度,但借助光学字符识别(OCR)技术,我们仍然可以实现自动化的验证码识别。在本教程中,我们将使用Python编写一个简单的验证码识别程序,利用TesseractOCR引擎结合图像预处理技术提高......
  • 免费送源码:Java+ssm+MySQL 基于SSM的游戏论坛设计与实现 计算机毕业设计原创定制
     摘 要本论文主要论述了如何使用SSM框架开发一个游戏论坛,将严格按照软件开发流程进行各个阶段的工作,采用B/S架构JAVA技术,面向对象编程思想进行项目开发。在引言中,作者将论述游戏论坛的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计......
  • 免费送源码:Java+ssm+MySQL 基于ssm校园商城系统小程序 计算机毕业设计原创定制
    摘 要随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,校园商城系统小程序被用户普遍使用,为方便用户能够可以随时进行校园商城系统小程序的数据信息管理,特开发了基于ssm校园商......
  • Python 实现简单的验证码识别
    验证码是一种常见的验证机制,用来区分用户是人还是程序。在本教程中,我们将使用Python编写一个程序,通过图像处理和OCR技术自动识别英文数字组合的验证码。以下将逐步介绍如何实现这一功能。环境准备安装Python和必要库首先,确保已安装Python。如果未安装,可以前往Python......
  • 免费送源码:Java+ssm+MySQL Springboot大学生心理健康咨询小程序 计算机毕业设计原创定
    摘 要科技进步的飞速发展引起人们日常生活的巨大变化,电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流,人类发展的历史正进入一个新时代。在现实运用中,应用软件的工作规则和开发步骤,采用java技术建设大学......
  • Java语言基础 关键字与保留字
    关键字(keyword)的定义和特点定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)特点:关键字中所有字母都为小写官方地址:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html用于定义数据类型的关键字classinterfaceenumbyteshortintlongfloatdo......
  • springboot毕设 基于JAVA技术的旅游信息交互系统 程序+论文
    本系统(程序+源码)带文档lw万字以上文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展和人们生活水平的不断提升,旅游业正迎来前所未有的发展机遇。传统的旅游信息获取方式,如翻阅旅游指南、电话咨询等,已难以满足现......