和为k的最长子数组及其延伸
问题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的最长子数组及其延伸的更多相关文章
- 数组中累加和小于等于k的最长子数组
问题描述: 给定一个无序数组arr,其中元素可正.可负.可0,给定一个整数 k.求arr所有的子数组中累加和小于或等于k的最长子数组长度.例如:arr=[3,-2,-4,0,6],k=-2,相加和小于 ...
- 累加和为 K 的最长子数组问题
累加和为 K 的最长子数组问题 作者:Grey 原文地址: 博客园:累加和为 K 的最长子数组问题 CSDN:累加和为 K 的最长子数组问题 题目描述 给定一个整数组成的无序数组 arr,值可能正.可 ...
- 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 ...
- [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 ...
- 转:最小区间:k个有序的数组,找到最小区间使k个数组中每个数组至少有一个数在区间中
转:http://www.itmian4.com/thread-6504-1-1.html 最小区间原题 k个有序的数组,找到最小的区间范围使得这k个数组中,每个数组至少有一个数字在这个区间范围内.比 ...
- 数组中累加和为k的最大子数组的长度
package com.hzins.suanfa; import java.util.HashMap; public class demo { /** * 数组中累加和为k的最大子数组的长度 * @p ...
- Leetcode 629.K个逆序对数组
K个逆序对数组 给出两个整数 n 和 k,找出所有包含从 1 到 n 的数字,且恰好拥有 k 个逆序对的不同的数组的个数. 逆序对的定义如下:对于数组的第i个和第 j个元素,如果满i < j且 ...
- 和至少为K的最短子数组
返回 A 的最短的非空连续子数组的长度,该子数组的和至少为 K 如果没有和至少为 K 的非空子数组,返回 -1 . 示例 1: 输入:A = [1], K = 1 输出:1 示例 2: 输入:A = ...
- 左神算法进阶班4_2累加和为aim的最长子数组
[题目] 给定一个数组arr,和一个整数aim,求在arr中,累加和等于num的最长子数组的长度 例子: arr = { 7,3,2,1,1,7,7,7 } aim = 7 其中有很多的子数组累加和等 ...
随机推荐
- Delphi 关于DBGrid多选删除(shitf多选,ctrl多选)
////删除多选记录 procedure THistoryForm.DeleteButtonClick(Sender: TObject);var tempBookMark:TbookMark; i ...
- poj 1511 Invitation Cards(最短路中等题)
In the age of television, not many people attend theater performances. Antique Comedians of Malidine ...
- UDP ------ UDP Broadcast Address
Related information link : 百度百科---->广播地址 Use restrictions: 1. You can only broadcast on the same ...
- php 访问错误日志
/usr/local/php/var/log/php-fpm.log」—————————
- CSS变量试玩儿
CSS很美妙,能够为您的页面穿上衣裳,各种各样五彩斑斓的衣裳,但是对于开发者来说,他又不够灵动,于是乎有了各种各样的预处理器Sass.LESS.Stylus(笔者建议Sass的SCSS语法),这些预处 ...
- ActiveMQ基础教程JMS概述
什么是JMS JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息 ...
- html5 canvas画布上合成
source-over 默认.在目标图像上显示源图像. source-atop 在目标图像顶部显示源图像.源图像位于目标图像之外的部分是不可见的. source-in 在目标图像中显示源图像.只有目标 ...
- 原生JavaScript技巧大收集(1~10)
1.原生JavaScript实现字符串长度截取 01 function cutstr(str, len) { 02 var temp; 03 var icount = 0; 04 ...
- mysql统计一个字段的多种状态
假如我有下面的表:ID Item status updatetime author1 a 1 2014-01-0 ...
- 基于canvas将图片转化成字符画
字符画大家一定非常熟悉了,那么如何把一张现有的图片转成字符画呢?HTML5让这个可能变成了现实,通过canvas,可以很轻松实现这个功能.其实原理很简单:扫描图片相应位置的像素点,再计算出其灰度值,根 ...