P3. 3 TapeEquilibrium
Minimize the value |(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|
-
P3.3 寻找最小差
寻找|(A[0] + ... + A[P-1]) - (A[P] + ... + A[N-1])|的最小差
由N个整数组成的非空数组A。对于整数P,0<P<N,将该数组分为两部分:A[0]、A[1]、…、A[P-1]和A[P]、A[P+1]、……、A[N-1]。 两部分的差定义为:
|(A[0]+A[1]+、…、+A[P-1])-****(A[P]+A[P+1]+、……、+A[N-1])|
例如,考虑数组:A[0]=3,A[1]=1,A[2]=2,A[3]=4,A[4]=3,给定4个不同的P值:
P=1,差=|3−10|=7
P=2,差=|4−9|=5
P=3,差=|6−7|=1
P=4,差=|10−3|=7
编写函数:
def solution(A)
如果给定一个由N个整数组成的非空数组A,则返回可以得到的最小的差。
例如,对于上面的例子,函数应该返回1。
假定:
- N是[2,100000]中的整数;
- 数组A的每个元素都是范围[-1000,1000]内的整数;
-
解题思路
前一个差值和后一个差值的差就在于2倍的位置为P的元素。 - Python3代码
# -*- coding:utf-8 -*-
# &Author AnFany
# Lesson 3:Time Complexity
# P 3.3 TapeEquilibrium
def solution_list(A):
"""
返回数组2部分差的最小值,时间复杂度O(N * N)
:param A: N个整数组成的数组
:return: 差的最小值
"""
sum_list = sum(A)
sub_abs_value = []
for i in range(1, len(A)):
sub_abs_value.append(abs(sum_list - 2 * sum(A[:i])))
return min(sub_abs_value)
def solution(A):
"""
返回数组2部分差的最小值,时间复杂度O(N)
:param A: N个整数组成的数组
:return: 差的最小值
"""
sum_value = sum(A)
if len(A) == 2:
first_sub_abs = abs(A[1] - A[0])
return first_sub_abs
else:
sub_abs_list = []
first_sum = 0
for i in A[:-1]:
first_sum += i
sub_abs = abs(sum_value - 2 * first_sum)
if sub_abs == 0:
return 0
sub_abs_list.append(sub_abs)
return min(sub_abs_list)
image
点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。
image image
网友评论