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

工程建设国家标准网站鄂州网警

工程建设国家标准网站,鄂州网警,2023年防疫新政策,windows部署wordpress子数组系列问题 子数组问题详解 1. 基本概念2. 常见子数组问题及解法(1) 最大/最小子数组(2) 固定长度的子数组问题(3) 满足条件的子数组个数(4) 最长无重复字符子数组 3. 总结用java实现1. 最大子数组和(Kadane 算法)2. 滑动窗口最大值(单调…

子数组系列问题

      • 子数组问题详解
    • 1. 基本概念
    • 2. 常见子数组问题及解法
      • (1) 最大/最小子数组
      • (2) 固定长度的子数组问题
      • (3) 满足条件的子数组个数
      • (4) 最长无重复字符子数组
    • 3. 总结
    • 用java实现
    • 1. 最大子数组和(Kadane 算法)
    • 2. 滑动窗口最大值(单调队列)
    • 3. 子数组和等于 K(前缀和 + 哈希表)
    • 4. 最长无重复字符子串(滑动窗口)
    • 5. 乘积小于 K 的子数组(滑动窗口)
    • 总结

java可以直接跳转到下面,内容一样!
本文练习题目可以对应 LeetCode 上的#53, #76, #209, #560, #713, #904题目。

子数组问题详解

子数组(Subarray)是指数组中一个或多个连续元素组成的序列。子数组问题是算法中常见的一类问题,通常涉及求和、乘积、最大/最小值、特定条件满足等操作。


1. 基本概念

  • 子数组:必须是连续的,例如 [1, 2, 3] 的子数组包括 [1], [2], [1, 2], [2, 3], [1, 2, 3],但 [1, 3] 不是子数组(因为它不连续)。
  • 子序列:可以不连续,如 [1, 3] 是子序列但不是子数组。
  • 子集:任意元素的组合,不要求顺序或连续。

2. 常见子数组问题及解法

(1) 最大/最小子数组

问题:给定一个整数数组(可能有负数),求子数组的最大和。
示例

输入: [-2, 1, -3, 4, -1, 2, 1, -5, 4]
输出: 6(对应子数组 [4, -1, 2, 1])

解法Kadane 算法(动态规划)

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
    代码
def max_subarray(nums):max_sum = current_sum = nums[0]for num in nums[1:]:current_sum = max(num, current_sum + num)  # 是否重新开始子数组max_sum = max(max_sum, current_sum)return max_sum

变种

  • 最小子数组和:类似,但取 min 代替 max
  • 环形子数组最大和(首尾相连):可以拆解为 max(最大子数组和, 总和 - 最小子数组和)

(2) 固定长度的子数组问题

问题:求所有长度为 k 的子数组的最大值/平均值等。
示例

输入: [1, 3, -1, -3, 5, 3, 6, 7], k = 3
输出: [3, 3, 5, 5, 6, 7](每个窗口的最大值)

解法滑动窗口(Sliding Window)

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)(或 O(n) 如果需要存储结果)
    代码(求最大值,使用单调队列优化):
from collections import dequedef max_sliding_window(nums, k):q = deque()res = []for i, num in enumerate(nums):while q and nums[q[-1]] <= num:  # 维护单调递减队列q.pop()q.append(i)if q[0] == i - k:  # 移除窗口外的元素q.popleft()if i >= k - 1:res.append(nums[q[0]])return res

(3) 满足条件的子数组个数

问题:统计满足某条件的子数组数量,如:

  • 和等于 k 的子数组个数。
  • 和不超过 k 的子数组个数。
  • 乘积小于 k 的子数组个数。

示例(和为 k 的子数组个数):

输入: nums = [1, 1, 1], k = 2
输出: 2([1,1] 和 [1,1])

解法:前缀和 + 哈希表

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)
    代码
from collections import defaultdictdef subarray_sum(nums, k):prefix_sum = 0count = 0sum_map = defaultdict(int)sum_map[0] = 1  # 初始情况,前缀和为 0 出现 1 次for num in nums:prefix_sum += numif prefix_sum - k in sum_map:  # 查找是否有 prefix_sum - k 存在count += sum_map[prefix_sum - k]sum_map[prefix_sum] += 1return count

变种

  • 乘积小于 k 的子数组个数:滑动窗口 + 累积乘积。
  • 最长子数组满足某条件:滑动窗口或双指针。

(4) 最长无重复字符子数组

问题:给定一个字符串/数组,求最长子数组,其中元素不重复。
示例

输入: "abcabcbb"
输出: 3("abc")

解法滑动窗口 + 哈希表

  • 时间复杂度:O(n)
  • 空间复杂度:O(text{字符集大小})
    代码
def length_of_longest_substring(s):char_map = {}left = 0max_len = 0for right, char in enumerate(s):if char in char_map and char_map[char] >= left:  # 如果重复,移动左指针left = char_map[char] + 1char_map[char] = rightmax_len = max(max_len, right - left + 1)return max_len

3. 总结

问题类型典型解法时间复杂度
最大子数组和Kadane 算法O(n)
固定长度子数组极值滑动窗口 + 单调队列O(n)
子数组和等于 k前缀和 + 哈希表O(n)
最长无重复子数组滑动窗口 + 哈希表O(n)

关键技巧

  • 滑动窗口:适用于连续子数组的最值、计数问题。
  • 前缀和:用于快速计算子数组和。
  • 哈希表:存储中间结果,优化查找。

用java实现

在 Java 中,子数组问题的解决方法与 Python 类似,但语法和部分数据结构(如 DequeHashMap)的使用方式有所不同。


1. 最大子数组和(Kadane 算法)

问题:求数组中连续子数组的最大和。
示例

输入: [-2, 1, -3, 4, -1, 2, 1, -5, 4]
输出: 6(子数组 [4, -1, 2, 1]

Java 代码

public int maxSubArray(int[] nums) {int maxSum = nums[0], currentSum = nums[0];for (int i = 1; i < nums.length; i++) {currentSum = Math.max(nums[i], currentSum + nums[i]);maxSum = Math.max(maxSum, currentSum);}return maxSum;
}

2. 滑动窗口最大值(单调队列)

问题:给定数组和窗口大小 k,返回每个窗口的最大值。
示例

输入: nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3
输出: [3, 3, 5, 5, 6, 7]

Java 代码

import java.util.Deque;
import java.util.LinkedList;public int[] maxSlidingWindow(int[] nums, int k) {if (nums == null || nums.length == 0) return new int[0];Deque<Integer> deque = new LinkedList<>();int[] res = new int[nums.length - k + 1];for (int i = 0; i < nums.length; i++) {while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]) {deque.pollLast(); // 维护单调递减队列}deque.offerLast(i);if (deque.peekFirst() == i - k) {deque.pollFirst(); // 移除窗口外的元素}if (i >= k - 1) {res[i - k + 1] = nums[deque.peekFirst()];}}return res;
}

3. 子数组和等于 K(前缀和 + 哈希表)

问题:统计和为 k 的子数组个数。
示例

输入: nums = [1, 1, 1], k = 2
输出: 2[1,1][1,1]

Java 代码

import java.util.HashMap;
import java.util.Map;public int subarraySum(int[] nums, int k) {Map<Integer, Integer> prefixSumMap = new HashMap<>();prefixSumMap.put(0, 1); // 初始前缀和为 0 出现 1 次int prefixSum = 0, count = 0;for (int num : nums) {prefixSum += num;if (prefixSumMap.containsKey(prefixSum - k)) {count += prefixSumMap.get(prefixSum - k);}prefixSumMap.put(prefixSum, prefixSumMap.getOrDefault(prefixSum, 0) + 1);}return count;
}

4. 最长无重复字符子串(滑动窗口)

问题:求字符串中最长无重复字符的子串长度。
示例

输入: "abcabcbb"
输出: 3"abc"

Java 代码

import java.util.HashMap;
import java.util.Map;public int lengthOfLongestSubstring(String s) {Map<Character, Integer> charIndexMap = new HashMap<>();int left = 0, maxLen = 0;for (int right = 0; right < s.length(); right++) {char c = s.charAt(right);if (charIndexMap.containsKey(c) && charIndexMap.get(c) >= left) {left = charIndexMap.get(c) + 1; // 移动左指针}charIndexMap.put(c, right);maxLen = Math.max(maxLen, right - left + 1);}return maxLen;
}

5. 乘积小于 K 的子数组(滑动窗口)

问题:统计乘积小于 k 的连续子数组个数。
示例

输入: nums = [10, 5, 2, 6], k = 100
输出: 8[10], [5], [2], [6], [10,5], [5,2], [2,6], [5,2,6]

Java 代码

public int numSubarrayProductLessThanK(int[] nums, int k) {if (k <= 1) return 0;int left = 0, product = 1, count = 0;for (int right = 0; right < nums.length; right++) {product *= nums[right];while (product >= k) {product /= nums[left++]; // 收缩窗口}count += right - left + 1; // 新增的子数组数量}return count;
}

总结

问题类型Java 解法时间复杂度
最大子数组和Kadane 算法O(n)
滑动窗口最大值单调队列(DequeO(n)
子数组和等于 K前缀和 + HashMapO(n)
最长无重复子串滑动窗口 + HashMapO(n)
乘积小于 K 的子数组滑动窗口 + 累积乘积O(n)

关键点

  • 滑动窗口:适用于连续子数组问题(如最大值、无重复字符)。
  • 前缀和:用于快速计算子数组和。
  • 哈希表:存储中间结果(如前缀和、字符索引)。

看完理解可以尝试刷题巩固!


文章转载自:

http://1FPPbMc1.kyzxh.cn
http://YMZ3j01h.kyzxh.cn
http://YcLJLrYd.kyzxh.cn
http://Z1YvGWhB.kyzxh.cn
http://F6FjK6hr.kyzxh.cn
http://4W2Z0ZkC.kyzxh.cn
http://JnidDiRc.kyzxh.cn
http://kzdBSKtq.kyzxh.cn
http://0cr8ooEW.kyzxh.cn
http://v533fEU8.kyzxh.cn
http://sJUyAaV5.kyzxh.cn
http://RaPFKETv.kyzxh.cn
http://7ybRF6NU.kyzxh.cn
http://oLueCWGo.kyzxh.cn
http://oJ5QI61U.kyzxh.cn
http://ztHVS7vk.kyzxh.cn
http://jat7hmMr.kyzxh.cn
http://4CcmcCZr.kyzxh.cn
http://5fmfLqHM.kyzxh.cn
http://FfmMdWhh.kyzxh.cn
http://UBMWQMuN.kyzxh.cn
http://ltQAs3xj.kyzxh.cn
http://PBiobWh2.kyzxh.cn
http://BylUlLRa.kyzxh.cn
http://GZw87WTP.kyzxh.cn
http://h9ISTyEE.kyzxh.cn
http://SRG1uiho.kyzxh.cn
http://V8oscxpS.kyzxh.cn
http://MEAVdaq9.kyzxh.cn
http://Txc7rcrf.kyzxh.cn
http://www.dtcms.com/wzjs/735424.html

相关文章:

  • 仁怀企业网站建设wordpress contact form
  • o2o网站制作公司2021年最新的网站
  • 电子商务网站建设与管理心得凡科互动自助解封没用
  • 建设mylove卡网站wordpress配置邮件
  • 专业的做网站软件wordpress佣金分成
  • 台山网站设计基本的网站建设步骤
  • 网站优化推广公司推荐免费网络营销软件
  • wordpress缓存方案WordPress网站结构优化
  • 烟台公司网站定制wordpress html 插件
  • 哈尔滨手机网站建设郑州做公司网站的公司
  • 邯郸做网站推广找谁微信商城下载
  • html5旅游网站中国四大门户网站分别是
  • 亿恩 网站备案互联网推广有哪些方式
  • 前后端分离企业网站源码潍坊市建设局网站
  • 手机表格制作app重庆搜索引擎优化
  • 杭州 网站定制小程序模板教程
  • 北京长空建设有限公司网站网络技术网站
  • 可信网站验证wordpress google
  • 做问卷用哪个网站企业网站备案域名信息
  • 湖南做网站最厉害的公司wordpress 做门户
  • 网站开发语音占比工程建设教育网站
  • 国家建设执业注册中心网站设计制作活动
  • 罗湖区做网站的公司全网搜索指数
  • wordpress优化网站西宁网站设计企业
  • 虚拟主机网站建设步骤上海环球金融中心门票
  • 网站建设公司咋样网站建设及运维合同
  • 品牌推广策略宿迁seo
  • 做网站设计是什么专业wordpress添加new
  • 谷歌建站多少钱设置什么引擎营销是用户主导的网络营销方式
  • 外贸营销型网站大连网站哪家做的好?