Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >LeetCode 2333. 最小差值平方和(贪心)

LeetCode 2333. 最小差值平方和(贪心)

作者头像
Michael阿明
发布于 2022-07-31 01:34:36
发布于 2022-07-31 01:34:36
36600
代码可运行
举报
运行总次数:0
代码可运行

文章目录

1. 题目

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,长度为 n 。

数组 nums1 和 nums2 的 差值平方和 定义为所有满足 0 <= i < n 的 (nums1[i] - nums2[i])^2 之和。

同时给你两个正整数 k1 和 k2 。你可以将 nums1 中的任意元素 +1 或者 -1 至多 k1 次。 类似的,你可以将 nums2 中的任意元素 +1 或者 -1 至多 k2 次。

请你返回修改数组 nums1 至多 k1 次且修改数组 nums2 至多 k2 次后的最小 差值平方和

注意:你可以将数组中的元素变成 负 整数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
示例 1:
输入:nums1 = [1,2,3,4], nums2 = [2,10,20,19], k1 = 0, k2 = 0
输出:579
解释:nums1 和 nums2 中的元素不能修改,因为 k1 = 0 和 k2 = 0差值平方和为:(1 - 2)^2 + (2 - 10)^2 + (3 - 20)^2 + (4 - 19)^2 = 579 。

示例 2:
输入:nums1 = [1,4,10,12], nums2 = [5,8,6,9], k1 = 1, k2 = 1
输出:43
解释:一种得到最小差值平方和的方式为:
- 将 nums1[0] 增加一次。
- 将 nums2[2] 增加一次。
最小差值平方和为:
(2 - 5)^2 + (4 - 8)^2 + (10 - 7)^2 + (12 - 9)^2 = 43 。
注意,也有其他方式可以得到最小差值平方和,但没有得到比 43 更小答案的方案。
 
提示:
n == nums1.length == nums2.length
1 <= n <= 10^5
0 <= nums1[i], nums2[i] <= 10^5
0 <= k1, k2 <= 10^9

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/minimum-sum-of-squared-difference 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 答案只与 对应元素的 非零 绝对值 有关系
  • 对这些绝对值进行排序,大的优先减少
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Solution:
    def minSumSquareDiff(self, nums1: List[int], nums2: List[int], k1: int, k2: int) -> int:
        diff = list(filter(lambda x : x!=0, [abs(x-y) for x, y in zip(nums1, nums2)]))
        # 非零 绝对值
        diff.sort(reverse=True) # 逆序排列
        if len(diff) == 0:
            return 0
        k = k1+k2  # 总的调整次数
        diff.append(0)  # 代码编写简单需要
        prevnum = diff[0]
        ct = 1 # 前面相同元素的个数
        i = 0
        while i < len(diff)-1:
            delta = diff[i]-diff[i+1] # 跟后一个的差值
            if delta == 0:
                ct += 1  # 相同值的元素个数 + 1
            else: # 遇到有下降台阶了
                if k >= delta*ct: # k 的次数,够ct个数降到下个元素的值
                    prevnum = diff[i+1]
                    k -= delta*ct
                    ct += 1
                else:  # 不够, 结束了
                    delta = k//ct  # 把剩余的 k 次 均匀分给 ct 个数
                    prevnum -= delta # 每个数还能降低 delta
                    left = k - delta*ct # 剩余的次数,每个数的值还能 -1
                    return int(math.pow((prevnum-1), 2)*left + math.pow(prevnum, 2)*(ct-left) + sum([x*x for x in diff[ct:]]))
            i += 1
        return 0

188 ms 31.4 MB Python3

1648 题是一样的思路,可以试试 https://leetcode.cn/problems/sell-diminishing-valued-colored-balls/

我的CSDN博客地址 https://michael.blog.csdn.net/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
LeetCode 1818. 绝对差值和(二分查找)
数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 0 开始)。
Michael阿明
2021/09/06
2110
LeetCode04,BAT面试原题,面试题中的难度天花板
一拍脑袋才发现LeetCode系列好久没更新了,我们今天来聊聊LeetCode第四题——寻找两个正序数组的中位数。
TechFlow-承志
2022/09/22
3520
LeetCode04,BAT面试原题,面试题中的难度天花板
LeetCode笔记:Biweekly Contest 82
这一题稍微复杂一点,我的思路来说的话就是首先找到每一辆车上上去的人到达的时间,然后倒着找回去,找到第一个能够坐上去且不会和别人重复的时间点就行了。
codename_cys
2022/07/11
2600
【LeetCode 周赛】看似没考 LIS 最长递增子序列,好像又考了
简单模拟题,在每一轮操作中可以将 num 加一,而对 x 减一,因此最大 x 就是 num + 2 * t。
用户9995743
2023/09/09
2710
【LeetCode 周赛】看似没考 LIS 最长递增子序列,好像又考了
LeetCode 2261. 含最多 K 个可整除元素的子数组
给你一个整数数组 nums 和两个整数 k 和 p ,找出并返回满足要求的不同的子数组数,要求子数组中最多 k 个可被 p 整除的元素。
Michael阿明
2022/05/10
3270
LeetCode 910. 最小差值 II(贪心)
给定一个整数数组 A,对于每个整数 A[i],我们可以选择 x = -K 或是 x = K,并将 x 加到 A[i] 中。
Michael阿明
2020/07/13
8101
LeetCode - 最小差值①
开始了Easy题模式...用于快速恢复学习算法的信心。这题是一个多月前的题目,LeetCode第908题,感觉好像后面每次新增的题目,都是周赛的题目...
晓痴
2019/07/24
6030
LeetCode - 最小差值①
LeetCode周赛299,太卷了!AK了也没能拿到内推机会
今天是周一,我们照惯例来聊聊LeetCode周赛。这一次的比赛赞助商是神策数据,比赛的前300名可以获得公司的内推机会。可惜的是,老梁刚好是306名,差了一点点。
TechFlow-承志
2022/09/21
7290
LeetCode周赛299,太卷了!AK了也没能拿到内推机会
图解LeetCode——1775. 通过最少操作次数使数组的和相等(难度:中等)
给你两个长度可能不等的整数数组 nums1 和 nums2 。两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。
爪哇缪斯
2023/05/10
2050
图解LeetCode——1775. 通过最少操作次数使数组的和相等(难度:中等)
【Java】基础算法练习题
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
.29.
2024/03/03
2310
【Java】基础算法练习题
【面试高频题】难度 1.5/5,二分经典运用题
数组 nums1 和 nums2 的 绝对差值和 定义为所有 |nums1[i] - nums2[i]|(0 <= i < n)的 总和(下标从 开始)。
宫水三叶的刷题日记
2022/10/30
3500
LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
其实就是将 purchaseAmount 向最近的 10 的倍数四舍五入,再用 100 减去它。
用户9995743
2023/08/18
2640
LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
【算法专题】贪心算法
题目:在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。
YoungMLet
2024/03/01
1490
【算法专题】贪心算法
LeetCode通关:哈希表六连,这个还真有点简单
就好像老三和老三的工位:有人来找老三,前台小姐姐一指,那个像狗窝一样的就是老三的工位。
三分恶
2021/08/13
3440
LeetCode通关:哈希表六连,这个还真有点简单
Leetcode 1577. Number of Ways Where Square of Number Is Equal to Product of Two Numbers
文章作者:Tyan 博客:noahsnail.com | CSDN | 简书
Tyan
2021/08/10
2670
LeetCode870题田忌赛马
给定两个大小相等的数组nums1和nums2,nums1相对于 nums2 的优势可以用满足nums1i > nums2i的索引 i的数目来描述。
疯狂的KK
2023/04/10
3210
TypeScript算法题实战——哈希表篇(Set和Map的基本用法、快乐数、两数相加、四数相加)
哈希表可以用来快速判断一个元素是否出现集合里。常见的哈希表有三种形式:数组、set (集合)、map(映射)
中杯可乐多加冰
2024/08/05
1210
LeetCode 908. 最小差值 I
给定一个整数数组 A,对于每个整数 A[i],我们可以选择任意 x 满足 -K <= x <= K,并将 x 加到 A[i] 中。
Michael阿明
2020/07/13
3320
LeetCode 908. 最小差值 I
【leetcode刷题】T179-最小差值 II
https://leetcode-cn.com/problems/smallest-range-ii
木又AI帮
2019/10/10
3950
LeetCode 1775. 通过最少操作次数使数组的和相等(贪心+双指针)
给你两个长度可能不等的整数数组 nums1 和 nums2 。 两个数组中的所有值都在 1 到 6 之间(包含 1 和 6)。
Michael阿明
2021/09/06
4610
推荐阅读
相关推荐
LeetCode 1818. 绝对差值和(二分查找)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验