力扣原题《长度最小的子数组》,有序版(理想版最大值查找)纯手搓,已验证,方差版(考虑元素离散,大值周围全是小值的情况)在下一篇
理想版大值周围是大值给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其总和大于等于 target 的长度最小的 子数组 [numsl, numsl1, …, numsr-1, numsr] 并返回其长度。如果不存在符合条件的子数组返回 0 。示例 1输入target 7, nums [2,3,1,2,4,3]输出2解释子数组 [4,3] 是该条件下的长度最小的子数组。示例 2输入target 4, nums [1,4,4]输出1示例 3输入target 11, nums [1,1,1,1,1,1,1,1]输出0提示1 target 1091 nums.length 1051 nums[i] 104我的答案classMinSubArray{public:MinSubArray(){}intminSubArrayLen(inttarget,vectorintnums){//先排序//std::sort(nums.begin(),nums.end());vectorint::iterator maxPosmax_element(nums.begin(),nums.end());//双指针vectorint::iterator leftnums.end();vectorint::iterator rightnums.end();if(maxPos!nums.begin()maxPos-1nums.begin()){leftmaxPos-1;}if(maxPos1nums.end()){rightmaxPos1;}if(*(maxPos)target){return1;}else{intsum*(maxPos);boolisTopLeftfalse,isTopRightfalse;//如果到头了就不要重复加了while(true){inttag0;if(left!nums.end()right!nums.end())//左右都存在{if(!isTopLeft*left*right){sum*left;if(left!nums.begin()){left--;tag1;}else{isTopLefttrue;}}elseif(!isTopRight){sum*right;if(rightnums.end()){right;tag2;}else{isTopRighttrue;}}}elseif(!isTopLeftleft!nums.end())//只有左边存在{sum*left;if(left!nums.begin()){left--;tag3;}else{isTopLefttrue;}}elseif(!isTopRightright!nums.end())//只有右边存在{sum*right;if(rightnums.end()){right;tag4;}else{isTopRighttrue;}}if(sumtarget){switch(tag)//避免重复加一个{case1:case3:if(left!nums.begin()||!isTopLeft){left;}break;case2:case4:if(rightnums.end()||!isTopRight){right--;}break;default:break;}break;}if((leftnums.end()rightnums.end())||(isTopLeftisTopRight)||(leftnums.end()isTopRight)||(rightnums.end()isTopLeft)){break;}}if(sumtarget){returnright-left;}return0;}return0;}};intmain(){vectorvectorintnums;vectorinttarget;nums.push_back({2,3,1,2,4,3});nums.push_back({1,4,4});nums.push_back({1,1,1,1,1,1,1,1});nums.push_back({1,2,3,4,5});nums.push_back({12,28,83,4,25,26,25,2,25,25,25,12});target.push_back(7);target.push_back(4);target.push_back(11);target.push_back(15);target.push_back(213);MinSubArray minSubArray;for(vectorvectorint::iterator iternums.begin();iter!nums.end();iter){std::cout最小子数组长度为:minSubArray.minSubArrayLen(target[iter-nums.begin()],*(iter))std::endl;}}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2453143.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!