LeetCode 2024/7 每日一题 合集

2024-7-1 2065. 最大化一张图中的路径价值

分析

注意观察到至多走十条边,因此直接爆搜即可。

代码实现

class Solution {
public:
    int maximalPathQuality(vector<int>& values, vector<vector<int>>& edges, int maxTime) {
        int n = size(values), m = size(edges);
        std::vector<std::vector<std::pair<int, int>>> g(n);
        for (auto &edge : edges) {
            int u = edge[0], v = edge[1], w = edge[2];
            g[u].emplace_back(v, w);
            g[v].emplace_back(u, w);
        }
        std::vector<bool> vis(n);
        vis[0] = true;
        int ans = 0;
        auto dfs = [&](auto &&self, int u, int times, int cost)->void {
            if (u == 0) {
                ans = std::max(ans, cost);
            }
            for (auto [v, w] : g[u]) if (times + w <= maxTime) {
                if (!vis[v]) {
                    vis[v] = true;
                    self(self, v, times + w, cost + values[v]);
                    vis[v] = false;
                } else {
                    self(self, v, times + w, cost);
                }
            }
        };
        dfs(dfs, 0, 0, values[0]);
        return ans;
    }
};

2024-7-2 3115. 质数的最大距离

代码实现

std::mt19937 rng(std::chrono::steady_clock::now().time_since_epoch().count());
namespace Factorizer {
    std::vector<int> primes;
    std::vector<int> least;
    void sieve(int n) {
        std::vector<int> nums;
        least.assign(n + 1, 0);
        for (int i = 2; i <= n; ++i) {
            if (least[i] == 0) {
                least[i] = i;
                nums.push_back(i);
            }
            int now = 0;
            while (now < (int)nums.size()
                && nums[now] <= least[i] && i * nums[now] <= n) {
                least[i * nums[now]] = nums[now];
                now += 1;
            }
        }
        primes = nums;
    }
    constexpr bool miller_rabin(long long n) {
        if (n <= 1 || (n != 2 && n % 2 == 0)) return false;
        for (auto a : {3, 5, 7, 11, 13, 17, 19, 23, 29}) {
            if (n % a == 0) return n == a;
        }
        if (n < 31 * 31) return true;
        long long d = n - 1;
        while (d % 2 == 0) d /= 2;
        constexpr long long bases[] = {
            2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37
        };
        for (long long a : bases) {
            if (n == a) return true;
            long long t = d;
            long long y = 1 % n;
            for (long long _t = t; _t != 0; _t >>= 1) {
                if (_t & 1) y = (__int128) y * a % n;
                a = (__int128) a * a % n;
            }
            while (t != n - 1 && y != 1 && y != n - 1) {
                y = (__int128) y * y % n;
                t <<= 1;
            }
            if (y != n - 1 && t % 2 == 0) return false;
        }
        return true;
    }
    long long pollard_rho(long long n) {
        if (n == 1 || miller_rabin(n)) return n;
        long long now = 0;
        do {
            long long t = std::gcd(++now, n), r = t;
            if (t != 1 && t != n) return t;
            long long g = 1;
            do {
                t = ((__int128) t * t % n + now) % n;
                r = ((__int128) r * r % n + now) % n;
                r = ((__int128) r * r % n + now) % n;
            } while ((g = std::gcd(abs(t - r), n)) == 1);
            if (g != n) return g;
        } while (now < n / now);
        return 0;
    }
    std::vector<long long> factor(long long n) {
        if (n == 1) return {};
        std::vector<long long> g, d;
        d.push_back(n);
        while (!d.empty()) {
            auto v = d.back();
            d.pop_back();
            auto rho = pollard_rho(v);
            if (rho == v) {
                g.push_back(rho);
            } else {
                d.push_back(rho);
                d.push_back(v / rho);
            }
        }
        std::sort(g.begin(), g.end());
        return g;
    }
}
class Solution {
public:
    int maximumPrimeDifference(vector<int>& nums) {
        int n = size(nums);
        int l = 0, r = n - 1;
        while (Factorizer::factor(nums[l]).size() != 1 || nums[l] == 1) {
            l += 1;
        }
        while (Factorizer::factor(nums[r]).size() != 1 || nums[r] == 1) {
            r -= 1;
        }        
        return r - l;
    }
};

2024-7-3 3099. 哈沙德数

代码实现

class Solution {
public:
    int sumOfTheDigitsOfHarshadNumber(int x) {
        int ans = 0, y = x;
        while (x) {
            ans += x % 10;
            x /= 10;
        }
        return y % ans ? -1 : ans;
    }
};

2024-7-4 3086. 拾起 K 个 1 需要的最少行动次数

分析

(难度在于读题的题目)贪心+枚举,可以发现如果先执行操作1再执行操作2,一定可以得到一个k并且如果此时选择的位置为1,可以直接用代价1收集到1,因此可以对于maxChanges >= k - c的情况可以直接特判,最后只要枚举一下在所有位置的aliceIndex的代价即可,用双指针维护。

代码实现

class Solution {
public:
    long long minimumMoves(vector<int>& nums, int k, int maxChanges) {
        int n = size(nums);
        std::vector<int> pos;
        for (int i = 0; i < n; ++i) if (nums[i]) {
            pos.emplace_back(i);
        }
        int maxl = 0;
        for (int i = 0; i < (int)size(pos); ++i) {
            int len = 1;
            while (i + 1 < (int)size(pos) && pos[i + 1] - pos[i] == 1) {
                i += 1, len += 1;
            }   
            maxl = std::max(maxl, len);
        }
        int c = std::min(3, maxl);
        if (size(pos) == 0) {
            return k * 2;
        } else if (k <= c) {
            return k - 1;
        } else if (c + maxChanges >= k) {
            return c - 1 + (k - c) * 2;
        } else {
            k -= maxChanges;
            std::vector<int> pre(n + 1);
            for (int i = 0; i < n; ++i) {
                pre[i + 1] = pre[i] + nums[i];
            }
            long long ans = 0;
            for (int i = 1; i < k; ++i) {
                ans += pos[i] - pos[0];
            }
            int l = 0, r = k - 1;
            long long last = ans;
            for (int i = pos[0] + 1; i < n; ++i) {
                long long sum = last;
                sum += (long long)(pre[i] - pre[pos[l]]) - (pre[pos[r] + 1] - pre[i]);
                while (r + 1 < size(pos) && i - pos[l] >= pos[r + 1] - i) {
                    sum = sum - (i - pos[l]) + (pos[r + 1] - i);
                    l += 1, r += 1;
                }
                ans = std::min(ans, sum);
                last = sum;
            }
            return ans + 2 * maxChanges;    
        }
    }
};

2024-7-5 3033. 修改矩阵

代码实现

class Solution {
public:
    vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {
        int n = size(matrix), m = size(matrix[0]);
        for (int i = 0; i < m; ++i) {
            int max = 0;
            for (int j = 0; j < n; ++j) {
                max = std::max(max, matrix[j][i]);
            }
            for (int j = 0; j < n; ++j) {
                if (matrix[j][i] == -1) {
                    matrix[j][i] = max;
                }
            }
        }
        return matrix;
    }
};

2024-7-6 3101. 交替子数组计数

代码实现

class Solution {
public:
    long long countAlternatingSubarrays(vector<int>& nums) {
        int n = size(nums);    
        long long ans = 0;
        for (int i = 1; i < n; ++i) {
            int len = 1;
            while (i < n && nums[i] != nums[i - 1]) {
                i += 1, len += 1;
            }
            ans += (long long)len * (len - 1) / 2;
        }
        return ans + n;
    }
};

2024-7-7 1958. 检查操作是否合法

代码实现

class Solution {
public:
    bool checkMove(vector<vector<char>>& board, int rMove, int cMove, char color) {
        int n = size(board), m = size(board[0]);
        for (auto [x, y] : {std::pair{1, 0}, {1, 1}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}}) {
            int fx = rMove + x, fy = cMove + y; 
            if (fx >= 0 && fx < n && fy >= 0 && fy < m && board[fx][fy] == (color ^ 'B' ^ 'W')) {
                while (true) {
                    fx += x, fy += y;
                        if (fx < 0 || fx >= n || fy < 0 || fy >= m || board[fx][fy] == '.') {
                        break;
                    }
                    if (board[fx][fy] == color) {
                        return true;
                    }
                }
            }
        }
        return false;
    }
};

2024-7-8 724. 寻找数组的中心下标

代码实现

class Solution {
public:
    int pivotIndex(vector<int>& nums) {
        int n = size(nums);
        std::vector<int> pre(n + 1);
        for (int i = 0; i < n; ++i) {
            pre[i + 1] = pre[i] + nums[i];
        }
        for (int i = 1; i <= n; ++i) {
            if (pre[i - 1] == pre[n] - pre[i]) {
                return i - 1;
            }
        }
        return -1;
    }
};

2024-7-9 3102. 最小化曼哈顿距离

代码实现

class Solution {
public:
    int minimumDistance(vector<vector<int>>& points) {
        std::multiset<int> xs, ys;
        for (auto &p : points) {
            xs.emplace(p[0] + p[1]);
            ys.emplace(p[0] - p[1]);
        }
        int ans = 2e9;
        for (auto &p : points) {
            int x = p[0] + p[1], y = p[0] - p[1];
            xs.erase(xs.lower_bound(x));
            ys.erase(ys.lower_bound(y));
            ans = std::min(ans, std::max<int>(*xs.rbegin() - *xs.begin(), *ys.rbegin() - *ys.begin()));
            xs.emplace(x);
            ys.emplace(y);
        }
        return ans;
    }
};

2024-7-10 2970. 统计移除递增子数组的数目 I

代码实现

class Solution {
public:
    int incremovableSubarrayCount(vector<int>& nums) {
        int n = size(nums);
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = i; j < n; ++j) {
                std::vector<int> ver;
                ver.insert(ver.end(), nums.begin(), nums.begin() + i);
                ver.insert(ver.end(), nums.begin() + j + 1, nums.end());
                bool ok = true;
                for (int k = 1; k < size(ver); ++k) {
                    ok &= (ver[k] > ver[k - 1]);
                }
                ans += ok;
            }
        }
        return ans;
    }
};

2024-7-11 2972. 统计移除递增子数组的数目 II

代码实现

class Solution {
public:
    long long incremovableSubarrayCount(vector<int>& nums) {
        int n = size(nums);
        int idx = 0;
        while (idx < n - 1 && nums[idx] < nums[idx + 1]) {
            idx += 1;
        }
        if (idx == n - 1) {
            return (long long) n * (n + 1) / 2;
        }
        long long ans = idx + 2;
        for (int i = n - 1; i == n - 1 || nums[i] < nums[i + 1]; --i) {
            while (idx >= 0 && nums[idx] >= nums[i]) {
                idx -= 1;
            }
            ans += idx + 2;
        }
        return ans;
    }
};

2024-7-12 2974. 最小数字游戏

代码实现

class Solution {
public:
    vector<int> numberGame(vector<int>& nums) {
        std::ranges::sort(nums);
        for (int i = 1; i < (int)size(nums); i += 2) {
            std::swap(nums[i], nums[i - 1]);
        }
        return nums;
    }
};

2024-7-13 3011. 判断一个数组是否可以变为有序

代码实现

class Solution {
public:
    bool canSortArray(vector<int>& nums) {
        int n = size(nums);
        for (int i = 0; i < n; ++i) {
            int x = __builtin_popcount(nums[i]), j = i;
            while (j < n && __builtin_popcount(nums[j]) == x) {
                j += 1;
            }
            std::sort(nums.begin() + i, nums.begin() + j);
        } 
        return std::is_sorted(nums.begin(), nums.end());
    }
};

2024-7-14 807. 保持城市天际线

代码实现

class Solution {
public:
    int maxIncreaseKeepingSkyline(vector<vector<int>>& grid) {
        int n = size(grid);
        std::vector<int> maxr(n), maxc(n);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                maxr[i] = std::max(maxr[i], grid[i][j]);
                maxc[j] = std::max(maxc[j], grid[i][j]);
            }
        }
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < n; ++j) {
                ans += std::min(maxr[i], maxc[j]) - grid[i][j];
            }
        }
        return ans;
    }
};

2024-7-15 721. 账户合并

代码实现

struct DSU {
    std::vector<int> p, siz;
    DSU(int n) : p(n), siz(n, 1) { std::iota(p.begin(), p.end(), 0); }
    int leader(int x) {
        while (x != p[x]) x = p[x] = p[p[x]];
        return x;
    }
    bool same(int x, int y) { return leader(x) == leader(y); }
    bool merge(int x, int y) {
        x = leader(x), y = leader(y);
        if (x == y) return false;
        siz[x] += siz[y], p[y] = x;
        return true;
    }
    int size(int x) { return siz[leader(x)]; }
};
class Solution {
public:
    vector<vector<string>> accountsMerge(vector<vector<string>>& accounts) {
        int n = size(accounts);
        DSU dsu(n);
        auto isEdge = [&](int x, int y) {
            for (int i = 1; i < size(accounts[x]); ++i) {
                for (int j = 1; j < size(accounts[y]); ++j) {
                    if (accounts[x][i] == accounts[y][j]) {
                        return true;
                    }
                }
            }
            return false;
        };
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                if (isEdge(i, j)) {
                    dsu.merge(i, j);
                }
            }
        }
        std::vector<std::vector<std::string>> ans;
        std::vector<std::vector<int>> set(n);
        for (int i = 0; i < n; ++i) {
            set[dsu.leader(i)].emplace_back(i);
        }
        for (int i = 0; i < n; ++i) if (size(set[i])) {
            std::vector<std::string> add = {accounts[i][0]};
            for (auto t : set[i]) {
                for (int j = 1; j < (int)size(accounts[t]); ++j) {
                    add.emplace_back(accounts[t][j]);
                }
            }
            std::sort(add.begin() + 1, add.end());
            add.erase(std::unique(add.begin(), add.end()), add.end());
            ans.emplace_back(add);
        }
        return ans;
    }
};

2024-7-16 2956. 找到两个数组中的公共元素

代码实现

class Solution {
public:
    vector<int> findIntersectionValues(vector<int>& nums1, vector<int>& nums2) {
        int n = size(nums1), m = size(nums2);
        std::vector<int> ans{0, 0};
        for (int i = 0; i < n; ++i) {
            for (int j = 0; j < m; ++j) {
                if (nums1[i] == nums2[j]) {
                    ans[0] += 1;
                    break;
                }
            }
        }
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                if (nums1[j] == nums2[i]) {
                    ans[1] += 1;
                    break;
                }
            }
        }
        return ans;
    }
};  

2024-7-17 2959. 关闭分部的可行集合数目

分析

可以发现n10,显然可以直接进行二进制枚举选择是否关闭分部。然后进行连边,floyed暴力跑看图是否联通和最长路径即可。

代码实现

class Solution {
public:
    int numberOfSets(int n, int maxDistance, vector<vector<int>>& roads) {
        auto work = [&](int choice) {
            std::vector g(n, std::vector<int>(n, 1e9));
            for (int i = 0; i < n; ++i) {
                g[i][i] = 0;
            }
            for (auto road : roads) {
                int u = road[0], v = road[1], w = road[2];
                if ((choice >> u & 1) && (choice >> v & 1)) {
                    g[u][v] = g[v][u] = std::min(g[u][v], w);
                }
            }
            for (int k = 0; k < n; ++k) {
                for (int i = 0; i < n; ++i) {
                    for (int j = 0; j < n; ++j) {
                        g[i][j] = std::min(g[i][j], g[i][k] + g[k][j]);
                    }
                }
            }
            int max = 0;
            for (int i = 0; i < n; ++i) {
                for (int j = 0; j < n; ++j) {
                    if (g[i][j] < 1e9) {
                        max = std::max(max, g[i][j]);
                    }
                }
            }
            bool ok = true;
            for (int i = 0; i < n; ++i) if (choice >> i & 1) {
                for (int j = 0; j < n; ++j) if (choice >> j & 1) {
                    ok &= (g[i][j] < 1e9);
                }
            }
            return max <= maxDistance && ok;
        };
        int ans = 0;
        for (int i = 0; i < (1 << n); ++i) {
            ans += work(i);
        }   
        return ans;
    }
};

2024-7-18 3112. 访问消失节点的最少时间

代码实现

class Solution {
public:
    vector<int> minimumTime(int n, vector<vector<int>>& edges, vector<int>& disappear) {
        std::vector<std::vector<std::pair<int, int>>> g(n);
        for (auto edge : edges) {
            int u = edge[0], v = edge[1], w = edge[2];
            g[u].emplace_back(v, w);
            g[v].emplace_back(u, w);
        }
        std::vector<int> dist(n, 1e9);
        std::vector<bool> st(n);
        std::priority_queue<std::pair<int, int>, std::vector<std::pair<int, int>>, std::greater<>> heap;
        heap.emplace(0, 0);
        dist[0] = 0;
        while (size(heap)) {
            auto [d, u] = heap.top();
            heap.pop();
            if (st[u]) continue;
            st[u] = true;
            for (auto [v, w] : g[u]) {
                if (d + w < dist[v] && disappear[v] > d + w) {
                    dist[v] = dist[u] + w;
                    heap.emplace(dist[v], v);
                }
            }
        }
        for (int i = 0; i < n; ++i) {
            if (dist[i] >= 1e9) {
                dist[i] = -1;
            }
        }
        return dist;
    }
};

2024-7-19 3096. 得到更多分数的最少关卡数目

代码实现

class Solution {
public:
    int minimumLevels(vector<int>& possible) {
        int n = size(possible);
        int sum = std::accumulate(possible.begin(), possible.end(), 0) * 2 - n;
        int pre = 0;
        for (int i = 0; i < n - 1; ++i) {
            pre += possible[i] == 1 ? 1 : -1;
            if (2 * pre > sum) return i + 1;
        }
        return -1;
    }
};

2024-7-20 2850. 将石头分散到网格图的最少移动次数

代码实现

class Solution {
public:
    int minimumMoves(vector<vector<int>>& grid) {
        std::vector<std::pair<int, int>> from, to;
        for (int i = 0; i < 3; ++i) {
            for (int j = 0; j < 3; ++j) {
                if (grid[i][j]) {
                    for (int k = 1; k < grid[i][j]; ++k) {
                        from.emplace_back(i, j);
                    }
                } else {
                    to.emplace_back(i, j);
                }
            }
        }
        int ans = 1e9;
        do {
            int sum = 0;
            for (int i = 0; i < (int)size(from); ++i) {
                sum += std::abs(from[i].first - to[i].first) + std::abs(from[i].second - to[i].second);
            }
            ans = std::min(ans, sum);
        } while (std::next_permutation(from.begin(), from.end()));
        return ans;
    }
};

2024-7-21 2850. 将石头分散到网格图的最少移动次数

代码实现

class Solution {
public:
    int maximumSum(vector<int>& arr) {
        int dp0 = arr[0], dp1 = 0, res = arr[0];
        for (int i = 1; i < arr.size(); ++i) {
            dp1 = max(dp0, dp1 + arr[i]);
            dp0 = max(dp0, 0) + arr[i];
            res = max(res, max(dp0, dp1));
        }
        return res;
    }
};

2024-7-22 2101. 引爆最多的炸弹

代码实现

class Solution {
public:
    int maximumDetonation(vector<vector<int>>& bombs) {
        int n = size(bombs);
        auto get = [&](int a1, int b1, int a2, int b2) {
            return std::hypot(a1 - a2, b1 - b2);
        };
        std::vector<std::vector<int>> g(n);
        for (int i = 0; i < n; ++i) {
            for (int j = i + 1; j < n; ++j) {
                double dist = get(bombs[i][0], bombs[i][1], bombs[j][0], bombs[j][1]);
                if (1. * bombs[i][2] >= dist) {
                    g[i].push_back(j);
                }
                if (1. * bombs[j][2] >= dist) {
                    g[j].push_back(i);
                }
            }
        }
        std::vector<bool> vis(n);
        auto dfs = [&](auto &&self, int u)->int {
            int cnt = 1;
            vis[u] = true;
            for (auto v : g[u]) if (!vis[v]) {
                cnt += self(self, v);
            }
            return cnt;
        };
        int ans = 0;
        for (int i = 0; i < n; ++i) {
            vis.assign(n, false);
            ans = std::max(ans, dfs(dfs, i));
        }
        return ans;
    }
};

2024-7-23 3098. 求出所有子序列的能量和

代码实现

constexpr int P = 1e9 + 7;
class Solution {
public:
    int sumOfPowers(vector<int>& nums, int k) {
        std::unordered_map<long long, int> f;
        int n = size(nums);
        std::sort(nums.begin(), nums.end());
        auto dfs = [&](auto&& dfs, int i, int j, int k, int mi) -> int {
            if (i >= n) {
                return k == 0 ? mi : 0;
            }
            if (n - i < k) {
                return 0;
            }
            long long key = (1LL * mi) << 18 | (i << 12) | (j << 6) | k;
            if (f.contains(key)) return f[key];
            long long ans = dfs(dfs, i + 1, j, k, mi);
            if (j == n) {
                ans += dfs(dfs, i + 1, i, k - 1, mi);
            } else {
                ans += dfs(dfs, i + 1, i, k - 1, min(mi, nums[i] - nums[j]));
            }
            ans %= P;
            return f[key] = ans;
        };
        return dfs(dfs, 0, n, k, 1e9);
    }
};

2024-7-24 2766. 重新放置石块

代码实现

class Solution {
public:
    vector<int> relocateMarbles(vector<int>& nums, vector<int>& moveFrom, vector<int>& moveTo) {
        std::map<int, int> mp;
        int n = size(nums), m = size(moveFrom);
        for (int i = 0; i < n; ++i) {
            mp[nums[i]] += 1;
        }
        for (int i = 0; i < m; ++i) {
            int u = moveFrom[i], v = moveTo[i];
            if (mp.count(u)) {
                mp[v];
                if (u != v) {
                    mp.erase(u);
                }
            }
        }
        std::vector<int> ans;
        for (auto [x, _] : mp) {
            ans.push_back(x);
        }
        return ans;
    }
};

2024-7-25 2844. 生成特殊数字的最少操作

代码实现

class Solution {
public:
    int minimumOperations(string num) {
        int ans = size(num) - 1;
        int suc = 0;
        {
            std::string s = num;
            int p5 = s.rfind('5');
            if (p5 != -1) {
                int cnt = (int)size(num) - p5 - 1;
                s.erase(s.begin() + p5, s.end());
                int p2 = s.rfind('2'), p7 = s.rfind('7');
                if (p2 != -1) {
                    ans = std::min(ans, cnt + (int)size(s) - p2 - 1);
                    suc += 1;
                }
                if (p7 != -1) {
                    ans = std::min(ans, cnt + (int)size(s) - p7 - 1);
                    suc += 1;
                }
            }
        }
        {
            std::string s = num;
            int p0 = s.rfind('0');
            if (p0 != -1) {
                int cnt = (int)size(num) - p0 - 1;
                s.erase(s.begin() + p0, s.end());
                int p00 = s.rfind('0'), p5 = s.rfind('5');
                if (p00 != -1) {
                    ans = std::min(ans, cnt + (int)size(s) - p00 - 1);
                    suc += 1;
                }
                if (p5 != -1) {
                    ans = std::min(ans, cnt + (int)size(s) - p5 - 1);
                    suc += 1;
                }
            }
        }
        if (suc == 0 && std::count(num.begin(), num.end(), '0') == 0) {
            return size(num);
        }
        return ans;
    }
};

2024-7-26 2740. 找出分区值

代码实现

class Solution {
public:
    int findValueOfPartition(vector<int>& nums) {
        int n = size(nums);
        std::sort(nums.begin(), nums.end());
        int ans = 2e9;
        for (int i = 1; i < n; ++i) {
            ans = std::min(ans, nums[i] - nums[i - 1]);
        }
        return ans;
    }
};

2024-7-27 3106. 满足距离约束且字典序最小的字符串

代码实现

class Solution {
public:
    string getSmallestString(string s, int k) {
        for (auto &c : s) {
            int x = std::min(c - 'a', 'z' - c + 1);
            if (x > k) {
                c -= k;
                return s;
            }
            c = 'a', k -= x;
        }
        return s;
    }
};

2024-7-28 699. 掉落的方块

代码实现

class Solution {
public:
    vector<int> fallingSquares(vector<vector<int>>& positions) {
        int n = size(positions);
        std::vector<int> h(n);
        for (int i = 0; i < n; ++i) {
            int l1 = positions[i][0], r1 = positions[i][0] + positions[i][1] - 1;
            h[i] = positions[i][1];
            for (int j = 0; j < i; ++j) {
                int l2 = positions[j][0], r2 = positions[j][0] + positions[j][1] - 1;
                if (r1 >= l2 && r2 >= l1) {
                    h[i] = std::max(h[i], h[j] + positions[i][1]);
                }
            }
        }
        for (int i = 1; i < n; ++i) {
            h[i] = std::max(h[i], h[i - 1]);
        }
        return h;
    }
};

2024-7-29 682. 棒球比赛

代码实现

class Solution {
public:
    int calPoints(vector<string>& operations) {
        int n = size(operations);
        std::vector<int> ans;
        for (auto op : operations) {
            if (op == "+") {
                ans.push_back(ans.rbegin()[0] + ans.rbegin()[1]);
            } else if (op == "D") {
                ans.push_back(ans.rbegin()[0] * 2);
            } else if (op == "C") {
                ans.pop_back();
            } else {
                ans.push_back(std::stoi(op));
            }
        }
        return std::accumulate(ans.begin(), ans.end(), 0LL);
    }
};

2024-7-30 682. 棒球比赛

代码实现

class Solution {
public:
    vector<int> getGoodIndices(vector<vector<int>>& variables, int target) {
        auto power = [&](int a, int b, int p) {
            int c = 1;
            while (b) {
                if (b & 1) c = c * a % p;
                a = a * a % p;
                b >>= 1;
            }
            return c;
        };
        std::vector<int> ans;
        for (int i = 0; i < size(variables); ++i) {
            int a = variables[i][0];
            int b = variables[i][1];
            int c = variables[i][2];
            int m = variables[i][3];
            if (power(power(a, b, 10), c, m) == target) {
                ans.push_back(i);
            }
        }
        return ans;
    }
};

2024-7-31 3111. 覆盖所有点的最少矩形数目

分析

显然的发现y轴对于题目并没有影响,因此直接记录x的坐标并对其排序去重,最后贪心的放置即可。

代码实现

class Solution {
public:
    int minRectanglesToCoverPoints(vector<vector<int>>& points, int w) {
        int n = size(points);
        std::vector<int> px(n);
        for (int i = 0; i < n; ++i) {
            px[i] = points[i][0];
        }
        std::sort(px.begin(), px.end());
        px.erase(std::unique(px.begin(), px.end()), px.end());
        n = size(px);
        int cnt = 0;
        for (int i = 0; i < n; ++i) {
            int first = px[i], j = i + 1;
            while (j < n && px[j] - first <= w) {
                j += 1;
            }
            i = j - 1;
            cnt += 1;
        }
        return cnt;
    }
};
posted @   sleeeeeping  阅读(27)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
  1. 1 吹梦到西洲 恋恋故人难,黄诗扶,妖扬
  2. 2 敢归云间宿 三无Marblue
吹梦到西洲 - 恋恋故人难,黄诗扶,妖扬
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 颀鞍

作曲 : 铃木航海

编曲 : 远藤直弥/冯帆

制作人 : 冯帆/铃木航海

(妖扬)

(妖扬)

无何化有 感物知春秋

秋毫濡沫欲绸缪 搦管相留

(黄诗扶)

留骨攒峰 留容映水秀

留观四时曾邂逅 佳人西洲

(妖扬)

(妖扬)

西洲何有 远树平高丘

云闲方外雨不收 稚子牵牛

(黄诗扶)

闹市无声 百态阴晴栩栩侔

藤衣半卷苔衣皱 岁月自无忧

(妖扬)

(妖扬)

驾马驱车 尚几程扶摇入画中 咫尺

(黄诗扶)

径曲桥横 精诚难通

(黄诗扶、妖扬)

(黄诗扶、妖扬)

盼你渡口 待你桥头

松香接地走

挥癯龙绣虎出怀袖

起微石落海连波动

描数曲箜篌线同轴

勒笔烟直大漠 沧浪盘虬

一纸淋漓漫点方圆透

记我 长风万里绕指未相勾

形生意成 此意 逍遥不游

(妖扬)

(妖扬)

日月何寿 江海滴更漏

爱向人间借朝暮 悲喜为酬

(黄诗扶)

种柳春莺 知它风尘不可救

绵绵更在三生后 谁隔世读关鸠

(妖扬)

(妖扬)

诗说红豆 遍南国未见人长久 见多少

(黄诗扶)

来时芳华 去时白头

(黄诗扶、妖扬)

(黄诗扶、妖扬)

忘你不舍 寻你不休

画外人易朽

似浓淡相间色相构

染冰雪先披琉璃胄

蘸朱紫将登金银楼

天命碧城灰土 刀弓褐锈

举手夜古泼断青蓝右

照我 萤灯嫁昼只影归洪流

身魂如寄 此世 逍遥不游

(黄诗扶)

(黄诗扶)

情一物 无木成林无水行舟

情一事 未算藏谋真还谬

情一人 积深不厚积年不旧

情一念 墨尽非空 百代飞白骤 划地为囚

(妖扬)

(妖扬)

蓝田需汲酒 惟琼浆能浇美玉瘦

至高者清难垢 至贵者润因愁

痴竭火 知她不能求

醉逢歌 知他不必候

只约灵犀过隙灵光暗相投

(黄诗扶、妖扬)

(黄诗扶、妖扬)

万籁停吹奏

支颐听秋水问蜉蝣

既玄冥不可量北斗

却何信相思最温柔

顾盼花发鸿蒙 怦然而梦

你与二十八宿皆回眸

系我 彩翼鲸尾红丝天地周

情之所至 此心 逍遥不游

吉他 : ShadOw

钢琴 : ShadOw

和声编写 : 冯帆

和声 : 黄诗扶

人声混音 : 徐志明

混音 : 冯帆

母带 : 冯帆

企划 : 三糙文化

出品公司 : Negia Entertainment Inc.

点击右上角即可分享
微信分享提示