Skip to content

Commit fc0253a

Browse files
authored
Update 862. Shortest Subarray with Sum at Least K
1 parent 5c8d1d7 commit fc0253a

File tree

1 file changed

+31
-19
lines changed

1 file changed

+31
-19
lines changed

862. Shortest Subarray with Sum at Least K

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,31 @@
22
//SC: O(N)
33
class Solution {
44
public int shortestSubarray(int[] nums, int k) {
5-
int n = nums.length;
5+
int length = nums.length;
66
long sum=0;
7-
int res=Integer.MAX_VALUE;
7+
int res = Integer.MAX_VALUE;
8+
89
TreeMap<Long,Integer> map = new TreeMap<>();
9-
for(int i=0;i<n;i++){
10+
11+
for(int i=0;i<length;i++){
1012
if(nums[i]>=k) return 1;
1113
sum+=nums[i];
1214
if(sum>=k){
13-
res = Math.min(res,i+1);
15+
res = Math.min(res,i + 1);
1416
}
15-
long v = sum-k;
16-
Map.Entry<Long,Integer> key = map.floorEntry(v);
17-
while(key!=null){
18-
int in = key.getValue();
19-
res = Math.min(res,i-in);
20-
map.remove(key.getKey());
21-
key = map.floorEntry(key.getKey()-1);
17+
18+
long remainingSum = sum - k;
19+
Map.Entry<Long,Integer> entry = map.floorEntry(remainingSum);
20+
while(entry!=null){
21+
int index = entry.getValue();
22+
res = Math.min(res,i - index);
23+
map.remove(entry.getKey());
24+
entry = map.floorEntry(entry.getKey()-1);
2225
}
2326
map.put(sum,i);
27+
2428
}
29+
2530
return res==Integer.MAX_VALUE?-1:res;
2631
}
2732
}
@@ -31,21 +36,28 @@ class Solution {
3136
class Solution {
3237
public int shortestSubarray(int[] nums, int k) {
3338
int n = nums.length;
34-
int res=Integer.MAX_VALUE;
39+
long sum=0;
40+
int res = Integer.MAX_VALUE;
41+
3542
long[] prefix = new long[n+1];
3643
for(int i=0;i<n;i++){
3744
prefix[i+1] = prefix[i] + nums[i];
3845
}
46+
3947
Deque<Integer> dq = new ArrayDeque<>();
4048
for(int i=0;i<n+1;i++){
41-
while(!dq.isEmpty() && (prefix[i]-prefix[dq.peekFirst()]) >= k){
42-
res = Math.min(res,i-dq.pollFirst());
43-
}
44-
while(!dq.isEmpty() && prefix[i]<=prefix[dq.peekLast()]){
45-
dq.pollLast();
46-
}
47-
dq.add(i);
49+
//if sum at index i - sum at index at start of dq > =k we remove the start index at dq
50+
while(!dq.isEmpty() && (prefix[i] - prefix[dq.peekFirst()]) >=k){
51+
res = Math.min(res,i-dq.pollFirst());
52+
}
53+
54+
//if sum at last in dq >= current sum, we remove the last values from dq
55+
while(!dq.isEmpty() && prefix[dq.peekLast()]>=prefix[i]){
56+
dq.pollLast();
57+
}
58+
dq.add(i);
4859
}
60+
4961
return res==Integer.MAX_VALUE?-1:res;
5062
}
5163
}

0 commit comments

Comments
 (0)