每日一题 --- 2104. 子数组范围和[力扣][Go]

简介: 每日一题 --- 2104. 子数组范围和[力扣][Go]

题目:

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

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

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

解题代码:

暴力解法

func subArrayRanges(nums []int) int64 {
  var ans int64
  for i, num := range nums {
    minVal, maxVal := num, num
    for _, v := range nums[i+1:] {
      if v < minVal {
        minVal = v
      } else if v > maxVal {
        maxVal = v
      }
      ans += int64(maxVal - minVal)
    }
  }
  return ans
}

这是官方的题解,我刚开始以为可以这样写

func subArrayRanges(nums []int) int64 {
  var ans int64
  sort.Ints(nums)
  for i, num := range nums {
    for _, v := range nums[i+1:] {
      ans += int64(v - num)
    }
  }
  return ans
}

但是不行,得到的结果会比正确答案小。

这是因为我选择遍历是让每个数都与比它小的数相减,而子数组的范围不会两个数相减就OK了,例如 [4,1,-3] ,有两个包含4,且包含1的子数组[4,1]、[4,1,-3],这就会导致只计算 4 - 1而跳过计算 4 - (-3),从而导致得到的结果偏小。


相关文章
|
6月前
|
Go C++
【力扣】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
【2月更文挑战第18天】2696. 删除子串后的字符串最小长度(模拟 栈 C++ Go实现栈)
57 6
|
6月前
|
存储 算法
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
LeetCode刷题---209. 长度最小的子数组(双指针-滑动窗口)
|
3月前
|
算法 Python
【Leetcode刷题Python】子数组查找
一个用于寻找给定字符串中最长重复子串的Python函数实现,采用了滑动窗口的方法来检测重复的子串。
19 1
|
3月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
38 0
|
5月前
|
算法 测试技术 程序员
力扣经典150题第三十题:长度最小的子数组
力扣经典150题第三十题:长度最小的子数组
27 1
|
4月前
|
存储 算法
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
经典的滑动窗口的题目 力扣 2799. 统计完全子数组的数目(面试题)
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
技术经验解读:【LeetCode】560.SubarraySumEqualsK子数组和为K
|
5月前
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
【LeetCode刷题】滑动窗口思想解决问题:长度最小的子数组、无重复字符的最长子串
|
6月前
【力扣】209. 长度最小的子数组
【力扣】209. 长度最小的子数组
|
6月前
|
索引
leetcode代码记录(最长重复子数组
leetcode代码记录(最长重复子数组
37 0