2104. 子数组范围和

子数组范围和

题目描述:

给你一个整数数组 nums 。nums 中,子数组的 范围 是子数组中最大元素和最小元素的差值。

返回 nums 中 所有 子数组范围的 和 。

子数组是数组中一个连续 非空 的元素序列。

示例 1:

输入:nums = [1,2,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[2],范围 = 2 - 2 = 0
[3],范围 = 3 - 3 = 0
[1,2],范围 = 2 - 1 = 1
[2,3],范围 = 3 - 2 = 1
[1,2,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 1 + 1 + 2 = 4
示例 2:

输入:nums = [1,3,3]
输出:4
解释:nums 的 6 个子数组如下所示:
[1],范围 = 最大 - 最小 = 1 - 1 = 0
[3],范围 = 3 - 3 = 0
[3],范围 = 3 - 3 = 0
[1,3],范围 = 3 - 1 = 2
[3,3],范围 = 3 - 3 = 0
[1,3,3],范围 = 3 - 1 = 2
所有范围的和是 0 + 0 + 0 + 2 + 0 + 2 = 4
示例 3:

输入:nums = [4,-2,-3,4,1]
输出:59
解释:nums 中所有子数组范围的和是 59

提示:

1 <= nums.length <= 1000
-109 <= nums[i] <= 109

进阶:你可以设计一种时间复杂度为 O(n) 的解决方案吗?

通过次数12,895提交次数21,164

思路:

暴力,yyds

代码:

func subArrayRanges(nums []int) int64 {
    n := len(nums)
    var res int64
    for i:=0;i<n-1;i++{
        minNum,maxNum := nums[i], nums[i]
        for j:=i+1;j<n;j++{
            minNum = min(minNum, nums[j])
            maxNum = max(maxNum, nums[j])
            res += int64(maxNum-minNum)
        }
    }
    return res
}

func max(a,b int)int{
    if a<b{
        return b
    }
    return a
}

func min(a,b int)int{
    if a<b{
        return a
    }
    return b
}

代码效率:

执行用时:20 ms, 在所有 Go 提交中击败了73.15%的用户
内存消耗:4 MB, 在所有 Go 提交中击败了100.00%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!