Codility每周一课:L3 Time Complexity(P3.3)

4734220-f445cd465214cca6.png
QQ图片20190117113208.png

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。
假定:

  1. N是[2,100000]中的整数;
  2. 数组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)
4734220-be10f358ed39fdba
image

点击获得更多编程练习题。欢迎Follow,感谢Star!!! 扫描关注微信公众号pythonfan,获取更多。

4734220-3a38d3c2af6073bb
image
4734220-28f0bd9ed8f73937
image

猜你喜欢

转载自blog.csdn.net/weixin_34362790/article/details/86815316
今日推荐