一、解决问题:连续子数组问题
二、适用原则:
1.滑窗:适合连续和/积问题,不适合有负值的问题,因为不知窗口往哪滑
2.前缀和/积:不适合数值过大的问题,因为前缀和/积数字可能超出数字表示范围
3.DP:适合子数组最大/最小问题,不适合和为k问题,因为要记录上一步的和/积,来更新当前步的和/积,但当前和/积难以确定来自前一步还是自身
三、实例:
1.【Leetcode-152】乘积最大子数组-适合DP,因为有负数且乘积可能超出范围
给你一个包含负数的整数数组 nums
,请你找出数组中乘积最大的连续子数组(该子数组中至少包含一个数字),并返回该子数组所对应的乘积。
2.【Leetcode-560】和为K的子数组-适合前缀和,因为有负数且要求和为k
给定一个整数数组和一个整数 k,你需要找到该数组中和为 k 的连续的子数组的个数。
数组的长度为 [1, 20,000]。
数组中元素的范围是 [-1000, 1000] ,且整数 k 的范围是 [-1e7, 1e7]。
3.【Leetcode-713】乘积小于K的子数组-适合滑窗,因为乘积可能超出范围且要求和为k
给定一个正整数数组 nums
。
找出该数组内乘积小于 k
的连续的子数组的个数。
0 < nums.length <= 50000,
0 < nums[i] < 1000,
0 <= k < 10^6
原文:https://www.cnblogs.com/EstherLjy/p/14673072.html