问题1:

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

问题2:

/**
* 问题描述:
* 给定一个无序数组arr,其中元素只是1或0,
* 求arr所有的子数组中0和1个数相等的最长子数组长度。
*
* 解题思路:对数组进行处理,将0变为-1,求和是0的最长子数组长度
*/

问题1、2都可以归结到一个问题:

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

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

代码如下:

/** @brief
* 给定一个无序数组arr,其中元素可正、可负、可0,再给定一个整数k
* 求arr所有的子数组中累加和为k的最长子数组长度
*
* @param arr[] int
* @param length int -数组长度
* @param k int -累加和为k
* @return int
*
*/
int longestSubArrayLength(int arr[], int length, int k)
{
hash_map<int, int> sumIdxMap;
sumIdxMap.insert(make_pair(, -)); int sum = ;
int ret = ;
for(int i = ; i < length; ++i)
{
sum += arr[i];
if(sumIdxMap.find(sum - k) != sumIdxMap.end())
{
ret = max(ret, i - sumIdxMap[sum - k]);
} if(sumIdxMap.find(sum) != sumIdxMap.end())
{
sumIdxMap.insert(make_pair(sum, i));
}
} return ret;
}

说明:为了将算法的时间复杂度限定到O(n),这里使用了C++下的hash_map(map是基于红黑树的,存取复杂度是O(logn)),其存取的时间复杂度均是O(1)。
由于hash_map是非STL中的容器,所以需要添加相应的头文件及命名空间。

/**
* Linux下
*/
#include <hash_map>
using namespace __gnu_cxx;

windows直接添加头文件即可使用。

和为k的最长子数组及其延伸的更多相关文章

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

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

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

    累加和为 K 的最长子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的最长子数组问题 CSDN:累加和为 K 的最长子数组问题 题目描述 给定一个整数组成的无序数组 arr,值可能正.可 ...

  3. 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 ...

  4. [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 ...

  5. 转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中

    转:http://www.itmian4.com/thread-6504-1-1.html 最小区间原题 k个有序的数组,找到最小的区间范围使得这k个数组中,每个数组至少有一个数字在这个区间范围内.比 ...

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

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

  7. Leetcode 629.K个逆序对数组

    K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且  ...

  8. 和至少为K的最短子数组

    返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A =  ...

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

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

随机推荐

  1. Delphi 关于DBGrid多选删除(shitf多选,ctrl多选)

    ////删除多选记录 procedure THistoryForm.DeleteButtonClick(Sender: TObject);var  tempBookMark:TbookMark;  i ...

  2. poj 1511 Invitation Cards(最短路中等题)

    In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...

  3. UDP ------ UDP Broadcast Address

    Related information link : 百度百科---->广播地址 Use restrictions: 1. You can only broadcast on the same ...

  4. php 访问错误日志

    /usr/local/php/var/log/php-fpm.log」—————————

  5. CSS变量试玩儿

    CSS很美妙,能够为您的页面穿上衣裳,各种各样五彩斑斓的衣裳,但是对于开发者来说,他又不够灵动,于是乎有了各种各样的预处理器Sass.LESS.Stylus(笔者建议Sass的SCSS语法),这些预处 ...

  6. ActiveMQ基础教程JMS概述

    什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息 ...

  7. html5 canvas画布上合成

    source-over 默认.在目标图像上显示源图像. source-atop 在目标图像顶部显示源图像.源图像位于目标图像之外的部分是不可见的. source-in 在目标图像中显示源图像.只有目标 ...

  8. 原生JavaScript技巧大收集(1~10)

    1.原生JavaScript实现字符串长度截取 01 function cutstr(str, len) { 02     var temp; 03     var icount = 0; 04    ...

  9. mysql统计一个字段的多种状态

    假如我有下面的表:ID    Item           status            updatetime    author1    a        1        2014-01-0 ...

  10. 基于canvas将图片转化成字符画

    字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...