力扣-数组的旋转
- 数组倒置
list.reverse()
reversed(list)
两者的区别:
- reverse()只能对整个列表进行翻转,而reversed()可以对数组一部分进行翻转。
- reverse()是在原数组上进行翻转,reversed()返回的是一个翻转后的迭代器。
旋转数组(189)
思路: 先将整体数组倒置,再将前 k 个元素和后 len(nums)-k 个元素倒置,即为所求。
但要考虑以下特殊情况:
- k=0 时,数组不变
- k=3,nums[1,2] 时 ,也就是移动单位比数组长度还要大时,令k = k % len(nums)
class Solution:
def rotate(self, nums: List[int], k: int) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
k=k%len(nums)
if k!=0:
nums.reverse()
nums[:k]=nums[k-1::-1]
nums[k:]=nums[-1:k-1:-1]
旋转函数(396)
思路:
/**
* 把数组逆转跟把乘数逆转是一样的,可以看出有如下规律
* 4 3 2 6
*
* 0*4 1*3 2*2 3*6 F(0)
*
* 1*4 2*3 3*2 0*6 F(1) = F(0) + SUM(data) - N * data[3];
*
* 2*4 3*3 0*2 1*6 F(2) = F(1) + SUM(data) - N * data[2];
*
* 3*4 0*3 1*2 2*6 F(3) = F(2) + SUM(data) - N * data[1];
*
*/
class Solution:
def maxRotateFunction(self, nums: List[int]) -> int:
l=len(nums)
s=sum(nums)
f=0
for k in range(l):
f+=k*nums[k]
m=f
for i in range(l-1,-1,-1):
f=f+s-nums[i]*l
m=max(m,f)
return m