加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – MaxDoubleSliceSum算法

发布时间:2020-12-20 13:48:28 所属栏目:Python 来源:网络整理
导读:我正在尝试解决找到MaxDoubleSliceSum值的问题.简单来说,它是任何切片减去该切片中一个元素的最大总和(您必须删除一个元素,并且还要排除第一个和最后一个元素).因此,从技术上讲,数组的第一个和最后一个元素不能包含在任何切片总和中. 这是完整的描述: 给出
我正在尝试解决找到MaxDoubleSliceSum值的问题.简单来说,它是任何切片减去该切片中一个元素的最大总和(您必须删除一个元素,并且还要排除第一个和最后一个元素).因此,从技术上讲,数组的第一个和最后一个元素不能包含在任何切片总和中.

这是完整的描述:

给出了由N个整数组成的非空零索引数组A.
三重态(X,Y,Z),使得0≤X<1. Y< Z< N,称为双切片.
双切片之和(X,Z)是A [X 1] A [X 2]的总和… A [Y – 1] A [Y 1] A [Y 2] … A [ Z – 1].

例如,数组A使得:

A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2

包含以下示例双切片:

双切片(0,3,6),总和是2 6 4 5 = 17,

双切片(0,7),总和是2 6 4 5 – 1 = 16,

双切片(3,4,5),总和为0.

目标是找到任何双切片的最大总和.

写一个函数:

解决方案(一)
在给定由N个整数组成的非空零索引数组A的情况下,返回任何双切片的最大总和.

例如,给定:

A[0] = 3
A[1] = 2
A[2] = 6
A[3] = -1
A[4] = 4
A[5] = 5
A[6] = -1
A[7] = 2

函数应该返回17,因为数组A的双片没有大于17的和.

假使,假设:

N是[3..100,000]范围内的整数;

数组A的每个元素都是[-10,000..10,000]范围内的整数.

复杂:

预期的最坏情况时间复杂度是O(N);

预期的最坏情况空间复杂度是O(N),超出输入存储(不计入输入参数所需的存储).

可以修改输入数组的元素.

这是我的尝试:

def solution(A):
    if len(A) <= 3:
        return 0
    max_slice = 0
    minimum = A[1]    # assume the first element is the minimum
    max_end = -A[1]   # and drop it from the slice
    for i in xrange(1,len(A)-1):
        if A[i] < minimum:        # a new minimum found
            max_end += minimum    # put back the false minimum
            minimum = A[i]        # assign the new minimum to minimum
            max_end -= minimum    # drop the new minimum out of the slice
        max_end = max(0,max_end + A[i])
        max_slice = max(max_slice,max_end)
    return max_slice

是什么让我觉得这可能接近正确的解决方案,但问题的某些角落可能没有被覆盖是9个14个测试用例正确通过(https://codility.com/demo/results/demoAW7WPN-PCV/)
我知道这可以通过向前和向后应用Kadane的算法来解决.但如果有人能指出这里遗漏的东西,我真的很感激.

解决方法

这就是我编写算法的方法.

假设起始索引为X = 0,然后迭代地将正方形与右边相加.

>在计算时跟踪最低int的索引,并在使用时从总和中减去最小的int.这有效地让你放置你的Y.
>跟踪最大总和,以及该总和的X,Z值
>如果总和变为负数,则将最大总和保存为结果,只要它大于前一个结果即可.
>选择一个新的X,您应该开始关注Y并从您找到的任何索引中减去一个.并重复前面的步骤,直到您到达列表的末尾.

这怎么可能有所改善?
您的代码的潜在问题案例:[7,2,-18,-14,20,22]
-18和-14将阵列分成两段.第一个段的总和是7 2 4 = 13,第二个段的总和只有20.上面的算法处理这种情况,你的可能但我对python不好(对不起).

编辑(错误和解决方案):看来我的原始答案没有给我认为的问题带来什么新的东西,但我检查了错误,发现实际错误发生在这里:[ – 20,-10,10,-70,30,-30]将无法正确处理.它将排除正数10,因此它返回50而不是60.

看起来askers代码没有正确识别新的起始位置(我的方法在第4种情况下显示),重要的是你重新启动Y而不是Z的迭代,因为Y有效地删除了最小的数字,这可能是Z未通过测试.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读