未排序数组中累加和小于给定值的最长子数组长度

未排序数组中累加和小于或者等于k的最长子数组长度 题目描述 给定一个无序数组arr,其中元素可正、可负、可0。给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度 例如:arr = [3, -2, -4, 0, 6], k = -2. 相加和小于等于-2的最长子数组为{3, -2, -4, 0},所以结果返回4 [要求] 时间复杂度为O(n),空间复杂度为O(n) 输入描述: 第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述: 输出一个整数表示答案 示. 阅读详情

    本体和本博客里另外一个文章,累加和等于给定值的最长子数组,非常类似,但是上一个题目来说,为了节省时间,使用了哈希表,但是那个题目是,等于,所以哈希表里有,就直接拿,没有,就跳过了,但是本题目是要求,小于或者等于,没办法直接查找,难道要遍历哈希表吗,这样时间复杂度又上去了,所以这里给出了一个新的数组,用作辅助

    一定要找到他俩的共同点,都是求所有的以a【i】为结尾的数组中,累加和小于给定值的最长子数组长度。

     本题举例来说,{3,-2,-4,0,6}

    如果我们要求这个数组,则首先建立sum数组,就是以a[0]开始,a[i]结尾的数组的和

   sum数组为{3,1,-3,-3,3},元素sum[i]代表以arr[0]开头,arr【i】结尾的子数组的和

   另外建立辅助数组help

  help[i]表示已arr[0]开头,arr[i]结尾的数组中,曾经出现的最大累加和

   help数组为{3,3,3,3,3}

  我们可以分析如下

  当累加到元素0的时候,sum为3,就是本元素,然后我们可以这样考虑,既然要寻找以arr【0】开头,arr【0】为结尾和小于等于k的最长子数组,是不是说,我们找到了以arr【0】开头,第一次和大于等于sum-k的子数组,它后面就是我们要求的呢?(为什么叫第一次,因为数组未必全是正数,有可能后面还会多次出现和大于等于sum-k这个情况),本处来说,我们就是寻找前面和大于等于3-(-2)=5这样的子数组

  这时候,我们前面建立的help数组就开始发挥威力了,我们其实可以得知,help的意义在于表明累加到该处时,出现过的最大累加和,相当于维持一个max,所以这个数组是单调递增的,而既然是递增数组,我们就可以使用二分搜索,将时间复杂度将为log(n);

   sum-(-2)=5,我们就开始找,好吧,help数组里没有5,代表不存在

   累加到元素1的时候,sum为1,1-(-2)=3,我们开始寻找help数组中哪个位置的元素开始第一次大于等于3,明显是索引0,所以意思就是说,从arr[0]后面到arr【1】,这一段就是要求的,这一段长度为1

   累加到元素2的时候,sum为-3,-3-(-2)=-1

   这时候,我们要非常注意一个事情,这件事情很重要,算个特殊情况,如果我们此时得到的sum,本身就是小于k的,比如这里,sum是-3,k是-2,我们其实已经不用找了,这一段子序列本身就代表了。

   所以本处则是这个特殊条件,长度为3

  累加到元素3的时候,sum为-3,和上个情况类似,长度为4

  累加到元素4 的时候,sum和为3,3-(-2)=5,在help数组中没有找到,代表不存在

 代码如下:

   

#include <iostream>
#include <algorithm>
using namespace std;
#define  MAXSIZE 1010
int arr[]={3,-2,-4,0,6};
int help[MAXSIZE];
int k=-2;
int len=5;
//sum[i]代表以arr[0]为开头,arr[i]为结尾的子数组的和
//help[i]代表以arr[0]开头 arr[i]结尾的子数组中出现的最大累加和
int getLessestIndex(int num)
{
   int ret=-1;
   int mid;
   int start=0,end=len-1;
   while(start<=end)
   {
	   mid=(start+end)/2;
	   if(help[mid]>=num)
	   {
	     ret=mid;
		 end=mid-1;
	   }
	   else
	   {
		   start=mid+1;
	   }
   }
   return ret;
}
int fun()
{
  int sum=0;
  int i,j;
  int maxnum=0;
  int ret=0;
  int index;
  //help数组初始化
  for(i=0;i<len;i++)
  {
    sum+=arr[i];
	maxnum=max(maxnum,sum);
	help[i]=maxnum;
  }
  sum=0;
  for(i=0;i<len;i++)
  {
    sum+=arr[i];
	if(sum<=k)
	{
		ret=max(ret,i+1);
	}
	else
	{
		index=getLessestIndex(sum-k);
	   if(index!=-1)
	   {
		   ret=max(ret,i-index);
	   }
	}
  }
  return ret;
}
int main()
{
  //初始化help数组
  cout<<fun()<<endl;
  return 0;
}

  

ENVI_基于无人机数据的果树提取与相对健康监测 一、数据处理 1.计算植被指数VDVI或GDVI:Band Math / Spectral Indices 2.制作掩膜:ROI——Threshold——Subset 二、单地块果树提取 1.绘制感兴趣区shp 2.确定果树提取参数:Count Crops 3.输出果树矢量文件:Convert Crops To Shapefile 4.果树相对健康程度分析:Calculate Crop Me... 阅读详情

相关推荐

从零搭建IoT数据中台:STM32+WebSocket实现边缘设备与Web端实时双向通信

本文详细介绍了如何从零搭建基于STM32和WebSocket协议的IoT数据中台,实现边缘设备与Web端的实时双向通信。通过硬件选型、协议设计、服务器搭建及安全优化,提供了一套低延迟、高并发的企业级解决方案,适用于智能农业和工业监控等场景。

tea88的博客 747

【算法】求累加和小于等于aim的最长的子数组(O(N)

题目描述: 给定一个数组arr,值可正,可负,可0;一个整数aim,求累加和小于等于aim的最长子数组,要求时间复杂度O(N) 算法思想: 数组arr: 【7,5 ,5 ,-3, -1】 刚开始的的时候我们要生成两个数组,min_sum_index和min_sum数组。 min_sum[i]的含义是:以i开始向后累加能累加出最小的累加和 min_sum_index[i]的含义是:取得最小累加和的右...

进阶之路 611

scGPT-spatial 复现

文章摘要:Spatial scGPT项目复现流程 本文详细介绍了复现Spatial scGPT项目的完整流程,包含数据预处理、模型训练等关键步骤。首先需要使用scanpy加载H5AD文件并进行归一化、对数变换等预处理。然后构建基因词汇表(vocab),提取基因表达值和空间坐标信息。接着使用DataCollator进行数据分箱、掩码和填充处理。最后搭建TransformerModel进行训练。文章特别指出了需要自行补全的缺失部分,包括基因词汇表构建、空间坐标提取、数据集类定义和训练主循环脚本等。作者还提供了详

victory0431的博客 1681

牛客 未排序整数数组中累加和小于等于给定值的最长子数组长度

题目链接:https://www.nowcoder.com/practice/3473e545d6924077a4f7cbc850408ade?tpId=101&tqId=33082&tPage=1&rp=1&ru=/ta/programmer-code-interview-guide&qru=/ta/programmer-code-intervi...

weixin_30287169的博客 249

ITIL 4 Foundation 自学通关笔记1

ITIL 4 Foundation 自学通关笔记

m0_58817196的博客 949

Python + Google AI 自动修复 Sonar Bug 实践

在工作中总会遇到种种不期而至的需求,比如前段时间突然要修复所有 Sonar Bug,涉及各种琐碎的代码风格问题,包括但不限于语法不规范、废弃注释等问题。这些项目都已经持续开发几年了,Sonar 上的问题层出不穷,各种问题已经累积到了上万个,手动修复不但费时费力,而且过程异常枯燥。

子洋 Blog 2414

有关子数组最大累加和的算法小结

有关子数组最大和的几个小问题的总结

Davidddl的博客 1519

超临界二氧化碳再热再压缩布雷顿循环建模与先进控制

超临界二氧化碳布雷顿循环建模与先进控制研究 本文研究了超临界二氧化碳再热再压缩布雷顿循环系统的建模与控制。通过MATLAB/Simscape构建了包含压缩机、透平、回热器等关键组件的动态模型,并设计了基于模型预测控制(MPC)和自抗扰控制(ADRC)的多层控制策略。系统采用转速控制的压缩机、阀门开度控制的透平,以及可变热源加热器,实现了全动态分析。研究结果表明,MPC与ADRC混合控制方案相较于传统PID控制,功率超调降低至0.9%,效率波动控制在±0.08%,扰动恢复时间缩短至12秒。

AI的内部世界的博客 340

累加和小于等于给定值k的最长子数组

给定一个数组,值可以为正、负和0,请返回累加和为给定值k的最长子数组长度。 思路:定义一个map,存放到当前位置的和(key)与位置(value)。               首先要明确,一个数sum能分成k和(sum-k),那么我们记录下到达(sum-k)的最早位置即map所存储的即是能到达每个值的最早位置,那么剩下的就是k了,也就是sum-k到sum,他们的下标差就是最长序列。 p

grave2015的博客 1190

Halcon实例转OpenCVSharp--粘连物体分割与计数(基于距离变换+分水岭算法) (附源码)

本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp应用实例--粘连物体分割与计数(基于距离变换+分水岭算法)! 本文使用的OpenCVSharp版本---》v4.5.3。 实现目标:将下图中的硬币分割出来并计算数量。 预期效果图: ...

Color Space的博客 2419

R语言LASSO回归作图为什么X轴使用-log(λ)而不是log(λ),如何转化为log(λ)?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!

**My Coding Family** 1015

【困难】未排序数组中累加和小于或等于给定值的最长子数组长度-Java

package live.every.day.ProgrammingDesign.CodingInterviewGuide.ArrayAndMatrix; /** * 未排序数组中累加和小于或等于给定值的最长子数组长度 * * 【题目】 * 给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k。求arr所有的子数组中累加和小于或等于k的最长子数组长度。 * 例如:arr=[3,-2,-4,0,6],k=-2,相加和小于或等于-2的最长子数组为{3,-2,-4,0},所以结果返回4。

了解➔熟悉➔掌握➔精通 434

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

书籍未排序数组中累加和小于或等于给定值的最长子数组长度

5、j=3时,sum[0..3]=-3,所以在helpArr中二分查找大于或等于-3-k=3-(-2)=-1这个值第一次出现的位置,在helpArr中位置是0,对应的arr中的位置是-1,表示一个数都不累加的情况,所以arr[0..3]是满足条件的最长数组。1、arr=[3,-2,-4,0,6],求得arr的累加数组sumArr=[0,3,1,-3,-3,3],进一步求得sumArr的左侧最大值数组[0,3,3,3,3,3]。在这样一个有序的数组中,就可以二分查找大于或等于某一个值的累加和最早出现的位置。

qq_30750287的博客 412

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

左神算法:未排序正数数组中累加和为给定值的最长子数组长度(Java版)

牛客OJ:[未排序数组中累加和为给定值的最长子数组长度] 题目:给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度。本文提供的方法可以做到时间复杂度为O(N)、额外空间复杂度为O(N)。题解:为了说明解法,先定义s 的概念,s(i)代表子数组arr[0..i]所有元素的累加和。那么子数组arr[j..i(] 0≤j≤i<arr.length)的累加和为s(i)-s(j-1),因为根据定义,

寒泉 6万+

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

未排序数组中累加和为给定值的最长子数组系列问题

题目 给定一个无序数组arr 其中元素可正、可负、可0。给定一个整数k,求arr所有的子数组中累加和为k的最长子数组长度。 解答 假设s(i)是子数组arr[0…i]的累加和,那么s(j)就代表arr[0…j]的累加和,那么可求得arr[j+1…i]=s(i)-s(j)。 流程: 初始化变量sum=0,表示从arr[0]一直加到arr[i]的累加和。初始化变量len,表示累加到和为k的最长子数组长度。设置一个map,用来记录出现过的sum值和的它出现的最早位置,即第一次出现的位置。key代表出现过的sum

爱吃鱼的ねこ的博客 1967

未排序数组中累加和小于或等于给定值的最长子数组长度

问题: 给定一个无序数组 arr,其中元素可正、可负、可 0,给定一个整数 k。求 arr 所有的子数组中累加和小于或等于 k 的最长子数组长度。 例如:arr=[3,-2,-4,0,6],k=-2,相加和小于或等于-2 的最长子数组为 {3,-2,-4,0},所以结果返回 4。 要求: 时间复杂度(N*logN) 分析:这个问题和前一篇的问题很像,区别在于本题是小于或等于的。那么我们是否能用

穷理何须格物的博客 3546

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度

算法总结之 未排序数组中累加和小于或等于给定值的最长子数组长度 给定一个无序数组arr,其中元素可正、可负、可0,给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度。 例如: arr=[3,-2,-4,0,6] , k=-2, 相加和小于或者等于-2的最长子数组为{3,-2,-4,0}, 所以结果返回4 解题思想(...

art_code的博客 852

[算法]最长子数组问题

[算法]最长子数组问题 一、未排序正数数组中累加和为给定值的最长子数组长度 题目: 给定一个数组arr,该数组无序,但每个数都是正数,再给定一个正数K。求arr的所有子数组中所有元素相加和为K的最长子数组长度。 例如: arr=[1,2,1,1,1],K=3, 累加和为3的最长子数组为[1,1,1],return 3。 程序: public static int g

qq_39010647的博客 902

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度

算法总结之 未排序正数数组中累加和为给定值的最长子数组长度 例如 arr=[1,2,1,1,1] k=3 累加和为 3的最长子数组为[1,1,1] 所以结果为3 思路方法: 两个指针 left 和right 初始值都是0 都在左边 sum 代表 子数组 left.....right的和 len 一...

art_code的博客 484

未排序数组中累加和为给定值的最长子数组长度

题目描述 给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度 输入描述 第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述 输出一个整数表示答案 代码实现 import java.util.*; public class Main{ p...

皮皮狗 344

未排序正整数组中累加和为指定值的最长子数组长度

题目:给定一个数组arr,该数组无序,但每个值都为正数,在给定一个正数k。求arr中所有的子数组中所有元素累加为k的最长子数组长度。   例如,arr = [1,2,1,1,1],k = 3.   累加和为3的最长子数组为[1,1,1],所以返回结果为3。 基本思路:   使用两个指针left和right,代表子数组的范围,初始时都为 0。使用变量sum记录子数组的累加和,初始为arr[0...

BUPT-WT的博客 409
上一篇: 全是正数的数组中找和等于给定值的最长子数组
下一篇: 自然数组的排序
lycommand
博客等级 码龄14年 31粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值