每日一题——旋转函数

简介: 每日一题——旋转函数

396. 旋转函数

题目描述:

给定一个长度为 n 的整数数组 nums 。

假设 arrk 是数组 nums 顺时针旋转 k 个位置后的数组,我们定义 nums 的 旋转函数 F 为:

F(k) = 0 * arrk[0] + 1 * arrk[1] + … + (n - 1) * arrk[n - 1]

返回 F(0), F(1), …, F(n-1)中的最大值 。

生成的测试用例让答案符合 32 位 整数。

示例 1:

输入: nums = [4,3,2,6]

输出: 26

解释:

F(k) = 0 * arrk[0] + 1 * arrk[1] + … + (n - 1) * arrk[n - 1]

// k=0 顺时针旋转0个位置 arr0=[4,3,2,6]
F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25 
// k=1 顺时针旋转1个位置 arr1=[6,4,3,2]
F(1) = (0 * 6) + (1 * 4) + (2 * 3) + (3 * 2) = 0 + 4 + 6 + 6 = 16
// k=2 顺时针旋转2个位置 arr2=[2,6,4,3]
F(2) = (0 * 2) + (1 * 6) + (2 * 4) + (3 * 3) = 0 + 6 + 8 + 9 = 23
// k=3 顺时针旋转3个位置 arr3=[3,2,6,4]
F(3) = (0 * 3) + (1 * 2) + (2 * 6) + (3 * 4) = 0 + 2 + 12 + 12 = 26

所以 F(0), F(1), F(2), F(3) 中的最大值是 F(3) = 26 。

超时解:

思路:

采用双指针,一头一尾,每旋转一次,两个指针左移便是旋转后的切片。

func maxRotateFunction(nums []int) int {
  length := len(nums)
  if length==1 {
    return 0
  }
  // 每轮两指针左移一位
  pointHead := 0
  pointTail := length - 1
  ans := math.MinInt64
  for i := 0; i < length; i++ {
    f := 0
    head := pointHead
    for j := 0; j < length; j++ {
      f = j*nums[head] + f
      head = (head + 1) % length
    }
    // 如果头指针后推,为负,就指向队列末尾
    pointHead--
    if pointHead < 0 {
      pointHead = length - 1
    }
    pointTail--
    ans = int(math.Max(float64(ans),float64(f)))
  }
  return ans
}

正解:

思路:

观察F(0), …, F(k)的规律可得:

 每旋转一次数组,都是最后一个值的系数变为了0,而其他值的系数都是+1

所以定义sum用来存放数组和, 而F(k)+sum就等于所有系数都+1, 再减去最后一个变化后的值去掉就就是F(k+1)的值了

以示例1为例:

sum就是切片内所有元素的和,你每加一次sum,就相当于F(k)的每个系数都+1

例如:

 sum = 4 + 3 + 2 + 6 = 15

 F(0) = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6) = 0 + 3 + 4 + 18 = 25

 F(0)+sum = (0 * 4) + (1 * 3) + (2 * 2) + (3 * 6)+ 4 + 3 + 2 + 6

     = (1 * 4) + (2 * 3) + (3 * 2) + (4 * 6) = 40

而由上面观察到的规律:每旋转一次数组,都是最后一个值的系数变为了0,而其他值的系数都是+1

那么我们观察F(1)相对与F(0)+sum哪里有差别:

 F(1) = (1 * 4) + (2 * 3) + (3 * 2)+ (0 * 6)

 F(0)+sum = (1 * 4) + (2 * 3) + (3 * 2) + (4 * 6)

可以看到原本最后一个值应该对应的是0*6 而F(0)+sum里却是4*6

所以我们可以得出:

F(1) = F(0) + sum - 最后一个变化后的值 = 25 + 15 - 24 = 16

func maxRotateFunction(nums []int) int {
  // sum: 数组内所有元素的和
  // curSum: F(k) 就是每次旋转数组后,代入F(k)公式求的那个
  sum, curSum, ans := 0, 0, 0
  for i := 0; i < len(nums); i++ {
    // 求数组和
    sum = sum + nums[i]
    // 求F(0)
    curSum = curSum + i*nums[i]
  }
  ans = curSum
  for i := len(nums) - 1; i > 0; i-- {
    // F(K+1) = F(K) + sum - 最后一个变化后的值
    curSum = curSum + sum - len(nums)*nums[i]
    ans = max(ans, curSum)
  }
  return ans
}
func max(a, b int) int {
  if b > a {
    return b
  }
  return a
}

提交结果:

相关文章
|
数据可视化 物联网 PyTorch
双卡3090消费级显卡 SFT OpenBuddy-LLaMA1-65B 最佳实践
OpenBuddy继接连开源OpenBuddy-LLaMA1-13B、OpenBuddy-LLaMA1-30B后,8月10日,一鼓作气发布了650亿参数的大型跨语言对话模型 OpenBuddy-LLaMA1-65B。
|
XML Web App开发 人工智能
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
1958 0
SVG图像——为 PPT 增添视觉趣味/03/O365智能系列(二)
|
11月前
|
监控 搜索推荐 API
京东商品详情API接口的开发、应用与收益探索
在数字化和互联网高速发展的时代,京东通过开放商品详情API接口,为开发者、企业和商家提供了丰富的数据源和创新空间。本文将探讨该API接口的开发背景、流程、应用场景及带来的多重收益,包括促进生态系统建设、提升数据利用效率和推动数字化转型等。
292 3
视频格式转换与DRM解除
随着流媒体平台的普及,用户对视频下载和转换工具的需求不断增加。本文介绍了几款优秀工具,如CleverGet、PlayOn Cloud、CocCut、StreamGaGa和PlayOn Desktop,帮助用户更好地下载、转换和管理视频内容。这些工具不仅提升了视频获取的便利性,还提供了多种选择,满足不同需求。使用时请确保合法合规。
|
机器学习/深度学习 人工智能 监控
人工智能浪潮中的伦理困境:如何平衡创新与责任?
随着人工智能技术的快速发展,其在改善人类生活的同时,也引发了一系列伦理问题。本文将探讨AI技术在医疗、司法和隐私保护等领域的应用所带来的伦理挑战,并讨论如何在促进技术创新的同时确保社会责任的承担。通过分析具体案例,文章旨在提供对于制定AI伦理指导原则的建议,以期达到技术发展与社会价值的和谐共存。
|
12月前
|
机器学习/深度学习 人工智能 计算机视觉
探索深度学习在图像识别中的突破与挑战##
本文深入探讨了深度学习技术在图像识别领域的最新进展,重点分析了卷积神经网络(CNN)作为核心技术的演变历程,从LeNet到AlexNet,再到VGG、ResNet等先进架构的创新点。不同于传统摘要形式,本文摘要旨在通过一系列关键里程碑事件,勾勒出深度学习推动图像识别技术飞跃的轨迹,同时指出当前面临的主要挑战,如模型泛化能力、计算资源依赖性及数据偏见问题,为读者提供一个宏观且具体的发展脉络概览。 ##
245 7
|
机器学习/深度学习 数据采集 数据可视化
深度学习实践:构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行分类
本文详细介绍如何使用PyTorch构建并训练卷积神经网络(CNN)对CIFAR-10数据集进行图像分类。从数据预处理、模型定义到训练过程及结果可视化,文章全面展示了深度学习项目的全流程。通过实际操作,读者可以深入了解CNN在图像分类任务中的应用,并掌握PyTorch的基本使用方法。希望本文为您的深度学习项目提供有价值的参考与启示。
|
程序员 Docker Windows
Windows 10系统压缩C盘WSL虚拟磁盘文件
Windows 10系统压缩C盘WSL虚拟磁盘文件
427 1
|
人工智能 小程序 数据安全/隐私保护
十分钟带你彻底告别翻来覆去找ChatGPT提示词模版
十分钟带你彻底告别翻来覆去找ChatGPT提示词模版
|
人工智能 前端开发 JavaScript
小说网站|基于Springboot+Vue实现在线小说阅读网站
本项目基于Springboot+Vue开发实现了一个在线小说阅读网站平台。系统设计用户主要有三类:读者、作者、管理员。用户注册时以读者身分进入平台,可以自己修改身分为作者。读者登录系统可以查看并在线阅读发布的小说章节内容,并在线评论、点赞和举报处理,同时可以查看平台发布的小说新闻和平台公告新闻。。作者登录平台除了可以查看小说外,还可以在线发布小说和内容,进行在线创作。所有的信息由平台管理员进行管理操作,包含人员管理、小说管理、章节管理、类型管理、举报管理、评论管理、新闻管理、系统管理(轮播图管理、超链接管理)等。
572 1