【Leetcode Sheet】Weekly Practice 25

这篇具有很好参考价值的文章主要介绍了【Leetcode Sheet】Weekly Practice 25。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Leetcode Test

82 删除排序链表中的重复元素Ⅱ(1.15)

给定一个已排序的链表的头 head删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表

提示:

  • 链表中节点数目在范围 [0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序 排列

【模拟】

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* deleteDuplicates(struct ListNode* head) {
    if(head==NULL){
        return NULL;
    }

    struct ListNode* dummy=malloc(sizeof(struct ListNode));
    dummy->next=head;

    struct ListNode* cur=dummy;
    while(cur->next && cur->next->next){
        if(cur->next->val == cur->next->next->val){
            int x=cur->next->val;
            while(cur->next && cur->next->val == x){
                cur->next=cur->next->next;
            }
        }
        else{
            cur=cur->next;
        }
    }
    return dummy->next;
}

2719 统计整数数目(1.16)

给你两个数字字符串 num1num2 ,以及两个整数 max_summin_sum 。如果一个整数 x 满足以下条件,我们称它是一个好整数:

  • num1 <= x <= num2
  • min_sum <= digit_sum(x) <= max_sum.

请你返回好整数的数目。答案可能很大,请返回答案对 109 + 7 取余后的结果。

注意,digit_sum(x) 表示 x 各位数字之和。

提示:

  • 1 <= num1 <= num2 <= 1022
  • 1 <= min_sum <= max_sum <= 400

【一次记忆化搜索】2719. 统计整数数目 - 力扣(LeetCode)

class Solution {
public:
    int count(string num1, string num2, int min_sum, int max_sum) {
        int n = num2.length();
        num1 = string(n - num1.length(), '0') + num1; // 补前导零,和 num2 对齐

        vector<vector<int>> memo(n, vector<int>(min(9 * n, max_sum) + 1, -1));
        function<int(int, int, bool, bool)> dfs = [&](int i, int sum, bool limit_low, bool limit_high) -> int {
            if (sum > max_sum) { // 非法
                return 0;
            }
            if (i == n) {
                return sum >= min_sum;
            }
            if (!limit_low && !limit_high && memo[i][sum] != -1) {
                return memo[i][sum];
            }

            int lo = limit_low ? num1[i] - '0' : 0;
            int hi = limit_high ? num2[i] - '0' : 9;

            int res = 0;
            for (int d = lo; d <= hi; d++) { // 枚举当前数位填 d
                res = (res + dfs(i + 1, sum + d, limit_low && d == lo, limit_high && d == hi)) % 1'000'000'007;
            }

            if (!limit_low && !limit_high) {
                memo[i][sum] = res;
            }
            return res;
        };

        return dfs(0, 0, true, true);
    }
};

2744 最大字符串配对数目(1.17)

给你一个下标从 0 开始的数组 words ,数组中包含 互不相同 的字符串。

如果字符串 words[i] 与字符串 words[j] 满足以下条件,我们称它们可以匹配:

  • 字符串 words[i] 等于 words[j] 的反转字符串。
  • 0 <= i < j < words.length

请你返回数组 words 中的 最大 匹配数目。

注意,每个字符串最多匹配一次。

提示:

  • 1 <= words.length <= 50
  • words[i].length == 2
  • words 包含的字符串互不相同。
  • words[i] 只包含小写英文字母。

【暴力】

int maximumNumberOfStringPairs(char ** words, int wordsSize){
    int ret=0;
    for(int i=0;i<wordsSize;i++){
        for(int j=i+1;j<wordsSize;j++){
            if(words[i][0]==words[j][1] && words[i][1]==words[j][0]){
                ret++;
            }
        }
    }
    return ret;
}

2171 拿出最少数目的魔法豆(1.18)

给定一个 正整数 数组 beans ,其中每个整数表示一个袋子里装的魔法豆的数目。

请你从每个袋子中 拿出 一些豆子(也可以 不拿出),使得剩下的 非空 袋子中(即 至少还有一颗 魔法豆的袋子)魔法豆的数目 相等。一旦把魔法豆从袋子中取出,你不能再将它放到任何袋子中。

请返回你需要拿出魔法豆的 最少数目

提示:

  • 1 <= beans.length <= 105
  • 1 <= beans[i] <= 105

【数学】2171. 拿出最少数目的魔法豆 - 力扣(LeetCode)

int cmp(void *a,void *b){
    return *(int*)a-*(int*)b;
}

long long minimumRemoval(int* beans, int beansSize){
    qsort(beans,beansSize,sizeof(int),cmp);
    long long sum=0,mx=0;
    int n=beansSize;
    for(int i=0;i<n;i++){
        sum+=beans[i];
        mx=fmax(mx,(long long)(n-i)*beans[i]);
    }
    return sum-mx;
}

2809 使数组和小于等于 x 的最少时间(1.19)

给你两个长度相等下标从 0 开始的整数数组 nums1nums2 。每一秒,对于所有下标 0 <= i < nums1.lengthnums1[i] 的值都增加 nums2[i] 。操作 完成后 ,你可以进行如下操作:

  • 选择任一满足 0 <= i < nums1.length 的下标 i ,并使 nums1[i] = 0

同时给你一个整数 x

请你返回使 nums1 中所有元素之和 小于等于 x 所需要的 最少 时间,如果无法实现,那么返回 -1

提示:

  • 1 <= nums1.length <= 103
  • 1 <= nums1[i] <= 103
  • 0 <= nums2[i] <= 103
  • nums1.length == nums2.length
  • 0 <= x <= 106

【动态规划】

static int cmp(const void *a, const void *b) {
    return ((int *)a)[0] - ((int *)b)[0];
}

int minimumTime(int* nums1, int nums1Size, int* nums2, int nums2Size, int x) {
    int n = nums1Size;
    int dp[n + 1][n + 1];
    int nums[n][2];
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < n; i++) {
        nums[i][0] = nums2[i];
        nums[i][1] = nums1[i];
    }
    qsort(nums, n, sizeof(nums[0]), cmp);

    for (int j = 1; j <= n; j++) {
        int b = nums[j - 1][0], a = nums[j - 1][1];
        for (int i = j; i > 0; i--) {
            dp[j][i] = fmax(dp[j - 1][i], dp[j - 1][i - 1] + i * b + a);
        }
    }

    int s1 = 0, s2 = 0;
    for (int i = 0; i < n; i++) {
        s1 += nums1[i];
        s2 += nums2[i];
    }
    for (int i = 0; i <= n; i++) {
        if (s2 * i + s1 - dp[n][i] <= x) {
            return i;
        }
    }
    return -1;
}

2788 按分隔符拆分字符串(1.20)

给你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。

返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串

注意

  • separator 用于决定拆分发生的位置,但它不包含在结果字符串中。
  • 拆分可能形成两个以上的字符串。
  • 结果字符串必须保持初始相同的先后顺序。

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 20
  • words[i] 中的字符要么是小写英文字母,要么就是字符串 ".,|$#@" 中的字符(不包括引号)
  • separator 是字符串 ".,|$#@" 中的某个字符(不包括引号)

【模拟】

class Solution {
public:
    vector<string> splitWordsBySeparator(vector<string>& words, char separator) {
        vector<string> ans;	//结果字符串
        for (auto &w : words) {
            int j = 0;
            //遍历当前字符串的每个字母
            for (int i = 0; i <= w.size(); i++) {
                //遇到分隔符或结束符, 分割字符串 
                if (i == w.size() || w[i] == separator) {
                    if (i - j > 0) {
                        ans.push_back(w.substr(j, i - j));
                    }
                    j = i + 1;
                }
            }
        }
        return ans;
    }
};

410 分割数组的最大值(1.21)

给定一个非负整数数组 nums 和一个整数 k ,你需要将这个数组分成 k 个非空的连续子数组。

设计一个算法使得这 k 个子数组各自和的最大值最小。

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 106
  • 1 <= k <= min(50, nums.length)

【二分 + 贪心】文章来源地址https://www.toymoban.com/news/detail-816097.html

bool check(int* nums, int numsSize, int m, int x) {
    long long sum = 0;
    int cnt = 1;
    //x is mid figure
    for (int i = 0; i < numsSize; i++) {
        //surpass the mid
        if (sum + nums[i] > x) {
            cnt++;
            sum = nums[i];  //clear the sum
        } 
        else {
            sum += nums[i];
        }
    }
    return cnt <= m;
}

int splitArray(int* nums, int numsSize, int m) {
    long long left = 0, right = 0;
    for (int i = 0; i < numsSize; i++) {
        right += nums[i];
        left = fmax(nums[i],left);
    }
    //binary search
    while (left < right) {
        long long mid = (left + right)/2;
        if (check(nums, numsSize, m, mid)) {
            right = mid;
        } 
        else {
            left = mid + 1;
        }
    }
    return left;
}

到了这里,关于【Leetcode Sheet】Weekly Practice 25的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode笔记:Weekly Contest 349

    LeetCode笔记:Weekly Contest 349 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4. 题目四 比赛链接:https://leetcode.com/contest/weekly-contest-349 给出题目一的试题链接如下: 2733. Neither Minimum nor Maximum 1. 解题思路 这一题我实现的比较

    2024年02月08日
    浏览(31)
  • LeetCode笔记:Weekly Contest 360

    LeetCode笔记:Weekly Contest 360 0. 吐槽 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4. 题目四 1. 解题思路 2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-360/ 这次的题目真的是,一言难尽,难倒是不难,就是各种

    2024年02月11日
    浏览(37)
  • LeetCode笔记:Weekly Contest 354

    LeetCode笔记:Weekly Contest 354 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4. 题目四 1. 解题思路 2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-354/ 给出题目一的试题链接如下: 2778. Sum of Squares of Special Elements

    2024年02月16日
    浏览(34)
  • LeetCode笔记:Weekly Contest 357

    LeetCode笔记:Weekly Contest 357 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4. 题目四 比赛链接:https://leetcode.com/contest/weekly-contest-357 给出题目一的试题链接如下: 2810. Faulty Keyboard 1. 解题思路 这一题就是按照题目给出的条

    2024年02月14日
    浏览(36)
  • LeetCode笔记:Weekly Contest 359

    LeetCode笔记:Weekly Contest 359 1. 题目一 1. 解题思路 2. 代码实现 2. 题目二 1. 解题思路 2. 代码实现 3. 题目三 1. 解题思路 2. 代码实现 4. 题目四 1. 解题思路 2. 代码实现 比赛链接:https://leetcode.com/contest/weekly-contest-359 给出题目一的试题链接如下: 2828. Check if a String Is an Acronym of

    2024年02月12日
    浏览(35)
  • Algorithms practice:leetcode 33. Search in Rotated Sorted Array

    Algorithms practice:leetcode33 Search in Rotated Sorted Array There is an integer array ,nums , sorted in ascending order (with distinct values). Prior to being passed to your function, nums is possibly rotated,at an unknown pivot index k (1 = k nums.length) such that the resulting array is [nums[k], nums[k+1], …, nums[n-1], nums[0], nums[1], …, nums

    2024年01月21日
    浏览(50)
  • 【算法与数据结构】62、LeetCode不同路径

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :机器人只能向下或者向右移动,那么到达(i,j)位置的路径和(i-1,j)以及(i,j-1)有关。那么我们就得到的动态规划的表达式 d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][

    2024年01月18日
    浏览(68)
  • 数据结构算法leetcode刷题练习(1)

    给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标

    2023年04月24日
    浏览(54)
  • 【算法与数据结构】112、LeetCode路径总和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题通过计算根节点到叶子节点路径上节点的值之和,然后再对比目标值。利用文章【算法和数据结构】257、LeetCode二叉树的所有路径中的递归算法。 这里要注意,默认路径之和是

    2024年02月11日
    浏览(53)
  • 【算法与数据结构】343、LeetCode整数拆分

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :博主做这道题的时候一直在思考,如何找到 k k k 个正整数, k k k 究竟为多少合适。从数学的逻辑上来说,将 n n n 均分为 k k k 个数之后, k k k 个数的乘积为最大(类似于相同周长

    2024年01月17日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包