LeetCode 3254. 长度为 K 的子数组的能量值 I

. - 力扣(LeetCode)

题目

给你一个长度为 n 的整数数组 nums 和一个正整数 k 。

一个数组的 能量值 定义为:

  • 如果 所有 元素都是依次 连续 且 上升 的,那么能量值为 最大 的元素。
  • 否则为 -1 。

你需要求出 nums 中所有长度为 k 的子数组的能量值。

请你返回一个长度为 n - k + 1 的整数数组 results ,其中 results[i] 是子组 nums[i..(i + k - 1)] 的能量值。

  • 示例 1:(从示例中可以看出,子数组是指连续子数组
    • 输入:nums = [1,2,3,4,3,2,5], k = 3
    • 输出:[3,4,-1,-1,-1]
    • 解释:nums 中总共有 5 个长度为 3 的子数组:
      • [1, 2, 3] 中最大元素为 3 。
      • [2, 3, 4] 中最大元素为 4 。
      • [3, 4, 3] 中元素 不是 连续的。
      • [4, 3, 2] 中元素 不是 上升的。
      • [3, 2, 5] 中元素 不是 连续的。
  • 示例 2:
    • 输入:nums = [2,2,2,2,2], k = 4
    • 输出:[-1,-1]
  • 示例 3:
    • 输入:nums = [3,2,3,2,3,2], k = 2
    • 输出:[-1,3,-1,3,-1]

解题方案

穷举法

  • 穷举所有长度为n的子数组,并计算能量值。
  • 计算能量值时,可以采用动态规划,状态转移方程如下:sub[i,j] 代表以i位置为开头,j位置结尾的子数组。

sub[i,j]=\left\{\begin{matrix} nums[i] & if\ (j == i)\\ -1 & if\ [(j > i)\ and\ [(nums[j] != nums[j-1] + 1)\ or\ (sub[i, j-1] == -1) ]]\\ nums[j] & if\ [(j > i)\ and\ (nums[j] == nums[j-1] + 1)\ and\ (sub[i, j-1] != -1) ] \end{matrix}\right.

 

class Solution:
    def resultsArray(self, nums: List[int], k: int) -> List[int]:
        results = []
        for i in range(len(nums) - k + 1):
            last_num = nums[i]
            value = last_num
            for j in range(i + 1, i + k):
                if value == -1 or nums[j] != nums[j - 1] + 1:
                    value = -1
                else:
                    value = nums[j]
            results.append(value)
        return results

        

分析复杂度

  • 时间复杂度:因为以每个元素为开头的子数组,都要计算k次状态,因此时间复杂度是O(nk)
  • 空间复杂度:除了返回值,只占用last_num和value两个空间,因此空间复杂度是O(1)

统计长度

统计以每个位置为结尾的连续数组的长度。c[i]代表以i位置为结尾的连续数组长度。状态转移方程为:

c[i]=\left\{\begin{matrix} 1 & if\ (i == 0)\\ c[i - 1] + 1 & if\ [(i > 0)\ and\ [(nums[i] == nums[i-1] + 1)]\\ 1 & if\ [(i > 0)\ and\ [(nums[i] != nums[i-1] + 1)] \end{matrix}\right.

class Solution:
    def resultsArray(self, nums: List[int], k: int) -> List[int]:
        results = [-1] * (len(nums) - k + 1)
        last_len = 0
        for i in range(len(nums)):
            last_len = 1 if (i == 0 or nums[i] != nums[i - 1] + 1) else last_len + 1
            if last_len >= k:
                results[i + 1 - k] = nums[i]
           
        return results

        

 分析复杂度

  • 时间复杂度是O(n)
  • 空间复杂度是O(1)

看下AI效果如何

豆包给出了类似我们第一种算法O(nk)时间复杂度的解法。和AI打平的一天呢

LeetCode 3254. 长度为 K 的子数组的能量值 I_第1张图片

你可能感兴趣的:(leetcode,算法,职场和发展)