前缀和2:2615等值距离和

这篇具有很好参考价值的文章主要介绍了前缀和2:2615等值距离和。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2615. 等值距离和 - 力扣(LeetCode)

做这道题之前,先完成1685. 有序数组中差绝对值之和 - 力扣(LeetCode)

 一般性的,我们能在这类题目中总结出以下规律:

求解有序数组中每个元素与q的差值res时,q 与数组交于 j :

前缀和2:2615等值距离和

left = q*j - pre[j]
right = pre[n] - pre[j] - q * (n - j)
res = left + right

那么假设我们已经求得a,a中存储的是nums中相同元素的下标,比如nums=[1,3,1,1,2],则对于元素1,它的a = [0, 2, 3]。

求解的结果存在res中,对元素1,我们需要求解res[0], res[2], res[3]

res[0] =  |0 - 0| - |0 - 2| + |0 - 3|

res[2] =  |0 - 2| - |2 - 2| + |2 - 3|

res[3] =  |0 - 3| - |2 - 3| + |3 - 3|

for j, q in enumerate(a):
    ...
    res[j] = left + right

其中:

left = q * j - pre[j]
right = pre[n] - pre[j] - q * (n - j)

可以看到就本题的核心就和1685完全一致,问题就只剩下了怎么构造这个数组a,这里我用了哈希表存储:

groups = defaultdict(list)
for i, x in enumerate(nums):
    groups[x].append(i)  # 记录相同元素的下标

完整代码如下

class Solution:
    def distance(self, nums: List[int]) -> List[int]:
        groups = defaultdict(list)
        for i, x in enumerate(nums):
            groups[x].append(i)  # 相同元素分到同一组,记录下标
        ans = [0] * len(nums)
        for a in groups.values():
            n = len(a)
            s = list(accumulate(a, initial=0))  # 计算数组a前i个元素的前缀和,以0开头

            for j, target in enumerate(a):
                left = target * j - s[j]  # 蓝色面积
                right = s[n] - s[j] - target * (n - j)  # 绿色面积
                ans[target] = left + right
        return ans

类似题目:(31条消息) 前缀和:leetcode2602数组元素全部相等的最少操作次数_坠金的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-415384.html

到了这里,关于前缀和2:2615等值距离和的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 力扣72. 编辑距离(动态规划)

    Problem: 72. 编辑距离 由于易得将字符串word1向word2转换和word2向word1转换是等效的,则我们假定统一为word1向word2转换!!! 1.确定状态:我们假设现在有下标i,j分别指向字符串word1和word2 尾部的字符 ,dp(i,j)表示当前的操作则: 1.1. dp(i- 1, j) + 1;表示 删除 ,直接把word1[i]的这个字

    2024年02月21日
    浏览(45)
  • 【力扣】1588. 所有奇数长度子数组的和 <前缀和>

    给你一个正整数数组 arr ,请你计算所有可能的奇数长度子数组的和。子数组 定义为原数组中的一个连续子序列。请你返回 arr 中 所有奇数长度子数组的和 。 示例 1: 输入:arr = [1,4,2,5,3] 输出:58 解释:所有奇数长度子数组和它们的和为: [1] = 1 [4] = 4 [2] = 2 [5] = 5 [3] = 3 [1

    2024年02月10日
    浏览(39)
  • 探秘力扣之谜:如何轻松解决最长公共前缀问题?

    本篇博客我会讲解力扣中的“14. 最长公共前缀”这道题,这是题目链接。 先来审题: 以下是几个输出示例: 提示: 这道题的思路其实并不难,也是一些字符串的常规操作的结合。大家可以先思考一下,再来听我讲解。 思路是这样的:外层循环遍历第一个字符串的每一个字

    2024年02月03日
    浏览(53)
  • 【力扣】304. 二维区域和检索 - 矩阵不可变 <二维前缀和>

    给定一个二维矩阵 matrix ,以下类型的多个请求: 计算其子矩形范围内元素的总和,该子矩阵的 左上角 为 (row1, col1) ,右下角 为 (row2, col2) 。 实现 NumMatrix 类: NumMatrix(int[][] matrix) 给定整数矩阵 matrix 进行初始化 int sumRegion(int row1, int col1, int row2, int col2) 返回 左上角 (row1, co

    2024年02月10日
    浏览(38)
  • 力扣题解(1030. 距离顺序排列矩阵单元格),带注释

    链接:点我 注意 :多看几遍题目,开始没看懂…相当于计算矩阵网格里面的点(不要计算边界) 我开了题解才明白题的意思 orz…

    2024年02月11日
    浏览(35)
  • 力扣hot100 路径总和Ⅲ dfs 前缀和 一题双解 超全注释

    Problem: 437. 路径总和 III 树的遍历 + DFS 一个朴素的做法是搜索以每个节点为根的(往下的)所有路径,并对路径总和为 targetSumtargetSumtargetSum 的路径进行累加统计。 使用 dfs1 来搜索所有节点,复杂度为 O(n)O(n)O(n);在 dfs1 中对于每个当前节点,使用 dfs2 搜索以其为根的所有(往

    2024年02月02日
    浏览(40)
  • 【算法思考记录】【前缀和,C++】力扣1277. 统计全为 1 的正方形子矩阵

    原题链接 题目要求我们统计在一个由0和1构成的矩阵中,所有完全由1组成的正方形子矩阵的数量。这是一道中等难度的算法题目,其关键在于高效地计算出不同大小的正方形子矩阵是否完全由1组成。 解决此问题的一个有效方法是使用 前缀和 算法。前缀和是一种预处理技术

    2024年02月03日
    浏览(38)
  • 【leetcode】前缀和

    内容摘抄自: 小而美的算法技巧:前缀和数组 | labuladong 的算法小抄 一维数组的前缀和 看这个  preSum  数组,若想求索引区间  [1, 4]  内的所有元素之和, 就可以通过  preSum[5] - preSum[1]  得出。 二维数组的前缀和 如leetcode 304: 注意任意子矩阵的元素和可以转化成它周边几

    2024年02月13日
    浏览(34)
  • [Leetcode] 0014. 最长公共前缀

    点击上方,跳转至Leetcode 编写一个函数来查找字符串数组中的最长公共前缀。 如果不存在公共前缀,返回空字符串  \\\"\\\" 。 示例 1: 示例 2: 提示: 1 = strs.length = 200 0 = strs[i].length = 200 strs[i] 仅由小写英文字母组成 横向扫描:写一个longestCommonPrefix方法,用于返回两个字符串的

    2024年02月10日
    浏览(48)
  • 【leetcode】动态规划::前缀和

    标题:【leetcode】前缀和 @水墨不写bug 正文开始: 给定一个长度为n的数组a1​,a2​,....an​. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出al​+al+1​+....+ar​ 输入描述: 第一行包含两个整数n和q. 第二行包含n个整数, 表示a1​,a2​,....an​. 接下来q行,每行包含

    2024年04月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包