一、题目
1、审题
2、分析
求正整数数组 nums 中连续的元素和大于等于 s 的最少元素的个数。
二、解答
1、思路:
方法一、
①、采用变量 min 记录最少元素数,初始值为 Integer.MAX_VALUE;
②、遍历 nums 中元素,若当前元素下标为 i 时;令变量 sum = nums[i];
③、再创建一个内循环,从下标 i - 1 往前遍历数组 nums,且 sum 值加上遍历经过的元素,
当 sum >= s 时,跳出内循环,且判断 min 是否需要更新。当 i == 0 时,sum 依然小于 s,则跳出内循环。
④、第一层循环遍历完后,若 min 依然是 Integer.MAX_VALUE 则返回 0, 否则返回 min。
1 public int minSubArrayLen(int s, int[] nums) { 2 3 int minLen = Integer.MAX_VALUE; 4 int sum = 0; 5 for (int i = 0; i < nums.length; i++) { 6 sum = nums[i]; 7 if(sum >= s) 8 return 1; 9 for (int j = i - 1; j >= 0; j--) { 10 if((sum += nums[j]) >= s) { 11 minLen = Math.min(minLen, i - j + 1); 12 break; 13 } 14 } 15 } 16 17 return minLen == Integer.MAX_VALUE ? 0 : minLen; 18 }
方法一、 采用两个指针。
j 不断向后移动,i 也向后移动,sum 记录数组 nums 从下标 i 到下标 j 之间的元素和,最终返回 sum >= s 时的最小 j - i;
public int minSubArrayLen2(int s, int[] nums) { if(nums == null || nums.length == 0) return 0; int i = 0, j = 0, sum = 0, min = Integer.MAX_VALUE; while(j < nums.length) { sum += nums[j++]; while(sum >= s) { min = Math.min(min, j - i); sum -= nums[i++]; } } return min == Integer.MAX_VALUE ? 0 : min; }