题目如下:

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. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_5 Mybatis的CRUD-查询返回一行一列和占位符分析

    聚合函数 模糊查询的另外一种写法 如果用户这种方式里面的value是固定的 因为在源码分析中,绑定的就是固定的value值 所以这里传参数的 没必要在用百分号了 删掉后 xml里面应该用这种方式来注释 ...

  2. 测开之路一百四十五:SQLAlchemy与后台模板整合之新增、查询、删除

    实现在页面上点击展示页就展示内容,点击新增页就触发新增功能 项目结构 admin.__init__ from flask import Blueprint admin = Blueprint('adm ...

  3. Spring MVC 中RequestContextHolder获取request和response

    1.最简单方式:处理方法入参 例如: @RequestMapping("/test") @ResponseBody public void saveTest(HttpServlet ...

  4. itchat初步解读登录(转)

    原文:https://blog.csdn.net/coder_pig/article/details/81357810 itchat的登录采取的是通过itchat.auto_login()这个函数来完 ...

  5. back()是返回,也就是说,先加载地址到A页面,再打开页面到B页面,调用 back()方法,就返回到了A页面

    from selenium import webdriverdriver=webdriver.Firefox()driver.maximize_window()driver.get('http://w ...

  6. ElasticSearch入门 —— 集群搭建

    一.环境介绍与安装准备 1.环境说明 2台虚拟机,OS为ubuntu13.04,ip分别为xxx.xxx.xxx.140和xxx.xxx.xxx.145. 2.安装准备 ElasticSearch(简 ...

  7. docker--docker仓库

    8 docker仓库 Docker仓库(Repository)类似与代码仓库,是Docker集中存放镜像文件的地方. 8.1 docker hub 1.打开https://hub.docker.com ...

  8. shell脚本每隔几秒执行

    while true do cmd(shell 命令) sleep x(x为秒数) done ————————————————版权声明:本文为CSDN博主「这年头起名真难3232」的原创文章,遵循 C ...

  9. [Web 前端] 034 计算属性,侦听属性

    目录 0. 方便起见,定个轮廓 1. 过滤器 2. 计算属性 2.1 2.2 3. 监听属性 0. 方便起见,定个轮廓 不妨记下方的程序为 code1 <!DOCTYPE html> &l ...

  10. spring - 第N篇 一些笔记

    1.properties文件的引入 <bean id="propertyConfigurer" class="org.springframework.beans.f ...