2
2
//SC: O(N)
3
3
class Solution {
4
4
public int shortestSubarray(int[] nums, int k) {
5
- int n = nums.length;
5
+ int length = nums.length;
6
6
long sum=0;
7
- int res=Integer.MAX_VALUE;
7
+ int res = Integer.MAX_VALUE;
8
+
8
9
TreeMap<Long,Integer> map = new TreeMap<>();
9
- for(int i=0;i<n;i++){
10
+
11
+ for(int i=0;i<length;i++){
10
12
if(nums[i]>=k) return 1;
11
13
sum+=nums[i];
12
14
if(sum>=k){
13
- res = Math.min(res,i+ 1);
15
+ res = Math.min(res,i + 1);
14
16
}
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);
22
25
}
23
26
map.put(sum,i);
27
+
24
28
}
29
+
25
30
return res==Integer.MAX_VALUE?-1:res;
26
31
}
27
32
}
@@ -31,21 +36,28 @@ class Solution {
31
36
class Solution {
32
37
public int shortestSubarray(int[] nums, int k) {
33
38
int n = nums.length;
34
- int res=Integer.MAX_VALUE;
39
+ long sum=0;
40
+ int res = Integer.MAX_VALUE;
41
+
35
42
long[] prefix = new long[n+1];
36
43
for(int i=0;i<n;i++){
37
44
prefix[i+1] = prefix[i] + nums[i];
38
45
}
46
+
39
47
Deque<Integer> dq = new ArrayDeque<>();
40
48
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);
48
59
}
60
+
49
61
return res==Integer.MAX_VALUE?-1:res;
50
62
}
51
63
}
0 commit comments