アプリケーション
前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