编程之美-2.18 数组分割

对这篇博客,自己实现其中的第一种解法如下:

def array_split(arr):
    half_sum = sum(arr) // 2  # 只找不大于sum/2的和
    dp = [[] for _ in range(len(arr) + 1)]  # dp[len(arr)][len(arr)//2][half_sum]
    for i in range(len(arr) + 1):
        for j in range(len(arr) // 2 + 1):
            row = [False for k in range(half_sum + 1)]
            dp[i].append(row)
    # print(len(dp),len(dp[0]),len(dp[0][0])) # for debug
    for i in range(1, len(arr) + 1):
        j_max = min(i, len(arr) // 2)
        for j in range(0, j_max + 1):
            for s in range(half_sum + 1):
                if i == 1:
                    if j == 0:
                        dp[i][j][0] = True
                    if j == 1:
                        dp[i][j][arr[i-1]] = True
                        smaller_sum = arr[i-1]
                else:
                    if j <= i - 1:
                        if dp[i-1][j][s] == True:
                            dp[i][j][s] = True
                            smaller_sum = s

                    if s >= arr[i-1] and dp[i - 1][j - 1][s - arr[i-1]] == True:
                        dp[i][j][s] = True
                        smaller_sum = s

    smaller_arr = []
    i = len(arr)
    j = len(arr) // 2
    curr_sum = smaller_sum
    while i > 0 and j > 0:
        if dp[i - 1][j - 1][curr_sum - arr[i-1]] == True:
            smaller_arr.append(arr[i-1])
            j -= 1
            curr_sum -= arr[i-1]
        else:
            i -= 1
    return smaller_arr[::-1]

if __name__ == '__main__':
    arr = [2,3,3,6]
    res = array_split(arr)
    print(res)


这篇博客中提出了另一个不同于动态规划的O(NlogN)的解法,不过缺点就是不能保证分成的两个数组的长度相等。

posted on 2019-05-07 14:44  Frank_Allen  阅读(176)  评论(0编辑  收藏  举报

导航