classSolution { public: intshortestSubarray(vector<int>& A, int K){ vector<int> add; int a[50005]; int head, tail; intmin=-1; int temp_min=-1; head = tail = 0; memset(a, 0, sizeof(a)); int cnt=0; int sum=0; while (sum < K && cnt<A.size()) sum += A[cnt++]; if (sum >= K) temp_min = cnt; add.push_back(A[0]); for (int i=1; i<A.size(); i++) add.push_back(A[i]+add[i-1]); for (int i=1; i<add.size(); i++){ while (head<=tail && add[a[tail]]>=add[i] && a[tail]<=i) tail--; a[++tail] = i; while (add[a[head]]>=add[a[head+1]] && a[head]<a[head+1] && head<tail) head++; while (add[a[tail]] - add[a[head]] >= K && head<tail && add[a[tail]] - add[a[head+1]] >= K) head++; if (add[a[tail]] - add[a[head]] >= K){ if (min > 0){ if (a[tail]-a[head] < min) min = a[tail] - a[head]; } else min = a[tail] - a[head]; } } if (min==-1 && temp_min!=-1) return temp_min; if (min!=-1 && temp_min!=-1 && temp_min<min) return temp_min; returnmin; } };
代码2
嗯,我找了一下,这份代码比我的就简单很多了,赶紧学习一个!
没想到能直接用deque(我都不知道这东西【太菜了.jpg
classSolution { public: intshortestSubarray(vector<int>& A, int K){ int sum[50005]; int ret = 2e9; int n = A.size(); for(int i = 0; i < n; i++) { sum[i+1] = sum[i] + A[i]; } deque<int>que; que.push_back(0); for(int i = 1; i <= n; i++) { while(que.size() and sum[i] <= sum[que.back()]) que.pop_back(); while(que.size() and sum[i] - sum[que.front()] >= K) { ret = min(ret, i - que.front()); que.pop_front(); } que.push_back(i); } if(ret == 2e9) ret = -1; return ret; } };
classSolution { public: intshortestSubarray(vector<int>& A, int K){ int len = A.size(); int sum = 0, begin = 0, res = -1; for (int i = 0; i < len; i++) { if (A[i] >= K) return1; sum += A[i]; if (sum < 1) { sum = 0; begin = i + 1; continue; } for (int j = i - 1; A[j + 1] < 0; j--) { A[j] = A[j + 1] + A[j]; A[j + 1] = 0; } if (sum >= K) { while (sum - A[begin] >= K || A[begin] <= 0) sum -= A[begin++]; int length = i - begin + 1; if (res < 0 || res > length) res = length; } } return res; } };