美文网首页
数组平均分割算法

数组平均分割算法

作者: 928e93967d0f | 来源:发表于2017-12-18 11:27 被阅读0次

题目

题目1
将一个长度为n(n>0)的整型数组分割成两个数组,要求这两个数组的和之差最小
题目2
任意交换两个长度都为为n(n>0)的整型数组的元素,要求最终这两个数组的和之差最

问题分析

对于第二个问题,我们可以将两个数组合成一个长度为2n的数组,变成类似问题1的数组分隔问题。但它多了一个要求:分割后的两个数组长度都为n。
针对这种分割问题,我们可以采用二叉树的思路(TODO后续补图)

  • 对于一个长度为n(n>0)的数组任意分割(题目1)可能的情况为O(pow(2, n-1))。
  • 对于一个长度为2n(n>0)的数组平均分割(题目2)可能的情况为O(combinations(list_, n))。

代码实现

题目1

def depart_list(list_):
    _size = len(list_)
    _av = sum(list_)/2
    print('average:{}'.format(_av))

    _min = _av
    _min_seq = 0
    for i in range(0, pow(2, _size - 1)):
        _total = 0
        for j in range(0, _size):
            _total += list_[j]*((i>>j)&1)
    
        if abs(_total - _av) < _min:
            _min = abs(_total - _av)
            _min_seq = i
    
    print(_total)
    print(_min)
    print(_min_seq)
    _ret = []
    for k in range(0, _size):
        if _min_seq & (1<<k):
            _ret.append(list_[k])

    return _ret

depart_list([1231,35,46,6667,235,2563])
### [6667]

题目2:

def av_depart_list(list_):
    _size = len(list_)
    if _size % 2 != 0:
        return None

    _size_ret = _size/2
    _av = sum(list_)/2
    print("average:{}".format(_av))
    
    _min = _av
    _min_seq = 0
    for i in range(0, pow(2, _size - 1)):
        if bin(i)[2:].count('1') != _size_ret:
            continue
        
        _total = 0
        for j in range(0, _size):
            _total += list_[j]*((i>>j)&1)
    
        if abs(_total - _av) < _min:
            _min = abs(_total - _av)
            _min_seq = i
    
    print(_min)
    print(_min_seq)
    _ret = []
    for k in range(0, _size):
        if _min_seq & (1<<k):
            _ret.append(list_[k])

    return _ret

av_depart_list([1231,35,46,6667,235,2563])
### [35, 46, 6667]

相关文章

  • 数组平均分割算法

    题目 题目1将一个长度为n(n>0)的整型数组分割成两个数组,要求这两个数组的和之差最小题目2任意交换两个长度都为...

  • 力扣算法 - 分割数组

    题目 给定一个数组 A,将其划分为两个不相交(没有公共元素)的连续子数组 left 和 right, 使得: le...

  • javascript 算法整理

    求和算法 2 + 22 + 222 + ... + 222222... 手机号码处理为 344 格式 分割数组

  • Swift-数组实现三个栈

    题目: 数组实现栈可以弹性的分割也可以平均均分,按照平均分配的原则实现三个栈. 核心代码: ` let s...

  • 入门算法:归并排序

    上手难度:★★☆ 算法复杂度:O(nlogn) 排序思想: 将数组采用二分法,不断的递归分割,直至分割到单个元素,...

  • 算法笔记之数组分割

    不知道这种算法思想叫啥,暂时这么叫吧。一般是滑动窗口中使用,将数组分割成一个一个块,每个块单独考虑。 LeetCo...

  • javaScript数据结构和算法--快速排序

    快速排序时最常用的排序算法,和归并排序一样也是采用分治方法,但没有把数组分割开,也是将原数组分成较小的数组。 1、...

  • 10-Python-NumPy数组分割

    数组分割相关函数介绍 函数数组及操作split将一个数组分割为多个子数组hsplit将一个数组水平分割为多个子数组...

  • numpy数组的合并与分割

    数组的合并 数组的分割

  • 快速排序

    快速排序是一种分治算法。它是将一个数组分割成两个子数组,与归并排序不同的是:快速排序保证左边的数组元素都要小于右边...

网友评论

      本文标题:数组平均分割算法

      本文链接:https://www.haomeiwen.com/subject/eaipwxtx.html