1.配列の最小回転を探します
記述のような、アレイを回転させる[-2、3、5、6、9、-10、-5]、右への良好な部分の動きを作るために、左列の配列によって特徴づけられます。
[思考]バイナリサーチ
def find_min(li):
l = 0
r = len(li)
m = int(r/2)
if li[l] < li[m]:
# 此时是左边递增,最小值位于右边
return find_min(li[m+1:r])
elif li[l] > li[m]:
# 最小值位于mid左面,包含mid
return find_min(li[l:m+1])
else:
return li[mid]
2.ゼロと配列
記述要素と0にサブアレイ最も近い
[アイデアは】 1-nおよび素子S(N)と呼ばれる、2つのケースがあり、S(n)とS(m)は(n)は-S 。第二は、それが隣接する二つの貧しいかかります、ソートすることができます。ソート複雑nlog(n)です。
from collections import OrderedDict
from copy import deepcopy
def get_mini_sublist(li):
part1_index = {}
part2_index = {}
# 第一部分,前n项求和
for i in range(1, len(li)):
part1_index[(0, i)] = sum(li[:i])
part1_index = OrderedDict(sorted(part1_index.items(), key=lambda x:x[1] ))
# 第二部分,排序,做差
t1 = deepcopy(part1_index).popitem(last=True),
t2 = deepcopy(part1_index).popitem(last=False)
for i,j in zip(t1.items(), t2.items()):
part2_index[(i[0][1], j[0][1])] = j[1]-i[1]
# 融合,然后取值最小值
part2_index.update(part1_index)
key_min = min(part2_index, key=lambda x:abs(part2_index[x])
return key_min, part2_index[key_min]