NC202. 长度最小的连续子数组
描述
示例1
输入:
[1,2,4,4,1,1,1],9
输出:
3
示例2
输入:
[1,4,4,4,1,1,1],3
输出:
1
C++ 解法, 执行用时: 7ms, 内存消耗: 1324KB, 提交时间: 2022-02-09
class Solution { public: /* 方法一:双指针 思路 双指针控制窗口端点,当窗口内元素的和小于目标时就扩张右边界,否则收缩左边界并更新长度。 */ int minSubarray(vector<int>& nums, int target) { int left = 0, right = 0, sum = 0, minLen = nums.size(); while(right < nums.size()){ sum += nums[right++]; while(left < right && sum >= target){ minLen = min(minLen, right - left); sum -= nums[left++]; } } return minLen; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 1304KB, 提交时间: 2022-01-07
#include <cassert> class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int minSubarray(vector<int>& nums, int target) { // write code here assert( !nums.empty() ); assert(target > 0); for(int val : nums){ assert(val > 0); assert(val <= 100000); } int len = nums.size(); assert(len <= 100000); int i = 0, j = 0, min_len = 0x7FFFFFFF; long long sum = 0; do{ while(i < len) { sum += nums[ i++ ]; if(sum >= target){ if(i-j < min_len) min_len = i-j; break; } } while(j < i) { sum -= nums[ j++ ]; if(sum > target) ; else if(sum < target) break; else if(i-j < min_len) min_len = i-j; } }while(i < len); return min_len!=0x7FFFFFFF ? min_len : 0; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 1316KB, 提交时间: 2021-11-18
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int minSubarray(vector<int>& nums, int target) { // write code here int ret = INT_MAX; int n = nums.size(); int total = 0; int left = 0; int j = 0; for(int i = 0; i< n; i++) { total += nums[i]; if (total >= target) { for(j = left; j <i; j++) { if(total-nums[j] >= target) { ret =min(ret, i-j); total -= nums[j]; left = j+1; } else { left = j; break; } } } } return ret==INT_MAX?0:ret; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 1320KB, 提交时间: 2022-02-05
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int minSubarray(vector<int>& nums, int target) { // write code here int n=nums.size(),i=0,j=0; int minlen=n+1,sum=0; for(i=0;i<n;i++) { sum=sum+nums[i]; while(sum>=target) { minlen=min(minlen,i-j+1); sum=sum-nums[j]; j++; } } return minlen; } };
C++ 解法, 执行用时: 8ms, 内存消耗: 1324KB, 提交时间: 2022-01-28
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param nums int整型vector * @param target int整型 * @return int整型 */ int minSubarray(vector<int>& nums, int target) { // write code here for(int i=1;i<nums.size();i++) nums[i]+=nums[i-1]; if(nums[nums.size()-1]<target) return 0; nums.insert(nums.begin(), 0); int minLen=INT_MAX; int l=0,r=0; while(r<nums.size()){ if(nums[r]-nums[l]<target) r++; else{ while(nums[r]-nums[l]>=target){ l++; } minLen=min(minLen,r-l+1); } } return minLen; } };