- 考查点:双指针
- 达到目标值就开始滑动左边的指针
class Solution {
public:
int minSubArrayLen(int target, vector& nums) {
int n = nums.size();
int len = n + 1;
for(int i = 0, j = 0, s = 0; i < n; i++){
s += nums[i];
while(s >= target){
len = min(len, i - j + 1);
s -= nums[j++];
}
}
if(len == n+1) return 0;
return len;
}
};
类似题
KY106 最小面积子矩阵
- 这道题其实有bug,因为数据给的比较水,矩阵中的值没有负数,所以才能利用上面这题的这个性质,如果有负数,就需要换个思路考虑。之前做过类似的,需要用树状数组。
- 把二维数组压缩到一维进行处理。
#includeusing namespace std; const int N = 110; int a[N][N], sum[N][N], f[N]; int m, n, k; int main(){ cin>>m>>n>>k; for(int i = 1; i <= m; i++){ for(int j = 1; j <= n; j++){ cin>>a[i][j]; sum[i][j] = sum[i-1][j] + a[i][j]; } } int ans = INT_MAX; for(int i = 1; i <= m; i++){ // 枚举的首行 for(int j = i; j <= m; j++){ // 枚举的末行 memset(f, 0, sizeof f); for(int u = 1; u <= n; u++) f[u] = sum[j][u] - sum[i-1][u]; // 一维子数组大于等于k的最短长度 int len = n+1; // 双指针 for(int i = 1, j = 1, s = 0; i <= n; i++){ s += f[i]; while(s >= k){ // 只有正数才满足 len = min(len, i - j + 1); s -= f[j++]; } } if(len == n+1) continue; ans = min(ans, len*(j - i + 1)); } } if(ans == INT_MAX) cout<<"-1"<



