本题解 left 指针和 right 指针最多只遍历数组 1 次,所以时间复杂度为 O(n)。 只额外开了 2 个指针,空间复杂度为 O(1)。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
int min(int a, int b) { return (a < b) ? a : b; } int minSubArrayLen(int target, int* nums, int numsSize) { int left=0; int sum=0; int result=INT_MAX; for(int right=0;right<numsSize;right++){ sum+=nums[right]; while(sum>=target){ result=min(result,right-left+1); sum-=nums[left++]; } } return result==INT_MAX?0:result; }
java代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
public int min(int a,int b){ return a>b?b:a; }
public int minSubArrayLen(int target, int[] nums) { int left=0,sum=0; int result=Integer.MAX_VALUE; for (int right = 0; right < nums.length; right++) { sum+=nums[right]; while(sum>=target){ result=min(result,right-left+1); sum-=nums[left++]; } } return result==Integer.MAX_VALUE?0:result; }