题目如下:

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的更多相关文章

  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 ...

  2. 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 ...

  3. 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 ...

  4. [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 ...

  5. 【leetcode】668. Kth Smallest Number in Multiplication Table

    题目如下: 解题思路:几乎和[leetcode]719. Find K-th Smallest Pair Distance 的方法一样.只不过一个是减法一个是乘法,还有一点区别是[leetcode]7 ...

  6. 【LeetCode】378. Kth Smallest Element in a Sorted Matrix 解题报告(Python)

    [LeetCode]378. Kth Smallest Element in a Sorted Matrix 解题报告(Python) 标签: LeetCode 题目地址:https://leetco ...

  7. 【LeetCode】373. Find K Pairs with Smallest Sums 解题报告(Python)

    [LeetCode]373. Find K Pairs with Smallest Sums 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/p ...

  8. 【LeetCode】数学(共106题)

    [2]Add Two Numbers (2018年12月23日,review) 链表的高精度加法. 题解:链表专题:https://www.cnblogs.com/zhangwanying/p/979 ...

  9. 【LeetCode】哈希表 hash_table(共88题)

    [1]Two Sum (2018年11月9日,k-sum专题,算法群衍生题) 给了一个数组 nums, 和一个 target 数字,要求返回一个下标的 pair, 使得这两个元素相加等于 target ...

随机推荐

  1. Linux_PXE服务器_RHEL7

    目录 目录 前言 PXE原理 搭建PXE服务器 关闭SELinux和防火墙 配置DHCP 配置TFTP 配置FTP 配置Kickstart 前言 PXE(preboot execute environ ...

  2. kubernets监控

    Weave Scope 容器地图   创建 Kubernetes 集群并部署容器化应用只是第一步.一旦集群运行起来,我们需要确保一起正常,所有必要组件就位并各司其职,有足够的资源满足应用的需求.Kub ...

  3. 性能测试工具之WebBench

    一.简介 WebBench是一款在Linux下使用非常简单的压力测试工具.它的原理是:WebBench首先fork出多个子进程,每个子进程都循环做web访问测试.子进程把访问的结果通过pipe告诉父进 ...

  4. 【Hibernate】---【注解】一对一

    一.核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-con ...

  5. 03.大型数据库应用技术课堂测试3(java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V)

    本次问题主要出在了之前没有安装hive,结构导致大部分时间花在了安装上面,主要一直报错,网上找不到相关教程.

  6. seanborn使用函数regplot回归分析绘图

    可以用regplot(x, y, data)绘制回归图.data参数是DataFram类型,x是其中某一列列名,是即将绘制的图的x坐标,y是其中某一列,是图的y坐标 下面代码是对seaborn内置数据 ...

  7. Maven 中 resources 作用

    默认情况下,如果没有指定resources,目前认为自动会将src/main/resources下的.xml文件放到target里头的classes文件夹下的package下的文件夹里.如果设定了re ...

  8. 解决MySql忘记密码

    描述:忘记了mysql的登录密码,无法登录的情况下该怎么办? 环境:CentOS 7,数据库:mysql 5.7 1.停止数据库(先查看mysql服务是否运行) # ps -ef | -i grep ...

  9. 数位dp相关

    经典的数位Dp是要求统计符合限制的数字的个数. 一般的形式是:求区间[n,m]满足限制f(1). f(2). f(3)等等的数字的数量是多少. 条件 f(i) 一般与数的大小无关,而与数的组成有关. ...

  10. 题解 AT1877 【回文分割】

    题意:给定一个字符串 s,将 s 分割成一些子串,使每个子串都是回文串. 返回 s 所有可能的分割方案. 示例: 输入:aab 输出:3 解释:aba 思路: 记录字符串中每个字符出现的次数si 如果 ...