首页 > 其他分享 >题解:3254. 长度为 K 的子数组的能量值

题解:3254. 长度为 K 的子数组的能量值

时间:2024-11-08 11:19:28浏览次数:7  
标签:nums int 题解 递增 3254 数组 长度 left

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

题解:3254. 长度为 K 的子数组的能量值

给定一个数组 nums 和一个整数 k,我们需要找出所有长度为 k 的子数组的“能量值”。根据题意:

  • 如果子数组是连续递增的,能量值等于子数组中的最大元素。
  • 否则,能量值为 -1

以下是两种不同的解法。第一种是暴力法,第二种是使用滑动窗口法进行优化。


方法一:暴力法

思路

遍历每一个长度为 k 的子数组,逐个检查是否满足递增条件。若满足,则记录该子数组的最大值;否则记录 -1

代码实现
class Solution {
public:
    vector<int> resultsArray(vector<int>& nums, int k) {
        int n = nums.size();
        vector<int> ans(n - k + 1, -1); // 初始化结果数组,默认为-1

        // 遍历每一个长度为k的子数组
        for (int i = 0; i <= n - k; i++) {
            bool valid = true; // 标记该子数组是否连续递增

            // 检查当前子数组是否连续递增
            for (int j = i + 1; j < i + k; j++) {
                if (nums[j] - nums[j - 1] != 1) { // 不是连续递增
                    valid = false;
                    break;
                }
            }

            // 如果是递增的,记录最大值(即该子数组的最后一个元素)
            if (valid) {
                ans[i] = nums[i + k - 1];
            }
        }

        return ans;
    }
};
代码解释
  1. 初始化 ans 数组,默认所有值为 -1
  2. 对于每个长度为 k 的子数组,从索引 ii + k - 1
    • 检查相邻元素是否连续递增。
    • 若所有相邻元素递增,则将该子数组的最后一个元素作为能量值。
  3. 返回结果数组。
时间复杂度
  • 时间复杂度O(n * k)。对于每个长度为 k 的子数组,我们逐个检查是否递增。
  • 空间复杂度O(n - k + 1)

方法二:滑动窗口法

思路

通过滑动窗口法优化。用指针 left 记录上一个非递增的起始位置,从而避免重复检查整个子数组。

代码实现
class Solution {
public:
    vector<int> resultsArray(vector<int>& nums, int k) {
        int n = nums.size();
        if (k == 1) { // 如果k=1,每个元素本身都是一个递增子数组
            return nums;
        }

        vector<int> ans(n - k + 1, -1); // 初始化结果数组,默认为-1
        int left = 0; // 标记递增子数组的起点

        // 从第二个元素开始遍历
        for (int i = 1; i < n; i++) {
            // 如果当前元素与前一个元素不连续递增,更新left
            if (nums[i] - nums[i - 1] != 1) {
                left = i;
            }

            // 检查是否形成长度为k的递增子数组
            if (i - left < k - 1) continue; // 当前子数组长度不够

            // 满足长度为k的递增子数组,记录最大值
            ans[left] = nums[i];

            // 滑动窗口右移,继续检查下一个子数组
            left++;
        }

        return ans;
    }
};
代码解释
  1. k = 1,每个元素单独成为一个子数组,直接返回 nums
  2. 初始化 left0,表示递增子数组的开始位置。
  3. 遍历数组,检查每个 nums[i]
    • 如果 nums[i] - nums[i-1] != 1,则 nums[i] 和前一个元素不连续,更新 left = i
    • i - left 达到 k-1,则从 lefti 形成长度为 k 的递增子数组,记录 nums[i] 为能量值。
  4. left 右移继续检查。
时间复杂度
  • 时间复杂度O(n),每个元素仅需一次遍历。
  • 空间复杂度O(n - k + 1)

标签:nums,int,题解,递增,3254,数组,长度,left
From: https://blog.csdn.net/PQ781826/article/details/143564221

相关文章

  • 找单独的数(获取数组中只出现一次的数)
    问题描述在一个班级中,每位同学都拿到了一张卡片,上面有一个整数。有趣的是,除了一个数字之外,所有的数字都恰好出现了两次。现在需要你帮助班长小C快速找到那个拿了独特数字卡片的同学手上的数字是什么。要求:设计一个算法,使其时间复杂度为O(n),其中n是班级的人数。尽量减少额......
  • CF 1365 题解
    CF1365题解AMatrixGame注意到每次操作都相当于会损失一行和一列,那么最多进行可用行列较少的那一个的轮数.判断奇偶性即可,BTroubleSort手玩发现,不管一个属性的元素集合内部多么无序,都可以借助一个其它属性的元素达到有序.归纳证明特别简单.因此,一个序列可以......
  • P5479 [BJOI2015] 隐身术 题解
    题目传送门前置知识后缀数组简介|字符串哈希|二分解法考虑分别计算出编辑距离恰好等于\(k_{0}\in[0,k]\)的答案。观察在编辑距离的存在下,长度差至多为\(k\)。考虑设\(f_{i,j}\)表示最大的\(x\)使得\(s_{1\simx}\)和\(t_{1\simx+j}\)可以在\(i\)次编......
  • golang 数组切片
    golang基础数组+切片packagemainimport( "fmt")//数组切片学习funcmain(){ //数组的初始化方式 nums1:=[3]int{1,2,3}//指定长度,全部初始化 fmt.Println("nums1:",nums1) nums2:=[5]int{1,2,3}//指定长度,部分初始化 fmt.Println("nums2:",nums2)......
  • LeetCode 2535[数组元素和与数字和的绝对差值]
    题目链接LeetCode2535[数组元素和与数字和的绝对差值]详情实例提示题解思路遍历容器,依次求出数字和与元素和,然后求差值:通过getSun函数,求取元素的数字和 getSun函数的实现:  将其对10取余操作,获取的余数即为当前位的数字  然后再除以10,继续对其进行10的取......
  • 洛谷题单指南-二叉堆与树状数组-P2827 [NOIP2016 提高组] 蚯蚓
    原题链接:https://www.luogu.com.cn/problem/P2827题意解读:初始n个数,每次取最大值x,根据u/v分成两部分:x*u/v,x-x*u/v,然后其余数都增加q,整个过程重复m次。输出有两类数据:第t,2t,3t...次取出的最大值;最后剩余的数第t,2t,3t...个,从大到小输出。解题思路:直观上,通过模拟法可以实......
  • P7984 [USACO21DEC] Tickets P 题解
    题目传送门前置知识线段树优化建图|最短路解法考虑对票建虚点,从\(c_{i}\)向\(i+n\)连一条权值为\(p_{i}\)的边,然后从\(i+n\)向\([a_{i},b_{i}]\)连一条权值为\(0\)的边。建出反图后\(1\toi\)和\(n\toi\)的路径集合会有重复统计的部分,不妨以\(dis_{1,i......
  • c语言二维数组
    一、创建二维数组并初始化在c语言中二维数组可以在声明时直接初始化。#include<stdio.h>intmain(){//创建一个3x3的二维数组并初始化intmatrix[3][3]={{1,2,3},{4,5,6},{7,8,9}};return0;}二、访问二......
  • c语言一维数组
    一维数组数组的目的主要是为了解决在编程中需要存储和处理多个相同类型数据的问题。#include<stdio.h>intmain(){intarr[5]={1,2,3,4,5};//定义一个一维数组for(inti=0;i<5;i++){//使用for循环遍历数组printf("%d",arr[i]);//打......
  • 快速上手Docker部署Flask项目 附常见问题解决
    一、准备Flask项目1.项目结构有一个app.py文件作为主应用程序入口,内容示例:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=='__main__':app.run(host='0.0.0.0&#......