题目:nums=[2,3,5,1,2,4,5,3,2],条件:找子数组:满足其元素的和>=12、元素连续、长度最小。
答案:[4,5,3],长度为3。
解法:双指针(滑动窗口):设两个指针i,j,开始指向第一个元素2,
[2(i,j),3,5,1,2,4,5,3,2] , 第1个子集合[2],和为2,比12小,i不动,j++。
[2(i),3(j),5,1,2,4,5,3,2],第2个子集合[2,3],和为5,比12小,i不动,j++。
[2(i),3,5(j),1,2,4,5,3,2],第3个子集合[2,3,5],和为10,比12小,i不动,j++。
[2(i),3,5,1(j),2,4,5,3,2],第4个子集合[2,3,5,1],和为11,比12小,i不动,j++。
[2(i),3,5,1,2(j),4,5,3,2],第5个子集合[2,3,5,1,2],和为13,比12大,j不动,i++,记录出现符合条件的子集合的长度number为5。
[2,3(i),5,1,2(j),4,5,3,2],第6个子集合[3,5,1,2],和为13-2=11,比12小,i不动,j++。
[2,3(i),5,1,2,4(j),5,3,2],第7个子集合[3,5,1,2,4],和为15,比12大,j不动,i++。
[2,3,5(i),1,2,4(j),5,3,2],第8个子集合[5,1,2,4],和为15-3=12,满足12,j不动,i++,number更新为4。
[2,3,5,1(i),2,4(j),5,3,2],第9个子集合[1,2,4],和为12-5=7,比12小,i不动,j++。
[2,3,5,1(i),2,4,5(j),3,2],第10个子集合[1,2,4,5],和为12,满足12,j不动,i++.
[2,3,5,1,2(i),4,5(j),3,2],第11个子集合[2,4,5],和为11,比12小,i不动,j++。
[2,3,5,1,2(i),4,5,3(j),2],第12个子集合[2,4,5,3],和为14,比12大,j不动,i++。
[2,3,5,1,2,4(i),5,3(j),2],第13个子集合[4,5,3],和为14-2=12,满足12,j不动,i++,number更新为3。
[2,3,5,1,2,4,5(i),3(j),2],第14个子集合[5,3],和为12-4=8,比12小,i不动,j++。
[2,3,5,1,2,4,5(i),3,2(j)],第15个子集合[5,3,2],和为10,比12小,i不动,j++后指向null.结束寻找.
java代码
public static int minSubArrayLen(int target, int[] nums) {
if(nums==null || nums.length==0){
return 0;
}
int i=0;
int j=0;//两个指针
int number = nums.length+1;//用于更新子集合最小长度,初始为数组长度+1
int count = 0; //计元素之和
while (j<=nums.length-1) {
count+=nums[j];
j++;
while (count>=target){
number = Math.min(number,j-i);//两者取最小
count-=nums[i];
i++;
}
}
return number == nums.length+1 ? 0 : number;
}
测试:
@Test
public void test3(){
int[] a = {2,3,5,1,2,4,5,3,2};
System.out.println(minSubArrayLen(12, a));
}
结果
3