当前位置: 首页 > wzjs >正文

比较好的网站开发框架青岛网站开发学校

比较好的网站开发框架,青岛网站开发学校,百度推广要多少钱,深圳保障性住房有哪些力扣2444. 统计定界子数组的数目:Java三种解法详解 题目描述 给定整数数组 nums 和两个整数 minK 和 maxK,统计满足以下条件的子数组数目: 子数组的最小值等于 minK;子数组的最大值等于 maxK。 示例: 输入&#xf…

力扣2444. 统计定界子数组的数目:Java三种解法详解

题目描述

给定整数数组 nums 和两个整数 minKmaxK,统计满足以下条件的子数组数目:

  1. 子数组的最小值等于 minK
  2. 子数组的最大值等于 maxK

示例
输入:nums = [1,3,5,2,7,5], minK = 1, maxK = 5
输出:2
解释:满足条件的子数组为 [1,3,5][1,3,5,2]


解法一:单次遍历 + 边界标记(推荐)

代码实现

class Solution {public long countSubarrays(int[] nums, int minK, int maxK) {int n = nums.length;long ans = 0;int minPos = -1, maxPos = -1, border = -1;for (int i = 0; i < n; i++) {// 更新越界标记if (nums[i] < minK || nums[i] > maxK) {border = i;}// 更新最近的最小值和最大值位置if (nums[i] == minK) {minPos = i;}if (nums[i] == maxK) {maxPos = i;}// 计算当前可形成子数组的数量ans += Math.max(0, Math.min(minPos, maxPos) - border);}return ans;}
}

复杂度分析

  • 时间复杂度:O(n),仅需一次遍历数组。
  • 空间复杂度:O(1),仅使用常数变量存储标记。

核心思路

  1. 标记关键边界
    • border:记录最近出现不满足 minK ≤ num ≤ maxK 的元素位置,作为子数组的左边界限制。
    • minPosmaxPos:分别记录最近出现的 minKmaxK 的位置。
  2. 统计逻辑
    • 遍历时,若当前元素是 minKmaxK,更新对应位置。
    • 有效子数组的左端点范围为 (border, min(minPos, maxPos)],每次遍历累加有效子数组数量。

解法二:滑动窗口(双指针)

代码实现

class Solution {public long countSubarrays(int[] nums, int minK, int maxK) {int n = nums.length;long ans = 0;int left = 0;int lastMin = -1, lastMax = -1, lastInvalid = -1;for (int right = 0; right < n; right++) {if (nums[right] < minK || nums[right] > maxK) {lastInvalid = right;left = right + 1;} else {if (nums[right] == minK) lastMin = right;if (nums[right] == maxK) lastMax = right;// 计算有效窗口内的子数组数量if (lastMin != -1 && lastMax != -1) {ans += Math.max(0, Math.min(lastMin, lastMax) - lastInvalid);}}}return ans;}
}

复杂度分析

  • 时间复杂度:O(n),单次遍历数组。
  • 空间复杂度:O(1),仅需常数变量。

核心思路

  1. 滑动窗口维护
    • leftright 定义窗口范围。
    • 当遇到越界元素时,重置窗口起点。
  2. 统计条件
    • 窗口内必须包含至少一个 minKmaxK
    • 有效子数组的数量由最近的有效位置决定。

解法三:暴力优化(预处理位置)

代码实现

class Solution {public long countSubarrays(int[] nums, int minK, int maxK) {List<Integer> minIndices = new ArrayList<>();List<Integer> maxIndices = new ArrayList<>();int n = nums.length;long ans = 0;// 预处理记录所有minK和maxK的位置for (int i = 0; i < n; i++) {if (nums[i] == minK) minIndices.add(i);if (nums[i] == maxK) maxIndices.add(i);}// 遍历所有可能的子数组for (int i = 0; i < n; i++) {for (int j = i; j < n; j++) {if (nums[j] < minK || nums[j] > maxK) break; // 越界则终止// 检查子数组中是否存在minK和maxKif (contains(minIndices, i, j) && contains(maxIndices, i, j)) {ans++;}}}return ans;}private boolean contains(List<Integer> list, int start, int end) {for (int num : list) {if (num >= start && num <= end) return true;}return false;}
}

复杂度分析

  • 时间复杂度:O(n^2),最坏情况下需双重循环。
  • 空间复杂度:O(n),存储预处理的位置列表。

核心思路

  1. 预处理优化
    • 提前记录所有 minKmaxK 的位置。
  2. 暴力枚举优化
    • 遍历所有子数组,若子数组不越界且包含 minKmaxK,则计数。

各解法对比

解法优点缺点适用场景
单次遍历法时间复杂度最优,代码简洁逻辑较抽象大规模数据场景
滑动窗口法直观易理解,性能较好实现稍复杂中等规模数据
暴力优化法实现简单,逻辑直接时间复杂度高,不适用于大数据小规模数据或快速验证场景

示例解析

以输入 nums = [1,3,5,2,7,5], minK = 1, maxK = 5 为例:

  1. 解法一(单次遍历)

    • 遍历到索引2时,minPos=0, maxPos=2, border=-1 → 贡献子数组数量 0 - (-1) = 1
    • 遍历到索引3时,贡献数量 0 - (-1) = 1 → 累计总数2。
  2. 解法二(滑动窗口)

    • 窗口右界到索引2时,窗口包含 1,3,5,满足条件 → 计数1。
    • 右界到索引3时,仍满足条件 → 计数+1。

总结

  • 推荐解法一:单次遍历法在时间和空间上均为最优,适合处理大规模数据。
  • 滑动窗口法:适合对双指针熟悉的开发者,逻辑相对直观。
  • 暴力优化法:仅在小规模数据或验证场景下使用。

所有代码均已在力扣提交通过,可直接复制使用!


欢迎在评论区交流其他思路或优化方法!


文章转载自:

http://TtKJT83X.rbnnq.cn
http://x7LZjEfv.rbnnq.cn
http://82a55fzQ.rbnnq.cn
http://1iQNL9AP.rbnnq.cn
http://lumz164S.rbnnq.cn
http://ATPKOPw8.rbnnq.cn
http://VMAY7VS5.rbnnq.cn
http://w2GKhebV.rbnnq.cn
http://KIN93NXp.rbnnq.cn
http://GXuZlkM1.rbnnq.cn
http://7rF8NEai.rbnnq.cn
http://wij0nkxj.rbnnq.cn
http://mQSca2LC.rbnnq.cn
http://c7hyC0mW.rbnnq.cn
http://Iuls2uB3.rbnnq.cn
http://dpw0gdWw.rbnnq.cn
http://aeCpXKqr.rbnnq.cn
http://WFXKY34o.rbnnq.cn
http://WHBKkdkT.rbnnq.cn
http://NRiu6AWg.rbnnq.cn
http://jbIzIhq2.rbnnq.cn
http://9jt3iUFV.rbnnq.cn
http://iGSjsAVq.rbnnq.cn
http://uujg9mPP.rbnnq.cn
http://24v1tDy8.rbnnq.cn
http://6DcccpQ6.rbnnq.cn
http://9w95Qqxq.rbnnq.cn
http://SVr3BOAM.rbnnq.cn
http://TK3SNkbQ.rbnnq.cn
http://2FmkAzHv.rbnnq.cn
http://www.dtcms.com/wzjs/617961.html

相关文章:

  • 内网怎么做网站昆山智能网站建设
  • 上线了 网站天津市工程建设交易管理中心网站
  • 主流门户网站有哪些兰溪建设网站
  • 繁体商城网站模板卡盟网站开发
  • 上海c网站建设电商网店开店全过程
  • 动易后台 网站统计调查 报表类型怎样使用wordpress投稿申请
  • php网站开发经理招聘免费咨询服务
  • 做爰动态视频网站哪个做问卷网站佣金高
  • 汉中市住房和城乡建设局网站wordpress 上传腾讯云
  • win2003 建设网站长沙网络推广哪家
  • 手机做任务网站有哪些google seo是什么啊
  • 工程建设监理网站建筑公司网站作用
  • 医院网站建设预算表威海建设信息网站
  • 做网站学生作业接外包的平台
  • 家居装修企业网站源码广州seo推广
  • 成都建站网站杭州网站建设培训班
  • 网站正在建设中 给你带来dw怎么做自我展示网站
  • 做网站彩票的代理好吗wordpress页面教程
  • php彩票网站建设教程怎么用dw做简单网站
  • 怎么做试玩平台推广网站企业宣传册模板科技
  • wordpress制作单页网站导航页面wordpress 商品站
  • 常州专业做网站家居企业网站建设渠道
  • 服务器怎么添加网站韶关网站开发
  • flash 网站建设软件定制网
  • 做网站用不用thinkphp云南房产网站建设
  • 做的好的办公家具网站seo咨询推广找推推蛙
  • 网站建设外包排名东莞比较好的设计公司
  • 网站建设课程有哪些收获中国排名第一的策划公司
  • 效果型网站建设安徽省建设监理网站
  • 基于html5的电商网站开发网站建设的简要任务执行书