【leetcode】Smallest Rotation with Highest Score
题目如下:
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1], A{K+2], ... A[A.length - 1], A[0], A[1], ..., A[K-1].
Afterward, any entries that are less than or equal to their index are worth 1 point.
For example, if we have [2, 4, 1, 3, 0], and we rotate by K = 2, it becomes [1, 3, 0, 2, 4].
This is worth 3 points because 1 > 0 [no points], 3 > 1 [no points], 0 <= 2 [one point], 2 <= 3 [one point], 4 <= 4 [one point].
Over all possible rotations, return the rotation index K that corresponds to the highest score we could receive. If there are multiple answers, return the smallest such index K.
Example 1:
Input: [2, 3, 1, 4, 0]
Output: 3
Explanation:
Scores for each K are listed below:
K = 0, A = [2,3,1,4,0], score 2
K = 1, A = [3,1,4,0,2], score 3
K = 2, A = [1,4,0,2,3], score 3
K = 3, A = [4,0,2,3,1], score 4
K = 4, A = [0,2,3,1,4], score 3
So we should choose K = 3, which has the highest score.
Example 2:
Input: [1, 3, 0, 2, 4]
Output: 0
Explanation: A will always have 3 points no matter how it shifts.
So we will choose the smallest K, which is 0.
Note:
A will have length at most 20000.
A[i] will be in the range [0, A.length].
结题思路:本题主要考察的是算法的时间复杂度,如果时间复杂度是O(n^2)的话,系统会判定超时,所以关键是优化算法。如下图,我们可以把题意理解成是每次把数组的第一个元素移到最后然后求出当前状态的point,最后得出最大的point出现的时机。point是根据元素的值减去元素所在下标得来的,只有元素的值小于或者等于下标才能得到point。接下来,我们再观察每次移动数组的第一个元素后的得失point情况,首先只有一个可能会得到point的,那就是移动的元素小于数组末尾的下标;对于失去point的情况,除了第一个元素外,其他的元素相当于是右移,而右移是一个下标减小的过程,元素的值不变,而下标不断减小,所以在平移过程中,原先能得到point的元素可能会变得得不到point,而原先就等不到的不管平移到哪里都还是得不到。发现这些规律后,结题的方法就呼之欲出了。首先,遍历数组,得到所有得到point的元素数量count,以及一个包括元素值和元素下标差值v以及v出现的次数的字典(这里我用的是数组,可能直接通过下标查找),显然所有v出现的次数是等于point的元素数量的。接下来就是关键了,再次遍历数组,每移动一个元素,用count减去失去point元素的数量,再加上移动到最后的元素是否能得到point的数量,即是这次移动后的point值,直到所有元素都移动到最后,即可求出最大的point。还有一点要注意的是,第一个元素移到数组最后时,如果能得到point,需要把这个元素加到字典中去,因为随着数组的移动,这个元素后面有可能又会失去point。

代码如下:
class Solution(object):
def bestRotation(self, A):
"""
:type A: List[int]
:rtype: int
"""
l = []
K = 0
highest = 0
val = [0 for x in range(len(A)*2)]
for i in range(len(A)):
if A[i] - i <= 0:
val[-1*(A[i] -i)] += 1
highest += 1
count = highest
for i in range(1,len(A)):
count -= val[i-1] #每移动一个元素,用count减去失去point元素的数量
val[i-1] = 0
t = A[i-1] - (len(A) -1)
if t <= 0:
count += 1 #再加上移动到最后的元素是否能得到point的数量
val[-1*t+i] += 1 #关键点:要把平移的元素重新加入字典,因为后面可能会失去point
if highest <count:
highest = count
K = i
return K
【leetcode】Smallest Rotation with Highest Score的更多相关文章
- [LeetCode] Smallest Rotation with Highest Score 得到最高分的最小旋转
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...
- LeetCode – Smallest Rotation with Highest Score
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...
- 75th LeetCode Weekly Contest Smallest Rotation with Highest Score
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...
- [Swift]LeetCode798. 得分最高的最小轮调 | Smallest Rotation with Highest Score
Given an array A, we may rotate it by a non-negative integer K so that the array becomes A[K], A[K+1 ...
- 【leetcode】668. Kth Smallest Number in Multiplication Table
题目如下: 解题思路:几乎和[leetcode]719. Find K-th Smallest Pair Distance 的方法一样.只不过一个是减法一个是乘法,还有一点区别是[leetcode]7 ...
- 【LeetCode】378. Kth Smallest Element in a Sorted Matrix 解题报告(Python)
[LeetCode]378. Kth Smallest Element in a Sorted Matrix 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...
- 【LeetCode】373. Find K Pairs with Smallest Sums 解题报告(Python)
[LeetCode]373. Find K Pairs with Smallest Sums 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/p ...
- 【LeetCode】数学(共106题)
[2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...
- 【LeetCode】哈希表 hash_table(共88题)
[1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...
随机推荐
- python对象的引用
1 利用 * 星号生成二维及二维以上的list时,特别要注意有的量引用是相同的.如果后面要给list赋值,最好不要这样生成list. 可以先这样生成,再打印输出后,粘贴到程序中重新赋值. a = [[ ...
- CSS3——盒子模型 border(边框) 轮廓(outline)属性 margin外边距 padding填充
盒子模型 包括——边距,边框,填充,和实际内容 Margin(外边距) - 清除边框外的区域,外边距是透明的. Border(边框) - 围绕在内边距和内容外的边框. Padding(内边距) - 清 ...
- 【MM系列】SAP MM模块-货物移动对标准价的影响
公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[MM系列]SAP MM模块-货物移动对标准价的 ...
- seaborn用heatmap画热度图
原文链接 https://blog.csdn.net/m0_38103546/article/details/79935671
- linux/linux学习笔记-vim文本编辑器(mooc)
vim文本编辑器 vim与vi的区别:( vim=vi +IMproved) VIM是一个Unix以及类unix文本编辑器 特点:功能强大,高度可定制 vim编辑器的三种模式:一般模式.编辑模式和命令 ...
- vue封装一些常用组件loading、switch、progress
vue封装一些常用组件loading.switch.progress github文档https://github.com/zengjielin/vue-component-library loadi ...
- 20191128 Spring Boot官方文档学习(9.4-9.8)
9.4.Spring MVC Spring Boot有许多启动器包含Spring MVC.请注意,一些启动器包括对Spring MVC的依赖,而不是直接包含它. 9.4.1.编写JSON REST服务 ...
- VM CentOS建立共享文件夹实现VS Code在windows环境下go开发,在centos环境里编译
简介 笔记本没办法更换系统,但是开发又必须在linux环境下进行,直接在vm界面环境下开发,卡的都蒙13.无奈之下想到这个法子,来解决现有尴尬的局面>>> 共分3个部分安装: (1) ...
- Kibana开启中文语言
Kibana在6.7以后的版本,支持了多种语言.并且自带在安装包里. 开启方式: 找到Kibana配置文件所在:config/kibana.yml找到配置:i18n.locale: "en& ...
- for语句与if语句嵌套的简单应用
1.循环语句 for(初始条件:循环条件:状态改变) { 循环体 } break为跳出循环,continue为结束此次循环. 2.死循环常用while语句 while(判断语句) { if(判断) { ...