【leetCode】396.旋转函数

本文探讨了如何将解决一个涉及数组旋转的函数的时间复杂度从平方降低到线性。通过观察数组旋转规律,作者介绍了从递归迭代到利用矩阵乘法的优化思路,并最终提供了一个线性时间复杂度的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述
在这里插入图片描述

import numpy as np
from typing import List
class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        length = len(nums)
        sum = []
        for i in range(0,length):
            count = 0
            s =0
            for j in range(length-i,length):
                s += count*nums[j]
                count+=1
            for j in range(0,length-i):
                s+=count*nums[j]
                count+=1
            sum.append(s)
        re = int(max(sum))
        return (re)


nums = [4,3,2,6]
a = Solution().maxRotateFunction(nums)
print(a)

但是一道中等难度的题想法自然不会那么简单。而且时间复杂度为0(n^2)
然后我想利用python中的矩阵乘法去试一下:但是这跟上面一样也是O(n^2)代码如下:

import numpy as np
from typing import List
class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        length = len(nums)
        temp = np.arange(0,length)
        temp = temp.tolist()
        ha = []
        ty = temp
        for i in range(0,length):
            ha.append(ty)
            ty = temp [length-i-1:]+temp[0:length-i-1]
        sum = np.dot(ha,nums)
        return max(sum)


nums = [4,3,2,6]
a = Solution().maxRotateFunction(nums)
print(a)

其实只要把前几种情况写出来,然后相邻两个方案对比一下,就可以找到规律:
如例子:【4,3,2,6】
04+13+22+36
06+14+23+32
看出来了吗 从4开始 比上一个多了一倍,但是最后一个数 是少了(n-1)倍。
这就是这道题的解法。

import numpy as np
from typing import List
class Solution:
    def maxRotateFunction(self, nums: List[int]) -> int:
        length = len(nums)
        result = []
        Sm = sum(nums)
        s = 0
        for i in range(0, length):
            s+=(i*nums[i])
        result.append(s)
        for i in range(0,length):
            s = result[-1] + Sm - nums[length-1-i] -nums[length-1-i]*(length-1)
            result.append(s)
        re = int(max(result))
        return (re)


nums = [4,3,2,6]
a = Solution().maxRotateFunction(nums)
print(a)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值