当前位置:网站首页>209. 长度最小的子数组
209. 长度最小的子数组
2022-06-09 06:41:00 【秀秀的奇妙旅行】

暴力

class Solution {
public int minSubArrayLen(int target, int[] nums) {
int len=nums.length;
int min=Integer.MAX_VALUE;
for(int i=0;i<len;i++){
//start
int sum=0;
for(int j=i;j<len;j++){
// 从[i,j]相加
sum+=nums[j];
if(sum>=target){
min=Math.min(min,j-i+1);
break;
}
}
}
//还要有min=0的情况,即不存在符合这样长度的数组
return min==Integer.MAX_VALUE?0:min;
}
}
前缀和、二分查找


- 前缀和:sum[i], 前i个元素的和
num数组里的数都是正数,所以sum为递增的,可用二分法查找- sum[j]-sum[i]: 从前j个减去前i个 也就是第i+1个到第j个 索引为[i,j-1]
即找到sum[j]-sum[i]>=s的值
即找到sum[i]+target<=sum[j]的j值 其长度为j-i+1- 步骤
for循环对每一个i求出aim=sum[i]+target
用二分法遍历sum数组找到 大于aim的sum值- 4 [1,4,4]
sum[1]+4=5,二分查找sum[0,1,5,9]找到后边[5,9]中大于等于5的数,长度更新为2
sum[2]+4=9, 3-3+1=1
class Solution {
public int minSubArrayLen(int target, int[] nums) {
int min=Integer.MAX_VALUE;
int len=nums.length;
int[] sum=new int[len+1];//前0个,前len个的和
sum[0]=0;
//计算sum数组
for(int i=1;i<=len;i++){
sum[i]=sum[i-1]+nums[i-1];//前i-1个的和+ 第i个的和=前i个的和
}
//遍历每一个sum[i]即以i为开头,找大于sum[i]+target的数
//如何找——用二分法
for(int i=1;i<=len;i++){
int aim=sum[i-1]+target;//前i-1个元素
int j=binfind(sum,0,len,aim);
//即没有找到满足大于 sum[i]+target 的j的值
// if(j==-1){
// j=0;
// }
if(j>0&&j<=len){
min=Math.min(min,j-i+1);
}
}
//还要有min=0的情况,即不存在符合这样长度的数组
return min==Integer.MAX_VALUE?0:min;
}
//用二分法找到一个>=target的值
int binfind(int[]nums,int left,int right,int target){
while(left<right){
int mid=(left+right)/2;
//通过target进行二分查找
if(nums[mid]<target){
left=mid+1;
}
else if(nums[mid]>=target){
right=mid;
}
}
//最终mid要大于等于target,如果返回-1即找不到>=target的数
return nums[left]>=target?left:-1;
}
}
边栏推荐
- Chapter_ 05 adding (fusing) two images using OpenCV
- 【PPO姿态控制】基于强化学习(Proximal Policy Optimization)PPO训练的无人机姿态控制simulink仿真
- Svn account password search
- For an experienced software engineer, what would be a preferred new programming language to learn?
- UML系列文章(21)高级行为---事件和信号
- 类和对象初阶
- 不懂数学可以使用机器学习编程吗?
- QT: 手工布局并关联QSpin和QSlider
- MySQL version 8.0.28 installation and configuration method graphic tutorial
- Hummingbird e203 image recognition -- to be continued
猜你喜欢

Chapter_06 更改图像的对比度和亮度

QT: 手工布局并关联QSpin和QSlider

Yolov4 analysis | Part 2: training your own data set with yolov4 (super detailed full version)

YOLOv4解析 | 第二篇:用YOLOv4训练自己的数据集(超级详细完整版)

Excl两列数据对比用VBA实现,如:A列的数据是否在B列出现过

UML series articles (19) basic behavior - interaction diagram

DeFi 去风险:分析去中心化系统中的系统性风险

Binary tree

Clickhouse2 fragment 2 replica high availability cluster setup and chproxy proxy configuration

Quanzhi v3s learning record (12) use of rtl8723bs
随机推荐
微信小程序 思维导图
Mendeley 等文献管理工具在word中插入参考文献的报错解决
[deep learning moves] Chap.1 Boston house price forecast - univariate linear regression problem - tensorflow2.0+keras & paddlepaddle
UML series articles (21) high level behavior - events and signals
QT---创建对话框1:QDialog的子类查找关键字对话框的实现
【SDU项目实训2019级】个人主页页面展示+个人总结
A gadget written by yourself. The pilot library converts pictures to buf
Mendeley and other document management tools to insert references in word
Yolov4 analysis | Part 2: training your own data set with yolov4 (super detailed full version)
二叉树的递归套路
多线程并发-私有构造函数捕获模式
parker液压马达要注意哪些问题?
数学很差能学机器学习吗?
戒烟日志_01 (day_02)
穆格伺服阀如何存放?简单的几个方法
YOLOv4解析 | 第二篇:用YOLOv4训练自己的数据集(超级详细完整版)
Risc-v foundation and Hummingbird e203 learning summary
g1 的日志解析
DeFi 去风险:分析去中心化系统中的系统性风险
cms 和 g1的主要区别