一道猿题库笔试题解答: 只包含1和-1的数组,如: [1, -1, 1, 1, 1, -1] 求其中和为0的最长连续子数组
来源:互联网 发布:美乎机油广州门市部 编辑:程序博客网 时间:2024/06/05 03:07
中午吃饭时一位同学说了一道猿题库的一道题,觉得很有意思。分享一下解决思路和代码。
思路
最开始想了分治法和动态规划,都觉得不适用,规律性不明显。
后来觉得必须将这些值(1和-1)转换成一种直接可判断是否和为0的表达方式。由此想到了一个基本原理,如果该数组(名字为arry)中,sum(arry[m], ... ,arry[n])为0,那么必然有sum(arry[0], ..., arry[m-1]) == sum(arry[0], ..., arry[n])。
实例
下面是个简单的例子,方框中是各个元素,假设最左侧元素下标为0。如果我们定义s[i] = sum(arry[0], ...,arry[i]),那么s[i]的值如数组下面的所示(一共15个元素):
根据这个原理,我们已经把何为0的子串的特征值,变为S[i]相等这一条件。比如,s[1] =s[3]=s[5]=s[7]=s[9]=s[13]=1(标记为红色),那么arry[2], arry[3]的和为0,arry[2],...,arry[5]的和为0,arry[2],...,arry[13]也为0。
同样,考虑标记蓝色的部分,arry[1], arry[2]的和为0, arry[1],..., arry[14]的和也为0。
与问题的对应
我们只需要找出S[i]的各种值的出现位置,然后求得位置的差的最大值即可。比如,上面例子中:
1) s[1] =s[13]=2;
2) s[0]=s[14]=1;
3) s[8]=s[10] = 3;
4) s[9]=s[10] = 4;
我们得到相应你给的最大子串长度分别为 13-1 = 12; 14-0=14; 10-8=2; 10-9=1。因此,最大的和为0子串长度为14。
以下是志坚点击打开链接同学贡献的代码
<span style="font-size:18px;">/* * test.cpp * * Created on: 2016年9月7日 * Author: zh-jian */#include <vector>#include <map>#include <iostream>using namespace std;/* * 描述: * arr 为只包含1 和 -1的数组,如: * [1 -1 1 1 1 -1] * 求其中和为0的最长连续子数组 * */int maxLen(vector<int> &arr){int mmax = 0,sum = 0;map<int,int> m;//m[s] = i; 表示i是,字段[1:k]和为s的最小的km[0] = 0;//边界for(int i = 0;i<arr.size();i++)if(m.find(sum+=arr[i])==m.end())//没出现过summ[sum] = i+1;else if(i+1-m[sum]>mmax)//出现过,更新长度mmax = i+1-m[sum];return mmax;}//测试程序//输入格式://3//1 -1 1int main(){int n;cin >>n;vector<int> arr(n);for(int i = 0;i<n;i++)cin >> arr[i];printf("max len:%d\n",maxLen(arr));return 0;}</span>
- 一道猿题库笔试题解答: 只包含1和-1的数组,如: [1, -1, 1, 1, 1, -1] 求其中和为0的最长连续子数组
- 求一个只包含0,1,-1的数组,和为0的最长子串的长度
- 面试题:给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的
- 输入整形数组,数组里有正数也有负数,数组中一个或连续的多个整数组成数组的子数组,求所有子数组中和的最大值 ,例如输入的数组为{1,-2,3,10,-4,7,2,-5}和最大的子数组为{3,10,
- 1维连续子数组和2维连续子数组的最大和
- 求连续子数组的最大和---2017滴滴笔试编程1
- 找出数组中和为N+1的的所有组合
- 和为s的连续正整数数列 and 未排序正数数组中和为s的最长子数组长度
- 数组最长连续递增(+1)子序列
- 给定一个二进制数组,找到一个连续的0和1相等的最大子数组。
- 猿辅导2017校园招聘笔试题 求和为0的最长连续子数组
- 一个正负数组,求其最大的连续子串和
- 最长连续子数组和为0
- java实现连续子数组的最大和(子向量的长度至少是1)
- 求数组最长的和为0的连续子数组
- leetcode 525. Contiguous Array 统计1和0数量相等的最长子数组
- 微软:找出数组中和为N+1的的组合个数
- 最长连续子数组的和
- html5无法调用Android本地方法的一种情况(因混淆)
- Android 关于“NetworkOnMainThreadException”出错提示的原因及解决办法
- 如何解析本地和线上XML文件获取相应的内容
- Parsing with compositional vector grammars 实现
- No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).
- 一道猿题库笔试题解答: 只包含1和-1的数组,如: [1, -1, 1, 1, 1, -1] 求其中和为0的最长连续子数组
- Java中的<<符号的理解
- MySQL字符函数
- nginx 做proxy 不转发 http header问题解决
- mysql之TIMESTAMP(时间戳)用法详解
- 关于JavaScript中.round()函数的运用
- MicrosoftWindows[版本 6.1.7600]版本号是啥意思
- 点击按钮 加载更多
- 怎么实现CorelDRAW中轮廓图工具的快速运用