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

【EB_Tresos专题】-01-EB Tresos导入工程 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--> 结尾 ... 阅读详情
  • 题目

给定一个无序数组arr,其中元素可正,可负,可0,给定一个整数k。

求arr所有的子数组中累加和为k的最长子数组长度。

  • 分析

为了解答题目,引入一个概念,

s(i)代表子数组arr[0..i]所有元素的累加和。那么子数组arr[j-1, i](0<=j<=i<arr.length)的累加和为s(i)-s(j-1)。

1. 设置变量sum=0,表示从0位置开始一直加到i位置所有元素的和。设置变量len=0,表示累加和为k的最长子数组长度。

定义一个HashMap<Int, int>, 中hapmap的 key是 子数组s(i)的值,value则为该子数组的最后那个元素的下标,即 i 。

该hashmap的内容形如: <s(i), i>, <s(i+1), (i+1)>。

2. 从左到右开始遍历,当前元素为arr[i]

1) sum = sum + arr[i],即s(i),在map中查看是否存在sum-k

    如果sum-k存在,从map中取出sum-k对应的value,记为j,得到s(i)-s(j)=k,所以此时arr[j+1, i]的长度即为题目要求的子数组的长度,如果长度大于len,则更新len。

2) 检查当前的sum(即s(i))是否在map中,若不存在说明是第一次出现,就把记录加入到map中。

* 注意 根据arr[j+1, i]的累加和为s(i)-s(j),所以,如果从0开始累加,则j+1>=1。意味着,所有从0开始的子数组都没有考虑过,所以,应该从-1位置开始累加,也就是在遍历之前,先把(0,-1)放进map,也就是如果任何一个数都不加时,累加和为0。

如果不这样从-1位置开始的话,万一第0个元素的值就是所求的答案,则就会出误报找不到这样的子数字。比如【3,1,2】,K=3。

import java.util.HashMap;
import java.util.Map;

public class _01_Array_maxLength {
    public int maxLength(int[] arr, int k) {
        if (arr == null || arr.length == 0) {
            return 0;
        }
        
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        map.put(0, -1);
        int len = 0;
        int sum = 0;
        for (int i = 0; i < arr.length; i++) {
            sum += arr[i];
            if (map.containsKey(sum - k)) {
                len = Math.max(i - map.get(sum - k), len);
            }
            if (!map.containsKey(sum)) {
                map.put(sum, i);
            }
        }
        return len;
    }
}

 

  • 补充题目

1. 给定一个无序数组arr,其中元素可正,可负,可0。求arr所有的子数组中正数与负数个数相等的最长子数组长度。

 将数组所有的正数都变为1,负数都变为-1,0不变,然后求累加和为0的最长子数组长度。

2.给定一个无序数组arr,其中元素只是1或0。求arr所有的子数组中0和1个数相等的最长子数组长度

 将数组所有的0全部变成-1,1不变,然后求累加和为0的最长子数组长度。


http://www.cnblogs.com/yangtong/p/6648743.html

SOUL.md 人格定制的 7 个高阶技巧:Hermes Agent 精准控制 AI 行为模式 揭示 SOUL.md 的本质是行为契约而非人格设定,介绍7个围绕边界约束的高阶技巧,包括用上下文锚点(INPUT SCOPE/OUTPUT TARGET/CONSTRAINTS)替代角色描述、动态渲染锚点适配CI流程等,显著降低token消耗与人工review耗时。 阅读详情

相关推荐

一天一道算法题(1)---未排序数组中累加和为给定值的最长子数组

题目 给定一个无序数组arr,其中元素可正,可负,可0,给定一个整数k。求arr所有的子数组中累加和为k的最长子数组长度。 分析 为了解答题目,引入一个概念,s(i)代表子数组arr[0..i]所有元素的累加和。那么子数组arr[j-1, i](0<=j<=i<arr.length)的累加和为s(i)-s(j-1)。 1. 设...

weixin_30457465的博客 531

逆向学习:从已上线微信小游戏反推Cocos工程结构(以切水果跑酷为例)

本文以“切水果跑酷”为例,详细介绍了如何通过逆向分析已上线的微信小游戏,反推其基于Cocos Creator的原始工程结构。文章深入拆解了编译后的目录骨架、资源加载逻辑与依赖关系,并重点解析了微信平台API的调用特征,为开发者提供了一种高效学习游戏架构与设计模式的实用方法。

kk1234的博客 1073

有元素和限制的最长子数组问题求解

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 问题 一、问题分析 二、二分查找+前缀和O(nlgn) 三、双指针错误解法(漏洞解法) 四 、史诗级O(n)滑动窗口思想 总结 问题 链接:未排序数组中累加和小于或等于给定值的最长子数组长度__牛客网 来源:牛客网 给定一个无序数组arr,其中元素可正、可负、可0。给定一个整数k,求arr所有的子数组中累加和小于或等于k的最长子数组长度 例如:arr = [3, -2, -4, 0,.

qq_56150055的博客 532

[后端设计]innovus命令editPin详解?

先放命令,有空慢慢写。

m0_61003348的博客 5731

【PB03F 超详细-环境搭建】蓝牙5.2安信可PB-03F-Kit开发板二次开发环境搭建

PB-03是由深圳市安信可科技有限公司开发的蓝牙模块。本博文介绍安信可PB-03F-Kit开发板的基本情况、开发环境搭建,以及以点亮LED为例介绍程序编写和固件烧录的操作流程。 安信可PB-03F-Kit开发板使用的PHY6252这样一款高集成度的低功耗蓝牙系统级芯片(SoC),专为物联网(IoT)、移动设备、可穿戴电子设备、智能家居等各种应用而设计。......

qq_44078824的博客 1万+

程序员代码面试指南---009未排序数组中累加和为给定值的最长子数组长度

题目描述 给定一个无序数组arr, 其中元素可正、可负、可0。给定一个整数k,求arr所有子数组中累加和为k的最长子数组长度。 输入描述 第一行两个整数N, k。N表示数组长度,k的定义已在题目描述中给出 第二行N个整数表示数组内的数 输出描述 输出一个整数表示答案 示例 输入: 5 0 1 -2 1 1 1 输出: 3 解题思路 实现代码 /* * @Description: 未排序数组中累加和为给定值的最长子数组长度 * @Author: * @Date: 2020-10-23 19:

、思考致富的博客 385

MacBook 本地化部署 Dify 指南

dify 怎么安装部署 有哪些坑 !

weixin_44542598的博客 1522

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

摘自:程序员代码面试指南 给定一个无序数组arr,其中元素可正、可负、可0。给定一个整数K,求arr所有的子数组中累加和为K的最长数组长度。 解答: s(i)代表子数组arr[0…i]所有元素的累加和,那么子数组arr[j…i](0 <= j <= i < arr.length)的累加和为s(i) - s(j-1)。 原问题解法只遍历一次arr,具体过程为: 1、设置变量sum = 0,表示从0位置开始一直加到i位置所有元素的和。设置变量len = 0,表示累加和为K的最长子数组长度。设置

CLZHIT的博客 423

原神真端,原神服务端,虚拟机启动部署傻瓜式教学

没玩过抽卡 游戏想体验一下抽卡的感觉,听说原神有真端了,所以弄一个局域网的服务体验一下,这里要感谢一些服务端的分享者。

azyouyouyou的博客 1万+

2、探秘储备池计算:原理、应用与前沿趋势

储备池计算(Reservoir Computing)作为一种新兴的计算方法,起源于计算神经科学和机器学习领域,现已广泛应用于非线性动力系统理论、物理学、材料科学、生物学和机器人学等多个领域。其核心优势在于概念简洁性,通过利用高维动态系统的非线性响应,将学习过程集中在读出层,避免了传统循环神经网络(RNN)训练的复杂性。储备池计算的发展方向主要包括拓展到非线性动态系统和利用物理动态系统作为计算资源(PRC),后者有望突破冯·诺依曼瓶颈,实现边缘计算。理论方面,储备池计算与人类大脑的信息处理方式密切相关,并推动

ggg99的专栏 736

牛客算法-第二章

牛客算法-第二章 1.求两个子数组最大的累加和 2.未排序正数数组中累加和为给定值的最长子数组长度 3.未排序数组中累加和为给定值的最长子数组系列问题 4.未排序数组中累加和小于或等于给定值的最长子数组长度

Jerry Lee の blog 662

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万+

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

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

【题目】未排序数组中累加和小于或等于给定值的最长子数组长度 思路:依次求以数组的每个位置结尾的、累加和小于或等于K的最长子数组长度,其中最长的那个子数组长度就是我们要的结果。 public class MaxLongsLengthSE { public static int maxLength(int[] arr, int k) { int[] helpArr = new int[arr.l...

gkq_tt的博客 474

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

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

题目 分析 解法:哈希 假设s(i)是子数组arr[0…i]的累加和,那么s(j)就代表arr[0…j]的累加和,那么可求得arr[j+1…i]=s(i)-s(j)。 流程: 1.初始化变量sum=0,表示从arr[0]一直加到arr[i]的累加和。初始化变量len,表示累加到和为k的最长子数组长度。设置一个map,用来记录出现过的sum值和的它出现的最早位置,即第一次出现的位置。key代表出现过的sum,value代表第一次出现的位置。 令sum+=arr[i],即s(i),然后在map中查看是否出现过

F13253524870的博客 416

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

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

程序员代码面试指南第二版 124.未排序正数数组中累加和为给定值的最长子数组的长度

welcome to my blog 程序员代码面试指南第二版 124.未排序正数数组中累加和为给定值的最长子数组的长度 题目描述 题目描述 给定一个数组arr,该数组无序,但每个值均为正数,再给定一个正数k。求arr的所有子数组中所有元素相加和为k的最长子数组的长度 例如,arr = [1, 2, 1, 1, 1], k = 3 累加和为3的最长子数组为[1, 1, 1],所以结果返回3 [要求...

littlehaes的博客 327

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

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

art_code的博客 484

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

【题目】给定一个数组arr,该数组无序,但每个值都是正数,再给定一个正数k, 求arr的所有子数组中所有元素相加和为K的最长子数组长度。 思路:两个变量left和right标记子数组左右两头,开始left = 0,right = 0 1.开始时变量left = 0, right = 0,代表子数组arr[left…right]. 2.变量sum始终表示子数组arr[left…right]的和。开始...

gkq_tt的博客 488
上一篇: Redis Memcached 全方位大比拼
下一篇: MySQL insert into ... select 的锁情况 【转】
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值