Skip to content

Commit 27645bf

Browse files
committed
lc weekly
1 parent ebbd067 commit 27645bf

File tree

2 files changed

+114
-0
lines changed

2 files changed

+114
-0
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# https://leetcode.com/problems/choose-k-elements-with-maximum-sum
2+
# maintain sortedlist and keep track of sum of top k
3+
4+
from typing import List
5+
from sortedcontainers import SortedList
6+
7+
8+
def findMaxSum(nums1: List[int], nums2: List[int], k: int) -> List[int]:
9+
n = len(nums1)
10+
arr = [(nums1[i], nums2[i], i) for i in range(n)]
11+
arr.sort()
12+
13+
res = [0] * n
14+
cur = SortedList([])
15+
cur_s = 0
16+
17+
for i in range(n):
18+
if i != 0 and arr[i][0] == arr[i - 1][0]:
19+
res[arr[i][2]] = res[arr[i - 1][2]]
20+
else:
21+
res[arr[i][2]] = cur_s
22+
23+
# update cur
24+
val = arr[i][1]
25+
if len(cur) < k:
26+
cur_s += val
27+
else:
28+
if cur[-k] < val:
29+
cur_s -= cur[-k]
30+
cur_s += val
31+
cur.add(val)
32+
return res

3479. Fruits Into Baskets III.cpp

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
// https://leetcode.com/problems/fruits-into-baskets-iii
2+
// Basically optimize the brute force with data structures
3+
// Segment tree + binary search to find first index with value >= val`
4+
// TC: O(n * log^2(n))
5+
6+
#include <bits/stdc++.h>
7+
8+
using namespace std;
9+
10+
class SegTree {
11+
vector<int> seg;
12+
function<int(int, int)> f;
13+
int default_val, N;
14+
15+
public:
16+
SegTree(vector<int> &arr, function<int(int, int)> f, int default_val) : f(f), default_val(default_val) {
17+
int layers = ceil(log2(arr.size()));
18+
N = 1 << layers;
19+
seg.resize(N << 1, default_val);
20+
for (size_t i = 0; i < arr.size(); ++i)
21+
seg[i + N] = arr[i];
22+
for (int i = N - 1; i > 0; --i)
23+
seg[i] = f(seg[i << 1], seg[(i << 1) | 1]);
24+
}
25+
26+
void update(int i, int val) {
27+
for (seg[i += N] = val; i > 1; i >>= 1)
28+
seg[i >> 1] = f(seg[i], seg[i ^ 1]);
29+
}
30+
31+
int query(int l, int r) {
32+
int resl = default_val, resr = default_val;
33+
for (l += N, r += N; l <= r; l >>= 1, r >>= 1) {
34+
if (l & 1) resl = f(resl, seg[l++]);
35+
if (!(r & 1)) resr = f(seg[r--], resr);
36+
}
37+
return f(resl, resr);
38+
}
39+
};
40+
41+
int mx(int a, int b) { // functions for the segment tree
42+
return max(a, b);
43+
}
44+
45+
class Solution {
46+
public:
47+
int numOfUnplacedFruits(vector<int> &fruits, vector<int> &baskets) {
48+
SegTree seg(baskets, mx, 0);
49+
int n = fruits.size();
50+
51+
int skipped = 0;
52+
for (auto val: fruits) {
53+
if (seg.query(0, n - 1) < val) { // none available
54+
skipped += 1;
55+
continue;
56+
}
57+
58+
int low = 0;
59+
int high = n - 1;
60+
int ans = n - 1;
61+
while (low <= high) {
62+
int mid = (low + high) / 2;
63+
if (seg.query(0, mid) >= val) {
64+
ans = mid;
65+
high = mid - 1;
66+
} else {
67+
low = mid + 1;
68+
}
69+
}
70+
seg.update(ans, -1);
71+
}
72+
return skipped;
73+
}
74+
};
75+
76+
int main() {
77+
ios_base::sync_with_stdio(false);
78+
cin.tie(nullptr);
79+
80+
81+
return 0;
82+
}

0 commit comments

Comments
 (0)