查找最小和最大之间最长子序列的最大乘积


22

输入:

大于零的整数的非空序列,其长度大于1。

输出:

序列的最小和最大元素之间的最长子序列的所有元素的最大乘积,包括其自身。

注意:

因为最小和最大元素可以重复,所以必须找到确定的答案才能找到可能的最长子序列,该子序列的一端是序列的最小元素,而另一端是序列的最大元素。如果存在多个最长子序列,则选择乘积最大的子序列。

例子:

第一个例子:

输入: [5, 7, 3, 2, 1, 2, 2, 7, 5]

输出: 42

说明: min == 1max == 7。有2个可能的子序列,末端分别为min和max:[1, 2, 2, 7][7, 3, 2, 1]。它们的长度相等,因此比较乘积:7*3*2*1 == 421*2*2*7 == 28。因为42 >= 28,请回答:42

第二个例子:

输入: [1, 2, 2, 2, 4, 3, 3, 1]

输出: 32

说明: min == 1max == 4。2个子序列:[1, 2, 2, 2, 4][4, 3, 3, 1]。的长度[1, 2, 2, 2, 4]大于的长度[4, 3, 3, 1]。产品:1*2*2*2*4 == 32=>答案是32

3d范例:

输入: [1, 2, 3, 4, 3, 3, 1]

输出: 36

简短说明: min == 1max == 4。2个子序列:[1, 2, 3, 4][4, 3, 3, 1]1*2*3*4 == 244*3*3*1 == 3636 >= 24=>答案是36

第四个例子:

输入: [2, 2, 2]

输出: 8

说明: min == 2max == 2。2个不同的子序列:[2, 2][2, 2, 2]。的长度[2, 2, 2]大于的长度[2, 2]。产品:2*2*2 == 8=>答案是8

更多(随机)示例:

>>>[7, 2, 3, 6, 8, 6, 2, 5, 4, 3]
288
>>>[3, 3, 8, 9, 1, 7, 7, 2, 2, 4]
9
>>>[3, 2, 6, 5, 4, 1, 8, 8, 7, 9]
4032
>>>[7, 4, 2, 8, 8, 3, 9, 9, 5, 6]
31104

检查您的解决方案:

这是Python 3 lambda (788字节),它满足任务要求:

lambda O: __import__('functools').reduce(__import__('operator').mul,O[[[slice(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1),slice(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1)][__import__('functools').reduce(__import__('operator').mul,O[O.index(min(O)):(len(O)-1-O[::-1].index(max(O)))+1],1)>=__import__('functools').reduce(__import__('operator').mul,O[O.index(max(O)):len(O)-1-O[::-1].index(min(O))+1],1)],slice(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1),slice(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)][(len(range(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1))>len(range(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)))-(len(range(O.index(min(O)),(len(O)-1-O[::-1].index(max(O)))+1))<len(range(O.index(max(O)),len(O)-1-O[::-1].index(min(O))+1)))]],1)

优胜者:

最短的解决方案将获胜。接受所有编程语言。

PS:我很乐意为您提供解决方案的说明

Answers:


5

果冻,14字节

.ịạ/;L;P
ẆÇ€ṀṪ

在线尝试!

怎么运行的

ẆÇ€ṀṪ     Main link. Argument: A (array)

Ẇ         Window; generate all substrings of A.
 ǀ       Map the helper link over the substrings.
   Ṁ      Take the maximum.
    Ṫ     Tail; select the last element.


.ịạ/;L;P  Helper link. Argument: S (array / substring)

.ị        At-index 0.5; select the last and first element of S.
  ạ/      Reduce by absolute difference.
    ;L    Append the length of S.
      ;P  Append the product of S.

5

果冻,15 字节

NMpMr/€LÐṀịµP€Ṁ

TryItOnline!

怎么样?

NMpMr/€LÐṀịµP€Ṁ - Main link: list of integers, L
           µ    - links to the left as a monadic chain with argument L
N               - negate elements of L
 M              - indexes of maximal elements (i.e. indexes of minimal elements of L)
   M            - indexes of maximal elements of L
  p             - Cartesian product of the min and max indexes
     /€         - reduce each list (all of which are pairs) with the dyad:
    r           -     range(a,b)  (note if a>b this is [a,a-1,...,b])
        ÐṀ      - filter keeping those with maximal
       L        -     length
          ị     - index into L (vectorises)   (get the values)
            P€  - product of a list for €ach
              Ṁ - maximum

5

Perl 6、108字节

{max ([*] $_ for .[.grep(+.max(+*)) with (for .min,.max,.max,.min {.first($^a,:k).. .first($^b,:k,:end)})])}

3

R,146字节

z=apply(expand.grid(which(max(x<-scan())==x),which(min(x)==x)),1,function(y)c(prod(x[y[1]:y[2]]),abs(diff(y))));max(z[1,which(z[2,]==max(z[2,]))])

棘手的挑战,因为长度的要求。也很烦人,因为可能有用的内置函数which.max仅返回遇到的第一个最大值的索引,迫使我改为使用which(max(x)==x)... 3次。那好吧...

可读性:

x <- scan()

maxs <- which(max(x)==x)
mins <- which(min(x)==x)
q <- expand.grid(maxs,mins)
z <- apply(q,1,function(y){
  c(prod(x[y[1]:y[2]]), abs(diff(y)))
  })

max(z[1, which(z[2, ]==max(z[2, ]))])

2

PHP,189个 173 166字节

<?foreach($a=$_GET[a]as$p=>$b)foreach($a as$q=>$c)$b>min($a)|$c<max($a)?:$r[$d=abs($p-$q)+1]=array_product(array_slice($a,min($p,$q),$d));ksort($r);echo max(end($r));

同样懒惰,但短了33个字节(必须添加10个字节才能将代码段转换为程序):

  1. 循环$p/$b$q/$c遍历数组;如果$b==min$c==max
    则将子序列的乘积添加到$r[sub-sequence length]
  2. 分类 $r按键。
  3. 打印最后一个元素的最大值。

使用数组作为GET参数在浏览器中调用a
例:script.php?a[]=5&a[]=7&a[]=3&a[]=2&a[]=1&a[]=2&a[]=2&a[]=7&a[]=5


2

Mathematica,122个字节

(g=#;Sort[{#.{-1,1},Times@@Take[g,#]}&/@Sort/@Join@@Outer[List,Sequence@@(Union@@Position[g,#@g]&/@{Max,Min})]][[-1,-1]])&

惊讶的是,结果竟然如此。首先生成最小值和最大值外观的笛卡尔积(根据Jonathan Allan的Jelly答案),然后计算那些游程及其乘积的长度,并通过采用排序结果的最后一个元素来选择合适的乘积。


1

JavaScript,187个字节

f=
(l,M=Math,a=M.min(...l),z=M.max(...l),r=(m,n)=>[eval(l.slice(b=l.indexOf(m),c=l.lastIndexOf(n)+1).join`*`),M.abs(b-c)])=>(u=r(a,z),v=r(z,a),u[1]>v[1]?u[0]:v[1]>u[1]?v[0]:M.max(v[0],u[0]))


console.log([
  [5, 7, 3, 2, 1, 2, 2, 7, 5],
  [1, 2, 2, 2, 4, 3, 3, 1],
  [1, 2, 3, 4, 3, 3, 1],
  [2, 2, 2],
  [7, 2, 3, 6, 8, 6, 2, 5, 4, 3],
  [3, 3, 8, 9, 1, 7, 7, 2, 2, 4],
  [3, 2, 6, 5, 4, 1, 8, 8, 7, 9],
  [7, 4, 2, 8, 8, 3, 9, 9, 5, 6]
].map(a=>`[${a}] => ${f(a)}`).join`
`)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.