最大のサブ問題のPythonの製品

アプリケーション

前NUMS = [1,2、-2、-1,5、-4]整数型のリストは、配列(配列含む少なくとも一つの番号)内の連続サブシーケンスの最大の製品を見つけてください

ソリューション1

アイデア解析

:問題の意味の分析は、この質問の要件見つけ; 2.連続したサブ; 1.最大の積
私が連続したサブ開始配列のインデックスであると仮定される。インデックスを終了するJの連続したサブシーケンス、ループの可能なすべての連続したサブシーケンスを横断し、最大の連続サブ缶の積を算出し、
トラバーサル処理についてです。

  • 私が0の場合、jが望ましい0,1,2、...でlen(NUMS)-1。
  • iが1である場合、J好ましくは1,2、...、lenの(NUMS)-1、
    ...
  • 私がlenれる(NUMS)-1、J望ましいLEN(NUMS)-1。

注:私は== jは、それが唯一のシーケンス番号が含まれていることを示している場合。

コードの実装

from functools import reduce

num = [1,2,-2,-1,5,-4]
max = num[0]
max_index_start = 0
max_index_end = 0

for i in range(len(num)):
    for j in range(i, len(num)):
        if i == j:
            cur_num = num[i]
        else:
            cur_list = num[i:j+1]
            # 此处的recude函数表示先对集合中的第 1、2 个元素进行操作,
            #得到的结果再与下一个元素用function函数运算
            cur_num = reduce(lambda x,y:x*y,cur_list)
            
        if cur_num >= max:
            max = cur_num
            max_index_start = i
            max_index_end = j

print(max, max_index_start,max_index_end)

次のように実行結果は以下のとおりです。

20 3 5

上記の結果は、連続したサブシーケンスの最大積20のシーケンスは、連続するシーケンスがNUMS [3]〜NUMSであることが示された[5]

解決策2

アイデア解析

J連続したサブシーケンスの端部添字;同様に、連続するサブフレームは、iは開始添字配列であることが想定されるが:。MUL(I、J)MUL =(0、J)// MUL(0、I 1- )
上記式は解釈される:連続サブシーケンスの積=〔にStartElement:連続したサブシーケンスの終了要素] //製品[要素を起動:連続したサブシーケンスを開始する前に、要素]の積

EG: NUMS = [1,2、-2、-1,5、-4]溶液1を連続サブ[-1.5、-4]の結果から明らかである
上記の式の膨張に5×(-1) ×(-4)= 1×2 ×(-2)×(-1)×5×(-4)// 1×2×(-2)

上記式の分析、次のように要約:

  • MUL(0、J)= 0製品は、番号0が記述されている場合、再起動されます。
  • 場合MUL(0、j)の積<0、最大の製品を確保するため、MUL(0、I-1)が負であるべきで(同じ番号は正である)、この場合には、最大の負を探しされるべきです。
  • 場合MUL(0、j)が> 0の積、最大の製品を確保するために、MUL(0、I-1)(正の数が同じである)正のようでなければならない。この場合、最小値は負であるべきである見つけること。

コードの実装

def maxMul(nums):
    if not nums: return
    #起始变量
    #目前的累乘
    cur_mul = 1

    #前面最小的正数
    min_pos = 1

    #前面最大的负数
    max_neg = float("-inf")

    #结果
    result = float("-inf")

    for num in nums:
        cur_mul *= num

        if cur_mul > 0:
            result = max(result, cur_mul//min_pos)
            min_pos = min(min_pos, cur_mul)

        elif cur_mul < 0 :
            if max_neg != float("-inf"):
                result = max(result, cur_mul//max_neg)
            else:
                #如果是-inf,结果更新为当前值和结果的最大值
                result = max(result,num)
            #找最大的负数
            max_neg = max(max_neg, cur_mul)
        else:
            cur_mul = 1
            min_pos = 1
            max_neg = float("-inf")
            result = max(result,num)
    return result

data = [1,2,-2,0,5,-4]
print(maxMul(data))

data1 = [1,2,-2,-1,5,-4]
print(maxMul(data1))

次のように実行結果は以下のとおりです。

5
20
公開された21元の記事 ウォンの賞賛6 ビュー8001

おすすめ

転載: blog.csdn.net/weixin_42128329/article/details/104277464