📌  相关文章
📜  计算保存i * arr [i]> j * arr [j]的数组中的对(1)

📅  最后修改于: 2023-12-03 15:27:59.481000             🧑  作者: Mango

计算保存i * arr [i] > j * arr [j]的数组中的对

本题需求是在给定数组 arr 中,找出有多少对下标组成的数组 (i,j) 满足条件 i * arr[i] > j * arr[j]。

思路分析

首先,我们可以考虑暴力方法,遍历所有下标对 (i,j),但时间复杂度为 $O(n^2)$,无法满足给定的时间限制。

我们可以发现,当 i 增大时,i * arr[i] 也越来越大。而对于 j 而言,则是 j * arr[j] 越来越小。因此,我们可以从 i 的起始位置开始遍历,并在每次遇到一个更大的 i 时,将此后的所有 j 加入答案中。

因为 j 一定小于 i,所以 j 在遍历数组过程中不会被重复考虑。

算法实现

下面给出 Python3 代码实现:

from typing import List


class Solution:
    def maxSumAfterPartitioning(self, arr: List[int], k: int) -> int:
        n = len(arr)
        dp = [0] * n

        for i in range(n):
            curMax = 0
            for j in range(i, max(-1, i - k), -1):
                curMax = max(curMax, arr[j])
                if j == 0:
                    dp[i] = max(dp[i], curMax * (i - j + 1))
                else:
                    dp[i] = max(dp[i], dp[j - 1] + curMax * (i - j + 1))

        return dp[n - 1]
复杂度分析

时间复杂度为 $O(nk)$,其中 n 为数组 arr 的长度,k 为给定的常数。

空间复杂度为 $O(n)$,即为动态规划数组 dp 的空间消耗。

小结

本题主要考察了动态规划以及贪心的算法思路和实现。我们需要认真分析问题,充分利用问题中的规律,才能设计出高效可行的算法,解决本题。