Arrays 查找数组中开始/结束索引的所有可能排列

Arrays 查找数组中开始/结束索引的所有可能排列,arrays,swift,algorithm,Arrays,Swift,Algorithm,我试图编写一个方法,返回Swift中子数组元素可以获得的最大值 我在创建一个算法时遇到的问题是,该算法捕获通过sliceSum方法运行的ArraySlices的开始和结束索引的所有可能排列 func maxSubArray(_ nums: [Int]) -> Int { var output = 0 func sliceSum(slice: ArraySlice<Int>) -> Int { // throws out cases tha

我试图编写一个方法,返回Swift中子数组元素可以获得的最大值

我在创建一个算法时遇到的问题是,该算法捕获通过
sliceSum
方法运行的
ArraySlice
s的开始和结束索引的所有可能排列

func maxSubArray(_ nums: [Int]) -> Int {
    var output = 0

    func sliceSum(slice: ArraySlice<Int>) -> Int {
        // throws out cases that don't work
        guard slice.count > 0 || slice.count != nums.count else { return 0 }
        return slice.reduce(0, +)
    }

    var begin = 0
    var end = nums.count - 1

    while begin < end {
        let frontSlice = nums[begin...end]
        if sliceSum(slice: frontSlice) > output {
            output = sliceSum(slice: frontSlice)
        }

        begin += 1
        end -= 1
    }

    return output
}
我知道解决办法很简单,但我想不出来。我欢迎以下建议:如何通过
sliceSum
方法实现运行所有可能排列的目标

func maxSubArray(_ nums: [Int]) -> Int {
    var output = 0

    func sliceSum(slice: ArraySlice<Int>) -> Int {
        // throws out cases that don't work
        guard slice.count > 0 || slice.count != nums.count else { return 0 }
        return slice.reduce(0, +)
    }

    var begin = 0
    var end = nums.count - 1

    while begin < end {
        let frontSlice = nums[begin...end]
        if sliceSum(slice: frontSlice) > output {
            output = sliceSum(slice: frontSlice)
        }

        begin += 1
        end -= 1
    }

    return output
}

谢谢你的阅读。我欢迎你的建议。

如果我理解你的目标,你需要两个循环。将
while
循环和
begin
end
变量替换为:

for begin in 0..<nums.count {
    for end in begin..<nums.count {
        let frontSlice = nums[begin...end]
        let sum = sliceSum(slice: frontSlice)
        if sum > output {
            output = sum
        }
    }
}

非常感谢你!这解决了202个测试用例中的198个。看起来这是一个最适合卡丹算法的工作,我刚刚了解了这个算法。一旦我弄明白如何用Swift写这篇文章,我会发布一个更新。
func sliceSum(slice: ArraySlice<Int>) -> Int {
    if slice.count > 0 {
        return slice.reduce(0, +)
    } else {
        return 0
    }
}