学习目标:
一周掌握 算法 入门知识(数组阶段的)
掌握双指针的应用
滑动窗口模型
数组是非常基础的数据结构,在面试中,考察数组的题目一般在思维上都不难,主要是考察对代码的掌控能力
也就是说,想法很简单,但实现起来 可能就不是那么回事了。
首先要知道数组在内存中的存储方式,这样才能真正理解数组相关的面试题
下面为大家带来一道非常经典的算法题,简单易学,非常适合新手入门
学习内容:
掌握双指针的用法
明白它的时间效率(遍历一遍 O(n))
了解滑动窗口模型
题目:209.长度最小的子数组
难度中等1191
给定一个含有 n
个正整数的数组和一个正整数 target
。
找出该数组中满足其和 ≥ target
的长度最小的 连续子数组 [numsl, numsl+1, ..., numsr-1, numsr]
,并返回其长度。如果不存在符合条件的子数组,返回 0
。
示例 1:
输入:target = 7, nums = [2,3,1,2,4,3]
输出:2
解释:子数组 [4,3]
是该条件下的长度最小的子数组。
示例 2:
输入:target = 4, nums = [1,4,4] 输出:1
示例 3:
输入:target = 11, nums = [1,1,1,1,1,1,1,1] 输出:0
public int minSubArrayLen(int[] nums,int target){
int left=0;//定义左指针
int windowLength=0;
int result =nums.length+1;//定义窗口最大长度,移动左右指针时候使其不断减小求最小值
int sum = 0;
for (int right = 0; right <nums.length ; right++) {
sum+=nums[right]; //***********************j遍历时候顺带加nums【right】
//循环条件为sum和大于等于target
while(sum>=target){
//1.更新长度
windowLength = right-left+1;
result = result>=windowLength? windowLength:result;//新值比原来小就返回新值,否则不变。
//****************************2. i遍历时候顺带减nums【left】
sum-=nums[left];
left++;
}
}return result!= nums.length+1? result:0;//result结果缩小了,说明变动了,直接打印
// (这里考虑到极端情况)arr【1,2,3】 target=1+2+3 result=3 ,所以要用result=length+1来判断。
}
链接:力扣https://leetcode.cn/problems/minimum-size-subarray-sum/