(LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
题目:209. 长度最小的子数组
思路:双指针,时间复杂度0(n)。
sum记录左右指针内的数组元素之和,当sum-nums[left]>=target时,移动左指针。
C++版本:
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n=nums.size();int mn=n+1;int sum=0;for(int left=0,right=0;right<n;right++){sum+=nums[right];while(sum-nums[left]>=target){sum-=nums[left];left++;}if(sum>=target){mn=min(mn,right-left+1);}}return mn==n+1 ? 0:mn;}
};
JAVA版本:
class Solution {public int minSubArrayLen(int target, int[] nums) {int n=nums.length;int mn=n+1;int sum=0;for(int left=0,right=0;right<n;right++){sum+=nums[right];while(sum-nums[left]>=target){sum-=nums[left];left++;}if(sum>=target){mn=Math.min(mn,right-left+1);}}return mn==n+1 ? 0:mn;}
}
GO版本:
func minSubArrayLen(target int, nums []int) int {n:=len(nums)sum,mn:=0,n+1for left,right:=0,0;right<n;right++ {sum+=nums[right]for sum-nums[left]>=target {sum-=nums[left]left++}if sum>=target {mn=min(mn,right-left+1)}}if mn==n+1 {return 0}return mn
}