• LeetCode 第 388 场周赛个人题解


    目录

    100233. 重新分装苹果

    原题链接

    思路分析

    AC代码

    100247. 幸福值最大化的选择方案

    原题链接

    思路分析

    AC代码

    100251. 数组中的最短非公共子字符串

    原题链接

    思路分析

    AC代码

    100216. K 个不相交子数组的最大能量值

    原题链接

    思路分析

    AC代码


    100233. 重新分装苹果

    原题链接
     

    100233. 重新分装苹果

    思路分析

    直接模拟

    降序排序capacity,倒序累加,当大于苹果总重量的时候我们就返回

    时间复杂度:O(nlgon)

    AC代码

    1. class Solution {
    2. public:
    3. int minimumBoxes(vector<int>& apple, vector<int>& capacity) {
    4. int s = accumulate(apple.begin(), apple.end(), 0);
    5. int n = capacity.size();
    6. sort(capacity.begin(), capacity.end(), [](int x, int y){return y < x;});
    7. for(int i = 0, t = 0; i < n; i++) {
    8. t += capacity[i];
    9. if(t >= s) return i + 1;
    10. }
    11. return n;
    12. }
    13. };


    100247. 幸福值最大化的选择方案

     

    原题链接

      100247. 幸福值最大化的选择方案

    思路分析

      贪心

    优先分配幸福值大的孩子,然后直接模拟

    时间复杂度:O(nlgon)

    AC代码

    1. class Solution {
    2. public:
    3. long long maximumHappinessSum(vector<int>& a, long long k) {
    4. long long ret = 0;
    5. sort(a.begin(), a.end(), [](int x, int y){return x > y;});
    6. for(int i = 0, t = 0; i < k; i++, t++){
    7. if(a[i] > t) ret += a[i] - t;
    8. }
    9. return ret;
    10. }
    11. };


    100251. 数组中的最短非公共子字符串

    原题链接

    100251. 数组中的最短非公共子字符串

     

    思路分析

    其实直接暴力就行了

    用哈希表或者字典树存储所有字符串的所有子串,然后遍历每个字符串的子串找到不在哈希表或者字典树中的子串中最短并且字典序最小的那个

    想着复习下字典树就敲了下字典树

    时间复杂度分析:

    子串长度有k种,起点有k个,那么存储一个长度为k的字符串的所有子串就是O(k^3)

    然后枚举n个字符串的所有字串并判断就是O(n*k^3)

    因为k最大也就20,n最大100,因而整体也就1e6左右

    时间复杂度O(n*k^3)是可以的

    AC代码

    1. struct node{
    2. unordered_map<char,node*>ch;
    3. unordered_set<int> words;
    4. };
    5. class Solution {
    6. public:
    7. vector shortestSubstrings(vector& arr) {
    8. node* rt = new node, *cur;
    9. vector ret;
    10. for(int k = 0, sz = arr.size(); k < sz; k++)
    11. for(int i = 0, n = arr[k].size(); i < n; i++){
    12. cur = rt;
    13. for(int j = i; j < n; j++){
    14. if(!cur->ch.count(arr[k][j])) cur->ch[arr[k][j]] = new node;
    15. cur = cur->ch[arr[k][j]], cur->words.insert(k);
    16. }
    17. }
    18. for(int k = 0, sz = arr.size(); k < sz; k++){
    19. string tmp;
    20. for(int i = 0, j, n = arr[k].size(); i < n; i++){
    21. cur = rt;
    22. for(j = i; j < n; j++){
    23. cur = cur->ch[arr[k][j]];
    24. if(cur->words.size() == 1){
    25. if(tmp.empty() || j - i + 1 < tmp.size() || (j - i + 1 == tmp.size() && arr[k].substr(i, j - i + 1) < tmp)) tmp = arr[k].substr(i, j - i + 1);
    26. break;
    27. }
    28. }
    29. }
    30. ret.emplace_back(tmp);
    31. }
    32. return ret;
    33. }
    34. };

    100216. K 个不相交子数组的最大能量值

    原题链接

    100216. K 个不相交子数组的最大能量值

    思路分析

      考虑题目说n*k <= 1e6,所以想到用dp

    定义状态

    f[i][j][0]为前i个元素拆出j个子数组且第i个元素在第j个子数组中的最大能量和

    f[i][j][1]为前i个元素拆出j个子数组且第i个元素不在第j个子数组中的最大能量和

    那么有转移方程

    f[i][j][1] = max(f[i - 1][j][0], f[i - 1][j][1]);即不选第i个数,那么直接由上一行转移

    选第i个数并且单独成第j组,那么前i-1个数要拆出j-1组,第i-1个数在不在第j-1组取大的那个
    if(j)
        f[i][j][0] = max(f[i][j][0], max(f[i - 1][j - 1][1], f[i - 1][j - 1][0]) + 1LL * (j & 1 ? 1 : -1) * (k - j + 1) * nums[i - 1]);
    选第i个数并且加入第j组
    f[i][j][0] = max(f[i][j][0], f[i - 1][j][0] + 1LL * (j & 1 ? 1 : -1) * (k - j + 1) * nums[i - 1]);

    时间复杂度O(nk)

    AC代码

    1. class Solution {
    2. public:
    3. long long maximumStrength(vector<int>& nums, int k) {
    4. int n = nums.size();
    5. vectorlong long>>> f(n + 1, vectorlong long>>(k + 1, vector<long long>(2, -1e18)));
    6. f[0][0][1] = 0;
    7. for(int i = 1; i <= n; i++){
    8. for(int j = 0; j <= k; j++){
    9. //不选
    10. f[i][j][1] = max(f[i - 1][j][0], f[i - 1][j][1]);
    11. //选
    12. //单独成组
    13. if(j)
    14. f[i][j][0] = max(f[i][j][0], max(f[i - 1][j - 1][1], f[i - 1][j - 1][0]) + 1LL * (j & 1 ? 1 : -1) * (k - j + 1) * nums[i - 1]);
    15. //加到前面
    16. f[i][j][0] = max(f[i][j][0], f[i - 1][j][0] + 1LL * (j & 1 ? 1 : -1) * (k - j + 1) * nums[i - 1]);
    17. }
    18. }
    19. return max(f[n][k][0], f[n][k][1]);
    20. }
    21. };
  • 相关阅读:
    淘宝真的暴利行业吗
    vue3 teleport的使用
    深拷贝与浅拷贝
    WooCommerce数据库解释:它是如何工作的以及在哪里可以找到数据
    二维卡通数字人解决方案
    Oracle中已定义者身份执行函数AUTHID DEFINER与Postgresql行为的异同
    基于主动学习和Wi-Fi感知的人体识别系统
    双列集合 JAVA
    【Python】通过 Python 设置电脑代理端口
    网络数据帧中的(Jumbo Frame)巨帧、超长帧
  • 原文地址:https://blog.csdn.net/EQUINOX1/article/details/136599792