首页 > 其他分享 >今日力扣:3254. 长度为 K 的子数组的能量值 I

今日力扣:3254. 长度为 K 的子数组的能量值 I

时间:2024-11-06 10:17:24浏览次数:3  
标签:cnt nums 元素 3254 力扣 数组 ans 长度

给你一个长度为 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]

class Solution:
    def resultsArray(self, nums: List[int], k: int) -> List[int]:
        ans = [-1] * (len(nums) - k + 1)
        cnt = 0
        for i, x in enumerate(nums):
            cnt = cnt + 1 if i == 0 or x == nums[i - 1] + 1 else 1
            if cnt >= k:
                ans[i - k + 1] = x
        return ans

核心思路:找连续上升的段。如果段长至少是 k,那么这段中的所有长为 k 的子数组都是符合要求的,子数组的最后一个元素是最大的。

具体来说,遍历数组的同时,用一个计数器 cnt 统计连续递增的元素个数:

初始化 cnt=0。
如果 i=0 或者 nums[i]=nums[i−1]+1,把 cnt 增加 1;否则,把 cnt 置为 1。
如果发现 cnt≥k,那么下标从 i−k+1 到 i 的这个子数组的能量值为 nums[i],即 ans[i−k+1]=nums[i]。

复杂度分析
  • 时间复杂度:O(n),其中 n 是 nums 的长度。
  • 空间复杂度:O(1)。返回值不计入。
  • 灵茶山艾府提供题解。

标签:cnt,nums,元素,3254,力扣,数组,ans,长度
From: https://blog.csdn.net/m0_57709413/article/details/143562085

相关文章

  • c语言中获取数组的长度
     001、一维数组[root@PC1test1]#lstest.c[root@PC1test1]#cattest.c#include<stdio.h>intmain(void){intv1[5]={3,4,8};printf("lengthofv1is%d\n",sizeof(v1)/sizeof(v1[0]));return0;}[root@PC1tes......
  • 【java】实战-力扣题库:有序数组的平方
    问题描述给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。问题分析:既然给定的是一个非递减顺序的数组我们可以使用双指针,一个指向左边,一个指向右边,比较两边平方后的大小。哪个大,就把那个数放到当前数......
  • 编写程序,将用户输入的整数X插入到一个升序排列的数组(int a[10]={1, 3,6, 9,15, 28,35
    #include<stdio.h>intmain(){ intarr[10]={1,3,6,9,15,28,35,53,63}; intx=0;//定义这个输入的数 inti=0; intindex=0; scanf_s("%d",&x); if(x<=arr[0]) index=0;//当x小于最小数时,index等于0 elseif(x>=arr[8]) index=9;//当......
  • C语言字符数组 java封装
    1.intmain(void){   inta[5]={1,3,5,7,9};   charstrl[5]={'A','B','C','D','E'};   charstr2[5]="ABCD";//不能是ABCDE,最后还有\0   inti=0;   //for(i=0;i<5;i++)   //{ ......
  • 力扣题目解析--三数之和
    题目给你一个整数数组 nums ,判断是否存在三元组 [nums[i],nums[j],nums[k]] 满足 i!=j、i!=k 且 j!=k ,同时还满足 nums[i]+nums[j]+nums[k]==0 。请你返回所有和为 0 且不重复的三元组。注意:答案中不可以包含重复的三元组。示例1:输入:nums=[......
  • Leecode热题100-4.寻找两个正序数组的中位数
    给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。算法的时间复杂度应该为 O(log(m+n)) 。示例1:输入:nums1=[1,3],nums2=[2]输出:2.00000解释:合并数组=[1,2,3],中位数2示例2:输入:nums1=[......
  • 蓝桥杯每日一练--搜索旋转排序数组
    目录一、题目二、分析三、代码一、题目整数数组 nums 按升序排列,数组中的值 互不相同 。在传递给函数之前,nums 在预先未知的某个下标 k(0<=k<nums.length)上进行了 旋转,使数组变为 [nums[k],nums[k+1],...,nums[n-1],nums[0],nums[1],...,nums[k-1]](......
  • 用pandas 读取excel文件,存到数组中,调整数组的值
    importpandasaspdimportpymysqlfromdatetimeimportdatetime#定义一个自增的全局变量counter=1defincrement():globalcountercounter+=1returncounter#调用函数并打印结果#print(get_current_date())defget_array():#读取Excel......
  • 力扣新手村之1342、1672、412
    1342[将数字变成0的操作次数]题目链接LeetCode1342[将数字变成0的操作次数]详情实例实例1实例2实例3提示题解思路判断num是否为0不为0则判断num是否为偶数num是偶数则除以2num不是偶数则减1操作次数加1重复上述步骤,直到num为0,返回操作次数代码cla......