上周末终于有空参加LeetCode的比赛了,而且这还是我第一次在比赛中完成所有的题目。虽然加上罚时超了比赛时间,但和以前相比也算是很大的进步。这次的题目比较简单,前两道就是暴力解法,第三道是动态规划的简单应用,最后一道比较有意思,我一开始超时了,后来发现可以用滑动窗口的思想优化。滑动窗口即Sliding Window,其实我不确定滑动窗口是不是一个算法,因为我在书上并没有看到过这个算法的介绍,但滑动窗口的思想是非常棒的,在很多题目中都能用到,接下来就以这次的最后一题为例介绍滑动窗口。
滑动窗口
滑动窗口即在数组上维护一个区间,不断调整首尾直到遍历数组。适用滑动窗口的题目往往要求找到数组中的一个区间,如果遍历数组中所有的区间,时间复杂度为O(n2),而滑动窗口的时间复杂度为O(n)。
Smallest Rotation with Highest Score
问题
给出一个数组,可以将这个数组的每一位元素往左移(越界的元素补到最右边)得到一个新的数组,长度为n
的数组一共可以得到n
个不同的数组。现在给每个数组打分,一个数组每一位元素的值若不大于下标则得1
分,求最高分的数组