蓝桥杯练习3
力扣207:最小数组和。给你一个数组,和一个目标值target 。求出最小连续的数组之和大于目标值的数组长度。
暴力解法:就是两层遍历,第一遍将数组的数据依次访问,第二次遍历则是在第一次遍历的数据上,继续遍历数组,累加和,再判断。
难点:数组长度的返回,利用三元运算符或者java API。注意,每次遍历时必须把总和归为0。
//也可以调用min方法
result = Math.min(result ,j - i + 1);
练习目的:掌握数组的访问和返回。
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 暴力解法:两层遍历数据
// 1.定义变量,总和,数组长度,放回值
int sum = 0;
int count = 0;
int result = Integer.MAX_VALUE;
for(int i = 0; i<nums.length;i++) {
sum = 0;// 每次要置0
// 2.第二层遍历,将数据加起来直至大于target
for(int j = i;j<nums.length;j++) {
sum += nums[j];
// 3. 判断条件是否成立
if(sum >= target) {
count = j - i + 1;
result = result < count ? result : count;
break;
}
}
}
return result = result < Integer.MAX_VALUE ? result : 0 ;
}
}
优化解法: 定值移动
思考方向:将目标值作为一个整体拆解到数组中,第二次遍历数组是否可以简化,对于两层遍历,可以考虑双指针法。
起始位置,终止位置
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 优化解法,窗口滑动,将target 作为一个数组整体逐一移动
// 1. 定义变量,其中j起到关键作用
int j = 0;
int sum = 0;
int result = Integer.MAX_VALUE;;
int min = 0;
// 2. 第一次遍历就计算出target的值
for(int i = 0; i < nums.length; i++) {
sum += nums[i];
// 3.满足后,就将窗口后移动。j++
while(sum >= target) {
min = i - j + 1;
result = result < min ? result : min;
sum -= nums[j++];
}
}
// 4. 返回值
return result = result < Integer.MAX_VALUE ? result : 0;
}
}