累加和为 K 的最长子数组问题

作者:Grey

原文地址:

博客园:累加和为 K 的最长子数组问题

CSDN:累加和为 K 的最长子数组问题

题目描述

给定一个整数组成的无序数组 arr,值可能正、可能负、可能0,给定一个整数值 K,找到 arr 的所有子数组里,哪个子数组的累加和等于 K,并且是长度最大的,返回其长度。

OJ 见:LintCode 911 · Maximum Size Subarray Sum Equals k

主要思路

使用哈希表,key 存累加和,value 存当前位置,所以,

map.put(sum,i)

表示0...i的累加和是sum

有了这个哈希表,我们可以继续遍历数组,当遍历到i位置的时候,我们可以得到当前的累加和是sum,我们期待哈希表中是否存在sum - k的记录,如果有,说明

i - map.get(sum - k)就是一个可能的答案,示例图如下

我们每次来到一个i位置,就要定位上图中m的位置,即i - map.get(sum-k)的值。

然后和全局答案进行比较,抓取最大长度即可。

代码见:

public class Solution {
public static int maxSubArrayLen(int[] arr, int k) {
if (arr == null) {
return 0;
}
Map<Integer, Integer> map = new HashMap<>();
map.put(0, -1);
int ans = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
// 期待map里面有sum - k的记录
if (map.containsKey(sum - k)) {
ans = Math.max(ans, i - map.get(sum - k));
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return ans;
}
}

注:map.put(0, -1);这一句很有必要,表示在一个元素都没有的情况下,已经可以得到一个累加和为 0 的数组了。

整个算法的时间复杂度是O(N),空间复杂度O(N)

有了上述算法模型,面对这题: LeetCode 525. Contiguous Array

给定一个整数组成的无序数组 arr,值可能正、可能负、可能0,找到 arr 的所有子数组里,数组中 1 和 0 一样多的子数组最长的长度

只需要预处理一下原数组,遇到0变为-1,遇到1保持1,遇到其他变为0,接下来求子数组之和为0的最大子数组长度,复用上述算法模板即可。

代码如下

class Solution {
public static int findMaxLength(int[] arr) {
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
arr[i] = -1;
}
}
// 转换为累加和等于K的最长子数组长度
Map<Integer, Integer> map = new HashMap<>(arr.length);
map.put(0, -1);
int ans = 0;
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += arr[i];
if (map.containsKey(sum)) {
ans = Math.max(ans, i - map.get(sum));
}
if (!map.containsKey(sum)) {
map.put(sum, i);
}
}
return ans;
}
}

更多

算法和数据结构笔记

累加和为 K 的最长子数组问题的更多相关文章

  1. 数组中累加和小于等于k的最长子数组

    问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...

  2. 和为k的最长子数组及其延伸

    问题1: /** * 问题描述: * 给定一个无序数组arr,其中元素可正.可负.可0, * 求arr所有的子数组中正数与负数个数相等的最长子数组长度 * * 解题思路:对数组进行处理,正数为1,负数 ...

  3. 数组中累加和为k的最大子数组的长度

    package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...

  4. 左神算法进阶班4_2累加和为aim的最长子数组

    [题目] 给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度 例子: arr = { 7,3,2,1,1,7,7,7 } aim = 7 其中有很多的子数组累加和等 ...

  5. 左神算法进阶班8_1数组中累加和小于等于aim的最长子数组

    [题目] 给定一个数组arr,全是正数:一个整数aim,求累加和小于等于aim的,最长子数组,要求额外空间复杂度O(1),时间复杂度O(N) [题解] 使用窗口: 双指针,当sum <= aim ...

  6. 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    [抄题]: Given an array nums and a target value k, find the maximum length of a subarray that sums to k ...

  7. [LeetCode] 325. Maximum Size Subarray Sum Equals k 和等于k的最长子数组

    Given an array nums and a target value k, find the maximum length of a subarray that sums to k. If t ...

  8. 算法进阶面试题04——平衡二叉搜索树、AVL/红黑/SB树、删除和调整平衡的方法、输出大楼轮廓、累加和等于num的最长数组、滴滴Xor

    接着第三课的内容和讲了第四课的部分内容 1.介绍二叉搜索树 在二叉树上,何为一个节点的后继节点? 何为搜索二叉树? 如何实现搜索二叉树的查找?插入?删除? 二叉树的概念上衍生出的. 任何一个节点,左比 ...

  9. 累加和为 K 的子数组问题

    累加和为 K 的子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的子数组问题 CSDN:累加和为 K 的子数组问题 题目说明 数组全为正数,且每个数各不相同,求累加和为K的子数组组合有哪 ...

随机推荐

  1. 贝壳自动化测试平台sosotest 学习记录

    手工测试VS自动化测试 用例执行: 手动执行 自动执行 是否需要些脚本: 需要 不需要 测试报告生成: 手动 自动 常见的测试技术 关键字驱动的测试框架 RobotFRamework 单元测试框架 自 ...

  2. mybatis查询的三种方式

    查询最需要关注的问题:①resultType自动映射,②方法返回值:  interface EmpSelectMapper: package com.atguigu.mapper; import ja ...

  3. dolphinscheduler简单任务定义及复杂的跨节点传参

    dolphinscheduler简单任务定义及跨节点传参 转载请注明出处 https://www.cnblogs.com/funnyzpc/p/16395094.html 写在前面 dolphinsc ...

  4. 5-8 Resource 静态资源服务器

    静态资源服务器 什么是静态资源服务器 我们无论做什么项目,都会有一些页面中需要显示的静态资源,例如图片,视频文档等 我们一般会创建一个单独的项目,这个项目中保存静态资源 其他项目可以通过我们保存资源的 ...

  5. kubernetes 静态存储与动态存储

    静态存储   Kubernetes 同样将操作系统和 Docker 的 Volume 概念延续了下来,并且对其进一步细化.Kubernetes 将 Volume 分为持久化的 PersistentVo ...

  6. 零基础学Java(10)面向对象-使用LocalDate类完成日历设计

    前言 在我们完成这个日历设计前,需要了解Java中的预定义类LocalDate的一些用法 语法 LocalDate.now() // 2022-07-01 会构造一个新对象,表示构造这个对象时的日期. ...

  7. DelayQueue达到定时触发效果

    DelayQueue的特点就是插入Queue中的数据可以按照自定义的delay时间进行排序.只有delay时间小于0的元素才能够被取出. 这样子,只要开启一个线程循环从DelayQueue中取值执行, ...

  8. python 生成Windows快捷方式

    此处以虚拟机镜像快捷方式为例 link_filepath:快捷方式的生成路径 win32_cmd:需要执行的应用程序 arg_str:exe的参数 快捷方式的目标:由win32_cmd + arg_s ...

  9. 2536-springsecurity系列--关于session管理1

    版本信息 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring ...

  10. YII学习总结5(视图)

    <?php namespace app\controllers; use yii\web\Controller; class HelloController extends Controller ...