leetcodeSolution to some Leetcode problems written in C++ |
git clone git://git.dimitrijedobrota.com/leetcode.git |
Log | Files | Refs | README | LICENSE | |
commit | 295259ef940d3588a7933f524438680fab828f61 |
parent | c35d611a2230cbf4ee0da919689d3aface3301f5 |
author | Dimitrije Dobrota <mail@dimitrijedobrota.com> |
date | Tue, 29 Oct 2024 15:39:18 +0100 |
1 Daily Problem, 2 Random
Diffstat:A | Problems/0321.cpp | | | +++++++++++++++++++++++++++++++++++++++++++ |
A | Problems/0715.cpp | | | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
A | Problems/2684.cpp | | | +++++++++++++++++++++ |
M | README.md | | | +++ |
4 files changed, 133 insertions(+), 0 deletions(-)
diff --git a/Problems/0321.cpp b/Problems/0321.cpp
@@ -0,0 +1,43 @@
class Solution {
static bool greater(const vector<int> &nums1, const vector<int> &nums2, int i, int j) {
while (i < size(nums1) && j < size(nums2) && nums1[i] == nums2[j])
i++, j++;
return j == size(nums2) || (i < size(nums1) && nums1[i] > nums2[j]);
}
static vector<int> merge(const vector<int> &nums1, const vector<int> &nums2, int k) {
vector<int> res(k);
for (int i = 0, j = 0, l = 0; l < k; l++) {
res[l] = greater(nums1, nums2, i, j) ? nums1[i++] : nums2[j++];
}
return res;
}
static vector<int> maxArr(const vector<int> &nums, int k) {
const int n = size(nums);
vector<int> res(k);
for (int i = 0, j = 0; i < n; i++) {
while (n - i + j > k && j > 0 && res[j - 1] < nums[i])
j--;
if (j < k) res[j++] = nums[i];
}
return res;
}
public:
vector<int> maxNumber(const vector<int> &nums1, const vector<int> &nums2, int k) const {
const int n = size(nums1), m = size(nums2);
vector<int> res(k);
for (int i = max(0, k - m); i <= k && i <= n; i++) {
const auto candid = merge(maxArr(nums1, i), maxArr(nums2, k - i), k);
res = max(res, candid);
}
return res;
}
};
diff --git a/Problems/0715.cpp b/Problems/0715.cpp
@@ -0,0 +1,66 @@
class SegmentTree {
struct Node {
Node *left = nullptr;
Node *right = nullptr;
int low;
int high;
int value;
Node(int low, int high, int value) : low(low), high(high), value(value) {}
} root;
void update(Node *root, int l, int r, int val) {
if (root->low == l && root->high == r) {
root->value = val;
root->left = root->right = NULL; // memory leak;
return;
}
const int mid = root->low + (root->high - root->low) / 2;
if (!root->left) {
root->left = new Node(root->low, mid, root->value);
root->right = new Node(mid + 1, root->high, root->value);
}
if (r <= mid)
update(root->left, l, r, val);
else if (l > mid)
update(root->right, l, r, val);
else
update(root->left, l, mid, val), update(root->right, mid + 1, r, val);
root->value = root->left->value && root->right->value;
}
bool query(const Node *root, int l, int r) const {
if (!root->left) return root->value;
if (root->low == l && root->high == r) return root->value;
const int mid = root->low + (root->high - root->low) / 2;
if (r <= mid)
return query(root->left, l, r);
else if (l > mid)
return query(root->right, l, r);
return query(root->left, l, mid) && query(root->right, mid + 1, r);
}
public:
SegmentTree(int l, int r, int val) : root(l, r, val) {}
void update(int l, int r, int val) { return update(&root, l, r, val); }
bool query(int l, int r) const { return query(&root, l, r); }
};
class RangeModule {
SegmentTree seg;
public:
RangeModule() : seg(0, 1e9, 0) {}
void addRange(int left, int right) { seg.update(left, right - 1, 1); }
bool queryRange(int left, int right) { return seg.query(left, right - 1); }
void removeRange(int left, int right) { seg.update(left, right - 1, 0); }
};
diff --git a/Problems/2684.cpp b/Problems/2684.cpp
@@ -0,0 +1,21 @@
class Solution {
public:
int maxMoves(const vector<vector<int>> &grid) const {
const int n = size(grid), m = size(grid[0]);
static int dp[1001];
memset(dp, 0x00, sizeof(dp));
for (int j = m - 2; j >= 0; j--) {
for (int i = 0, prev; i < n; i++) {
int crnt = 0;
if (i > 0 && grid[i][j] < grid[i - 1][j + 1]) crnt = max(crnt, prev + 1);
if (grid[i][j] < grid[i][j + 1]) crnt = max(crnt, dp[i] + 1);
if (i < n - 1 && grid[i][j] < grid[i + 1][j + 1]) crnt = max(crnt, dp[i + 1] + 1);
prev = dp[i];
dp[i] = crnt;
}
}
return *max_element(dp, dp + n);
}
};
diff --git a/README.md b/README.md
@@ -296,6 +296,7 @@ reference and a base for solving problems.
| 0316 | Medium | [Remove Duplicate Letters](Problems/0316.cpp) |
| 0318 | Medium | [Maximum Product of Word Lengths](Problems/0318.cpp) |
| 0319 | Medium | [Bulb Switcher](Problems/0319.cpp) |
| 0321 | Hard | [Create Maximum Number](Problems/0321.cpp) |
| 0322 | Medium | [Coin Change](Problems/0322.cpp) |
| 0326 | Easy | [Power of Three](Problems/0326.cpp) |
| 0327 | Hard | [Count of Range Sum](Problems/0327.cpp) |
@@ -512,6 +513,7 @@ reference and a base for solving problems.
| 0712 | Medium | [Minimum ASCII Delete Sum for Two Strings](Problems/0712.cpp) |
| 0713 | Medium | [Subarray Product Less Than K](Problems/0713.cpp) |
| 0714 | Medium | [Best Time to Buy and Sell Stock with Transaction Fee](Problems/0714.cpp) |
| 0715 | Hard | [Range Module](Problems/0715.cpp) |
| 0718 | Medium | [Maximum Length of Repeated Subarray](Problems/0718.cpp) |
| 0719 | Hard | [Find K-th Smallest Pair Distance](Problems/0719.cpp) |
| 0720 | Medium | [Longest Word in Dictionary](Problems/0720.cpp) |
@@ -1337,6 +1339,7 @@ reference and a base for solving problems.
| 2678 | Easy | [Number of Senior Citizens](Problems/2678.cpp) |
| 2679 | Medium | [Sum in a Matrix](Problems/2679.cpp) |
| 2683 | Medium | [Neighboring Bitwise XOR](Problems/2683.cpp) |
| 2684 | Medium | [Maximum Number of Moves in a Grid](Problems/2684.cpp) |
| 2685 | Medium | [Count the Number of Complete Components](Problems/2685.cpp) |
| 2696 | Easy | [Minimum String Length After Removing Substrings](Problems/2696.cpp) |
| 2698 | Medium | [Find the Punishment Number of an Integer](Problems/2698.cpp) |