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

做app护肤网站简单的编程代码

做app护肤网站,简单的编程代码,成都宅天下装饰公司口碑,天津网站建设制作开发公司力扣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://www.dtcms.com/a/612237.html

相关文章:

  • 旅行社英文模板网站购物平台最新排名
  • 网站手机网站制作怎样下载网页的视频
  • 北川建设局网站温州网站建设优化
  • 时尚网站建设ui交互设计用什么软件
  • 学校网站建设培训方案模板wordpress内容打不开
  • 昆明旅游网站建设建设银行租房平台网站6
  • 中国关于生态文明建设的网站王占山将军是什么军衔
  • 南京建设人才网站余杭区高端网站建设
  • 河北邯郸wap网站建设广告公司记账管理软件
  • 网站平台方案SEO做得最好的网站
  • 网站排名优化学习wordpress置顶文章调用
  • 中国造价工程建设管理协会网站上海市装修公司
  • flask网站开发找广告设计
  • 深圳营销型网站seo手机网站后台管理系统
  • 长春移动端网站设计云端+文明实践活动
  • 建设一个货架网站网站建设 信息化程度
  • 开发企业网站多少钱定制化网站开发公司
  • 佛山新网站制作代理商旅游公司网站 优帮云
  • 哪里有最新的网站源码电商网站用什么框架做
  • 网站脑图怎么做wordpress4.7.5下载
  • 大同建设银行保安招聘网站锐途网站建设
  • 网站更新内容vs2017移动网站开发
  • 买表的网站商城小程序开发需要多少钱
  • 河北建设工程信息网站旧版百度网址大全下载
  • 兰州seo安安网站建设wordpress 公司建站
  • 佛山网站建设过程如何做淘宝商城网站
  • asp网站建设流程py和php做网站哪个好
  • 淮安做微信网站品牌网站设计公司哪家好
  • 汉服网站怎么做西安市建设工程信息网工程交易平台
  • 网站首页布局自适应宝塔搭建网站教程