Interview----最长连续乘积字串
题目描述:
给一个浮点数序列,取最大乘积连续子串的值,例如 -2.5,4,0,3,0.5,8,-1,则取出的最大乘积连续子串为3,0.5,8。
也就是说,上述数组中,3 0.5 8这3个数的乘积3*0.5*8=12是最大的,而且是连续的。
算法1:
首先,枚举的话,复杂度是 O(N^2)
算法2:O(N)
首先发现这个题与最长连续子数组的和非常类似。
考虑用 D.P. 来求解。
定义 max_vec[i] ----- 以 a[i] 结尾的子数组的最大乘积
min_vec[i] ------ 以 a[i] 结尾的子数组的最小乘积。
为什么要定义 min_vec 呢?? 稍微讲解。。
现在考虑,如何求解 max_vec[i]??
它的值有以下两种可能:
1. a[i]
2. a[i] * 【a[i] 前面连续的若干个元素的乘积】;
1> if a[i] >= 0,为了让乘积最大,我们取 a[i] * max_vec[i-1] 即可;
2> if a[i] < 0, 为了让乘积最大,我们希望 【a[i]前面连续个若干个元素的乘积】越小越好,因此取 a[i] * min_vec[i-1]
从上面的分析,已经证明了 问题的最优子结构,所以 D.P. 可行。
代码如下:
/**
* @file max-multiphy.cc
* @brief max multiphy of a vector
* @author shoulinjun@126.com
* @version 0.1.00
* @date 2014-03-26
*/ #include <iostream>
#include <vector>
using namespace std; double MaxMultiply(double *a, int n)
{
double result(a[0]);
vector<double> max_vec(n), min_vec(n);
max_vec[0] = a[0];
min_vec[0] = a[0]; for(int i=1; i<n; ++i)
{
max_vec[i] = max(a[i], max(a[i]*min_vec[i-1], a[i]*max_vec[i-1]));
min_vec[i] = min(a[i], min(a[i]*min_vec[i-1], a[i]*max_vec[i-1]));
result = max(result, max_vec[i]);
}
return result;
}
Interview----最长连续乘积字串的更多相关文章
- 返回字符串中最长连续相同字串的长度---正则实现与JavaScript实现
JavaScript 实现 let str = 'AAABBAACCAAAADDE' function continuousString(str) { let finalObj = {} let te ...
- 动态规划--求最大连续子数组的和(Python实现)&求解最大连续乘积字串(Python实现)
def MaxSum(self,array,n): sum=array[0] result=array[0] for i in range(0,n): if sum<0: sum=a[i] el ...
- 最长公共字串(LCS)最长连续公共字串(LCCS)
链接1:http://blog.csdn.net/x_xiaoge/article/details/7376220 链接2:http://blog.csdn.net/x_xiaoge/article/ ...
- leetcode-3 最长无重复字串
3. Longest Substring Without Repeating Characters 题面 Given a string, find the length of the longest ...
- 最长连续回文串(最优线性时间O(n))
转自:http://blog.csdn.net/hopeztm/article/details/7932245 Given a string S, find the longest palindrom ...
- 马拉车 o(n)(最长连续回文串) hdu 3068
#include<bits/stdc++.h> ; using namespace std; +]; string manacher(string ss) { string tt=&quo ...
- (字符串)最长公共字串(Longest-Common-SubString,LCS)
题目: 给定两个字符串X,Y,求二者最长的公共子串,例如X=[aaaba],Y=[abaa].二者的最长公共子串为[aba],长度为3. 子序列是不要求连续的,字串必须是连续的. 思路与代码: 1.简 ...
- 最长公共子序列(LCS)问题 Longest Common Subsequence 与最长公告字串 longest common substr
问题描述:字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X=“x0,x1,…,xm-1”,序列Y=“y0,y1,…,yk ...
- URAL 1517 Freedom of Choice(后缀数组,最长公共字串)
题目 输出最长公共字串 #define maxn 200010 int wa[maxn],wb[maxn],wv[maxn],ws[maxn]; int cmp(int *r,int a,int b, ...
随机推荐
- [saiku] JCR在saiku中的运用原理
转载自: 什么是JAVA内容仓库(Java Content Repository)(1) 什么是JAVA内容仓库(Java Content Repository)(2) 什么是JAVA内容仓库(Jav ...
- Qt之Threads和QObjects
简述 QThread继承自QObject,它发射信号(signals)以表明线程执行开始或结束,并提供了一些槽函数(slots). 更有趣的是,QObjects可以在多线程中使用,发射信号以在其它线程 ...
- Qt之QSizePolicy
简述 QSizePolicy类是一个描述布局水平和垂直方向调整策略的属性. 大小策略会影响布局引擎处理部件的方式,部件加入布局以后,会返回一个QSizePolicy,描述了其水平和垂直方向的大小策略. ...
- hdu 2818 Building Block
Building Block Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
- Uva---10881 Piotr's Ants(蚂蚁)
Problem DPiotr's AntsTime Limit: 2 seconds "One thing is for certain: there is no stopping them ...
- nyoj-----127星际之门(一)
星际之门(一) 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 公元3000年,子虚帝国统领着N个星系,原先它们是靠近光束飞船来进行旅行的,近来,X博士发明了星际之门 ...
- springmvc:BeanNameViewResolver访问内部资源视图对象和访问外部资源视图对象
<!-- 处理器映射器 --> <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerM ...
- 318. Maximum Product of Word Lengths ——本质:英文单词中字符是否出现可以用26bit的整数表示
Given a string array words, find the maximum value of length(word[i]) * length(word[j]) where the tw ...
- sqlserver获取表名,字段名
一.获取表的基本信息 SELECT [TableName] = [Tables].name , [TableOwner] = [Schemas].name , [TableCreateDate] = ...
- javaWeb开发总结 ---- 前端数据插入到后台
一,概述: 本文主要描述如何将数据通过表单提交到后台并插入到数据库.其中后台使用spring框架. 二,开发流程: 明确需求,即将什么数据插入到数据库 平台搭建,配置spring, 数据库,建表 走通 ...