解题报告:

思路一:这题首先说一个nlogn的方法。

首先一个主客转化,题目描述是说把数组做翻转,idx不变,然后nums[i]和i作比较。那么我们可以转化为让数组不变,idx转变,即:假设刚开始i=4,那么idx的变化为[4,3,2,1,0,n-1,...,5],再用nums[i] -  idx,如果这个值>0,则是符合区间的k。具体来说,比如

nums = [ 2, 3, 1, 4, 0],对应的idx
idx  = [ 0, 1, 2, 3, 4],作差后
diff = [-2,-2, 1,-1, 4],此时k=0,然后移动一次的话,diff变为
diff = [ 2,-3, 0,-2, 3],此时k=1,
diff = [ 1, 1,-1,-3, 2],此时k=2,
diff = [ 0, 0, 3,-4, 1],此时k=3,

即,不难发现,每次k变化的时候的时候,对应的就是全数组-1,然后在第k-1的位置上+n。

然后数组中>=0的元素个数就是k轮调的时候的答案。

因此我们需要,区间更新,单点更新吗,区间查询,这三个操作,可以用线段树维护,因而复杂度是nlogn。

思路二:

可以有两种方法过渡到思路二:

其一:刚刚的方法一直是在数组上做文章,即固定数组是不变的,然后变化k,来维护答案。那可否考虑直接从k上做文章,因为k最多就1e5,建立一个k的数组,我们直接考虑对于数组中的每个元素,会影响到哪些k值,做对应的更新。

其二:之前的想法是对于每一个k,遍历所有的元素找出对应答案。那么也可以对于每一个元素,考虑他会对哪些k产生影响,然后直接从k数组中维护,因此可以建立一个k数组。

综上,我们可以考虑每一个k,用类似数形结合的方法,可以方便的发现,当i<nums[i]时,k数组中只 有一段区间需要更新,当i>=nums[i]时,k数组中有两段区间需要更新。

这种思路还有一个好处就是,我们不需要动态更新和查询答案了。我们只需要记录每个元素对答案的影响,然后最后对答案数组查询一次就行了。

因此我们需要,区间更新,区间查询一次。因此我们不需要线段树了,可以用差分数组代替。

这种思路的转换还是很妙的,记录一下。

AC代码:(思路二的解法)

class Solution {
public:int num[200005];int bestRotation(vector<int>& nums) {int n = nums.size();for(int i = 0; i<n; i++) {if(i >= nums[i]) {int l = 0, r = i-nums[i];int ll = r + nums[i]+1, rr = n-1;num[l]++;  num[ll]++;num[r+1]--; num[rr+1]--;}else {int l = i+1, r = l1+(n-nums[i]-1);num[l]++;num[r+1]--;}}for(int i = 1; i<n; i++) {num[i] += num[i-1];}int ans = 0;for(int i = 0; i<n; i++) {if(num[i] > num[ans]) {ans = i;}}return ans;}
};

【LeetCode - 798】得分最高的最小轮调(转化法)相关推荐

  1. 798.得分最高的最小轮调

    题目 798.得分最高的最小轮调 题目大意 给你一个数组 nums,我们可以将它按一个非负整数 k 进行轮调,这样可以使数组变为 [nums[k], nums[k + 1], ... nums[num ...

  2. Leetcode题库 798.得分最高的最小轮调(差分数组 C实现)

    文章目录 算法一 双层循环 算法二 差分数组 算法一 双层循环 时间复杂度:n^2 空间复杂度:n int bestRotation(int* nums, int numsSize){char Dif ...

  3. leetcode 面试题 17.14. 最小K个数 大顶堆 小顶堆 快排

    leetcode 面试题 17.14. 最小K个数 [难度:中等] 设计一个算法,找出数组中最小的k个数.以任意顺序返回这k个数均可. 示例: 输入: arr = [1,3,5,7,2,4,6,8], ...

  4. LeetCode 1130. 叶值的最小代价生成树(区间DP/单调栈贪心)

    文章目录 1. 题目 2. 解题 2.1 DP 2.2 单调栈贪心 1. 题目 给你一个正整数数组 arr,考虑所有满足以下条件的二叉树: 每个节点都有 0 个或是 2 个子节点. 数组 arr 中的 ...

  5. LeetCode 1102. 得分最高的路径(优先队列BFS/极大极小化 二分查找)

    文章目录 1. 题目 2. 解题 2.1 优先队列BFS 2.2 极大极小化 二分查找 1. 题目 给你一个 R 行 C 列的整数矩阵 A.矩阵上的路径从 [0,0] 开始,在 [R-1,C-1] 结 ...

  6. LeetCode 2059. 转化数字的最小运算数(BFS)

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的整数数组 nums ,该数组由 互不相同 的数字组成.另给你两个整数 start 和 goal . 整数 x 的值最开始设为 s ...

  7. LeetCode 2057. 值相等的最小索引

    文章目录 1. 题目 2. 解题 1. 题目 给你一个下标从 0 开始的整数数组 nums ,返回 nums 中满足 i mod 10 == nums[i] 的最小下标 i :如果不存在这样的下标,返 ...

  8. LeetCode 1879. 两个数组最小的异或值之和(状态压缩DP)

    文章目录 1. 题目 2. 解题 2.1 回溯 2.2 状态压缩DP 1. 题目 给你两个整数数组 nums1 和 nums2 ,它们长度都为 n . 两个数组的 异或值之和 为 (nums1[0] ...

  9. LeetCode 1663. 具有给定数值的最小字符串(贪心)

    文章目录 1. 题目 2. 解题 1. 题目 小写字符 的 数值 是它在字母表中的位置(从 1 开始),因此 a 的数值为 1 ,b 的数值为 2 ,c 的数值为 3 ,以此类推. 字符串由若干小写字 ...

最新文章

  1. RouterOS限速更高级运用
  2. 基于单片机的自动追日系统设计_基于单片机的自动浇花系统的设计
  3. locate: database too small: /var/db/locate.databas
  4. php log 行号 debug_backtrace,PHP debug_backtrace() 函数生成 backtrace(回溯跟踪)
  5. 转 python 闭包的说明
  6. 支持4k输出的linux开发板,Linux 5.12率先开始支持SiFive的RISC-V FU740开发板
  7. 【转】LDA-linear discriminant analysis
  8. Mac电脑如何设置触控栏显示APP控制?
  9. 使用git命令把自己的代码上传到gitlab上
  10. Django下载超时
  11. 假如时光能够倒流, 我会这么学习Java
  12. python提取pdf中的文字和图片_python 三种方法提取pdf中的图片
  13. Mac下浏览器超实用快捷键
  14. Xmind8 思维导图 使用教程
  15. Shell语言(一)
  16. 网站访问量和服务器带宽的关系
  17. java程序封装最小单位,持续更新中
  18. 3dmax转化html,VRayMtl Converter材质转换3dsmax插件V3.97版
  19. 35美元与35万美元
  20. 企业电脑升级kvm桌面虚拟化软件解决方案

热门文章

  1. ubuntu11.10中配置OGRE1.8
  2. [剑指offer]面试题第[59-2]题[JAVA][队列的最大值][暴力][双端队列]
  3. ueditor上传图片写入数据库_手把手教你,如何用交管12123上传驾驶证照片!
  4. linux下anaconda3安装教程,Ubuntu18.04 安装 Anaconda3的教程详解
  5. 利用一维数组求菲波那契数列前40项的和并输出结果。_[W2D2]斐波那契数列
  6. 怎么用PHP修改文字大小,如何利用PHP和CSS改变网页文字大小
  7. python中代理模式分为几种_Python设计模式之代理模式实例详解
  8. 通州区机器人比赛活动总结_马驹桥镇中心小学在2017通州区青少年机器人竞赛中勇创佳绩...
  9. 电脑屏保海底世界_炸弹测深出来的海底一万米,都藏有何种玄机?
  10. linux 用脚本建分区,脚本创建磁盘分区