今天还是搞数组,争取晚上前开启下一篇,对于相向指针法和快慢指针法已经熟练一些了,但是,可惜的是,这并不能满足题目的要求,总是会出现超时的问题,因此,无奈看了答案,答案采用的是滑动窗口,相对来说,时间复杂度为O(nlogn),而且代码也变得更为简洁,所以当我们遇见这种连在一起的问题是,我们可以考虑滑动窗口。
//209.长度最小的子数组
class Solution {
public int minSubArrayLen(int target, int[] nums) {
// 滑动窗口法
int left = 0;
int sum = 0;
int result = nums.length+1;
for(int right = 0 ; right < nums.length ; right++){
sum += nums[right];
while(left <= right && sum >= target){
result = Integer.min(result, right - left + 1);
sum -= nums[left++];
}
}
return result == nums.length+1 ? 0 : result;
}
}
在这个方法中,也了解到了一些额外的知识,例如Integer的一些常见用法:
-
将String类型的数字转换为int类型:
Integer.parseInt(String s)
。 -
将int类型转换为String类型:
Integer.toString(int i)
。 -
获取int类型的最大值:
Integer.MAX_VALUE
。 -
获取int类型的最小值:
Integer.MIN_VALUE
。 -
将int类型转换为byte类型:
Integer.byteValue()
。 -
将int类型转换为short类型:
Integer.shortValue()
。
此外,还有逻辑运算符? :
,也称为三元运算符(ternary operator),Integer.min();
总之,实践出真知,熟能生巧,继续加油!