File tree Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Expand file tree Collapse file tree 1 file changed +51
-0
lines changed Original file line number Diff line number Diff line change
1
+ //TC: O(NlogN)
2
+ //SC: O(N)
3
+ class Solution {
4
+ public int shortestSubarray(int[] nums, int k) {
5
+ int n = nums.length;
6
+ long sum=0;
7
+ int res=Integer.MAX_VALUE;
8
+ TreeMap<Long,Integer> map = new TreeMap<>();
9
+ for(int i=0;i<n;i++){
10
+ if(nums[i]>=k) return 1;
11
+ sum+=nums[i];
12
+ if(sum>=k){
13
+ res = Math.min(res,i+1);
14
+ }
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);
22
+ }
23
+ map.put(sum,i);
24
+ }
25
+ return res==Integer.MAX_VALUE?-1:res;
26
+ }
27
+ }
28
+
29
+ //TC: O(N)
30
+ //SC: O(N)
31
+ class Solution {
32
+ public int shortestSubarray(int[] nums, int k) {
33
+ int n = nums.length;
34
+ int res=Integer.MAX_VALUE;
35
+ long[] prefix = new long[n+1];
36
+ for(int i=0;i<n;i++){
37
+ prefix[i+1] = prefix[i] + nums[i];
38
+ }
39
+ Deque<Integer> dq = new ArrayDeque<>();
40
+ 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);
48
+ }
49
+ return res==Integer.MAX_VALUE?-1:res;
50
+ }
51
+ }
You can’t perform that action at this time.
0 commit comments