当前位置: 首页 > news >正文

专业的手机价格网站建设工商企业

专业的手机价格网站建设,工商企业,网站底部悬浮导航,张家港电脑网站制作题目链接:3224. 使差值相等的最少数组改动次数 题目: 给你一个长度为 n 的整数数组 nums ,n 是偶数 ,同时给你一个整数 k 。 你可以对数组进行一些操作。每次操作中,你可以将数组中任一元素替换为 0 到 k 之间的任一…

题目链接:3224. 使差值相等的最少数组改动次数

题目:

给你一个长度为 n 的整数数组 nums ,n 是偶数 ,同时给你一个整数 k 。

你可以对数组进行一些操作。每次操作中,你可以将数组中任一元素替换为 0 到 k 之间的任一整数。

执行完所有操作以后,你需要确保最后得到的数组满足以下条件:

存在一个整数 X ,满足对于所有的 (0 <= i < n) 都有 abs(a[i] - a[n - i - 1]) = X 。
请你返回满足以上条件最少修改次数。

提示:

2 <= n == nums.length <= 105

n 是偶数

0 <= nums[i] <= k <= 105

题解:

方法一:暴力解法

直接枚举 X 的取值,然后计算每个枚举值对应所需修改的次数,然后选出里面最小的即可。

这里的第一个问题是 X 的取值范围如何确定。从题目的提示内容可知数组中的数在 0-k 之间,又因为 数组中的数字可以修改为 0-k之间的任意数,所以直接上 X 的取值范围为 0 <= X <= k

第二个问题是如何让数组中对称位置的两个数字在修改之后差值为 X,这里直接枚举两个数字可以修改的所有值,如果修改前后的数值不同则记录为1次修改,否则不记录为修改。

代码实现:

def minChanges(nums, k):n = len(nums)change_count = [0] * (k + 1)# 遍历前半部分for i in range(n // 2):a, b = nums[i], nums[n - i - 1]temp = [float('inf')] * (k + 1)  # 临时数组,用于计算当前的最小修改次数# 遍历每个可能的 Xfor x in range(k + 1):# 当前 |a - b| 与目标 X 的差异for v1 in range(k + 1):  # 枚举将 a 修改为 v1for v2 in range(k + 1):  # 枚举将 b 修改为 v2if abs(v1 - v2) == x:  # 如果调整后符合要求cost = (v1 != a) + (v2 != b)  # 计算修改次数temp[x] = min(temp[x], change_count[x] + cost)# 更新最小修改次数change_count = tempreturn min(change_count)

方法二:差分数组

注意到每一对数不会互相影响,所以可以把每一对数分开考虑。
设一对数中,一个是 x x x,一个是 y y y,那么改掉其中一个数可以获得的最大差值,肯定是把另一个数改成 0 或 k,即最大差值:

m = m a x ( x , k − x , y , k − y ) m=max(x, k-x, y, k-y) m=max(x,kx,y,ky)

参考下表:

xy差值
x0x
xkk-x
0yy
kyk-y

改掉两个数,那就可以获得从 0 到 k 里的任意差值。

所以对于这一对数来说, X = ∣ x − y ∣ X=|x-y| X=xy 时不需要操作, 0 ≤ X < ∣ x − y ∣ 0 \leq X < |x-y| 0X<xy 以及 ∣ x − y ∣ < X ≤ m |x-y| < X \leq m xy<Xm 的时候需要一次操作, X > m X>m X>m 的时候需要两次操作。

枚举所有数对,用差分数组维护 X X X 的某个取值需要几次操作即可。复杂度 O ( n + k ) O(n+k) O(n+k)

  • 我们令 d = a b s ( n u m s [ i ] − n u m s [ j ] ) d=abs(nums[i]-nums[j]) d=abs(nums[i]nums[j]),假如最后的这个 0 ≤ X < ∣ x − y ∣ 0 \leq X < |x-y| 0X<xy,那么就可以通过一次操作完成。
  • 操作一次能达到的最大差值是多少呢?这个就是上面说的肯定是把另一个数改成 0 或 k。即最大差值为 m = m a x ( x , k − x , y , k − y ) m=max(x, k-x, y, k-y) m=max(x,kx,y,ky),那么就是 ∣ x − y ∣ < X ≤ m |x-y| < X \leq m xy<Xm 时需要一次操作。
  • 剩下就是 X > m X > m X>m 时需要两次操作。

因为是对区间内的值进行统一的加一个常数的操作,如果一个一个操作的话时间复杂度为 O ( n ) O(n) O(n),所以使用了差分数组,这样可以将时间复杂度降为 O ( 1 ) O(1) O(1)

from typing import Listclass Solution:def minChanges(self, nums: List[int], k: int) -> int:n = len(nums)f = [0] * (k + 2)i, j = 0, n - 1while i < j:d = abs(nums[i] - nums[j])ma = max(nums[i], k - nums[i], nums[j], k - nums[j])# 0 <= x < d 时需要一次操作,如果没有用差分数组的话就成了 cnt[0]+1,cnt[1]+1,···,cnt[d]+1f[0] += 1f[d] -= 1# d < x <= ma 时需要一次操作f[d + 1] += 1f[ma + 1] -= 1# x > ma 时需要两次操作f[ma + 1] += 2i += 1j -= 1ans = f[0]for i in range(1, k + 2):f[i] += f[i - 1]ans = min(ans, f[i])return ans

参考1:3224. 使差值相等的最少数组改动次数
参考2:前缀和&差分

http://www.yayakq.cn/news/43355/

相关文章:

  • 手机网站可以做公众号站群网站建设推广
  • 住房和城乡建设部建设司网站首页10大品牌网
  • 网站建设 外包个人简历在线制作免费
  • 彩票网站怎么做ip管理python编程软件官网
  • 惠州品牌网站建设公司哪里有专业的网站建设企业
  • 网站开发项目周期的撰写网站建设技术解决方案
  • 母婴网站源码 带采集北京的广告公司网站建设
  • 腾宁网络做网站什么网站可以做单词书
  • n加1网站建设广州建站网站
  • 怎么根据别人的网站做自己的网站电子商务实验网站建设实训过程
  • 网站后台管理js长沙长沙h5网站建设
  • 12306网站开始是谁开发的邢台做网站备案
  • php网站开发权限管理wordpress写文章方便
  • thinkphp 门户网站wordpress哪些插件
  • 郑州做网站推广哪家好wordpress 远程数据库
  • 网站编辑工作好做吗东西湖区网站建设公司
  • 小白怎么学做网站wordpress论坛怎么用
  • 金融网站策划方案找人做个app需要多少钱
  • 电子商务网站建设 试题区块链网站建设
  • dedecms 资源类网站模板廊坊seo关键词
  • 网站建设的基本步骤有哪些wordpress微信登录插件下载失败
  • 网站建设计划设计方案注册公司需要费用吗
  • 网站需求分析的主要内容哪个网站内链建设好
  • 我是做化工回收的做哪个网站比较好wordpress白屏
  • 布吉网站建设公司wordpress上传pdf文件
  • 百度推广怎么做的网站诸城做网站公司
  • wordpress上传媒体文件大小修改网站从哪些方面做优化
  • 网站建设与管理基础及实训(php版)公司手机版网站模板免费下载
  • 什么行业适合做网站推广合肥晨曦网站建设
  • 自己做营销型网站网站开发需求网