leetcode359周赛

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



leetcode359周赛,数据结构

第四题:找出最长等值数组

  • 滑动窗口

  • 总长度 - 众数 > k就需要收缩窗口了。

  • 所以需要一个数据结构统计众数:multiset维护每一个数字的个数。

这里有一个坑ms.erase(x):会把所有的等于x的数字都删除。所以需要使用auto it = ms.find(x); ms.erase(it)来进行单个删除。

class Solution {
public:
    int longestEqualSubarray(vector<int>& nums, int k) {
        int n = nums.size();
        multiset<int>ms;
        unordered_map<int, int>cnt;
        int ans = 0;
        for (int i = 0, j = 0; j < n; j++) {   
            del(ms, cnt[nums[j]]);
            cnt[nums[j]]++;
            ms.insert(cnt[nums[j]]);
            
            int c_cnt = *(ms.rbegin());
           	// 长度 - 众数 > k收缩窗口
            while (j - i + 1 - c_cnt > k) {
                del(ms, cnt[nums[i]]);
                cnt[nums[i]]--;
                ms.insert(cnt[nums[i]]);
                i++;
                c_cnt = *(ms.rbegin());
            }
            ans = max(ans, *(ms.rbegin()));
        }
        return ans;
    }
    // 单点删除
    void del(multiset<int>&ms, int target) {
        auto it = ms.find(target);
        if (it != ms.end()) {
             ms.erase(it);
        }
    }
};

第三题:销售利润最大化

  • 排序 + 二分 + dp

  • 类似于学最多的课程,按照结尾进行排序

  • 排序之后,定义f[i]:截止到i为止的最大值,f[i] = max(f[i - 1], f[pre] + g)

  • pre是前面最后一个可以购买的下标。因为排序了所以可以使用二分找到第一个ed < cur_bg的下标pre文章来源地址https://www.toymoban.com/news/detail-661279.html

class Solution {
    public int maximizeTheProfit(int n, List<List<Integer>> offers) {
        // 区间最大值,可以按照开始进行排序,可以按照结尾进行排序。这里选择按照结尾进行排序
        // 如果区间相交,那么就不能进行同时购买,否则就可以进行同时购买。
        // f[i]:表示截止到区间i的最大值
        // 可以二分找到前面可以购买的第一个房间lower_boudn() - 1。f[i] = f[pre] + goal[i];
        // 状态转移是否有问题。有,截止到当前的,那么就不是以当前结尾的。如果表示当前结尾的,那么需要遍历前面所有小于它的。
        // 如果表示截至到当前的, f[i] = Math.max(f[i - 1], f[pre] + offers.get(i).get(2));
        // 第二种状态:当前可以买,可以不买,买
        offers.sort(new Comparator<List<Integer>>() {
            @Override
            public int compare(List<Integer> o1, List<Integer> o2) {
                return Integer.compare(o1.get(1), o2.get(1));
            }
        });
        int len = offers.size();
        int[] f = new int[len + 1];
        
        for (int i = 1; i <= len; i++) {
            int bg = offers.get(i - 1).get(0), ed = offers.get(i - 1).get(1);
            int g = offers.get(i - 1).get(2);
            int l = 0, r = len;
            while (l < r) {
                int mid = (l + r) >> 1;
                if (offers.get(mid).get(1) >= bg) r = mid;
                else l = mid + 1;
            }
            f[i] = Math.max(f[l] + g, f[i - 1]);
            // System.out.println("l = " + l);
            // System.out.println(f[i]);
        }
        return f[len]; 
    }
}

第二题 k-avoiding

  • 小贪心
  • 为了避免会出现和为k的情况。如果出现x就不能出现k - x,由于需要的数组和最小,所以选择min(x, k - x)
  • 由于数组和最小,所以可以直接从1开始进行取数如果选则了x,就不能选择k - x,使用map或者set进行标记就行了。
class Solution {
public:
    int minimumSum(int n, int k) {
                // 什么情况下会出现和为k的情况。如果出现x就不能出现k - x。那么选择x还是k - x呢?肯定选择min(x, k - x);
        // 最小不同,所以对于每一个数字,从最小的可以选的选择。
        unordered_map<int, int>mp;
        int cur = 1;
        int ans = 0;
        for (int i = 0; i < n; i++) {
            while (mp[cur] == 1) cur++;
            ans += cur;
            mp[k - cur] = 1;
            cur++;
        }
        return ans;
    }
};

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

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

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

相关文章

  • 力扣(LeetCode)数据结构练习题(2)

    今天又写了两道关于链表的练习题,来给大家分享一下。巩固一下上一篇学到的链表知识,题目可以然我们更清楚的认识链表。 目录 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中

    2024年02月21日
    浏览(43)
  • 数据结构算法leetcode刷题练习(1)

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

    2023年04月24日
    浏览(40)
  • 【算法与数据结构】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日
    浏览(54)
  • 【LeetCode】数据结构题解(6)[回文链表]

    所属专栏:玩转数据结构题型 博主首页:初阳785 代码托管:chuyang785 感谢大家的支持,您的点赞和关注是对我最大的支持!!! 博主也会更加的努力,创作出更优质的博文!! 关注我,关注我,关注我,重要的事情说三遍!!!!!!!! 回文链表 给定一个链表的 头节点

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

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

    2024年01月17日
    浏览(39)
  • 【算法与数据结构】474、LeetCode一和零

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题要找strs数组的最大子集,这个子集最多含有 m m m 个0和 n n n 个1。本题也可以抽象成一个01背包的问题。其中,strs内的元素就是物品,而 m m m 和 n n n 就是背包的维度。 d p [

    2024年01月22日
    浏览(32)
  • 【算法与数据结构】494、LeetCode目标和

    所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。    思路分析 :本题和这道题【算法与数据结构】1049、LeetCode 最后一块石头的重量 II类似,同样可以转换成01背包问题。下面开始论述。假设添加正号的整数子集和为 p o s i t i v e positive p os i t

    2024年01月20日
    浏览(31)
  • 【数据结构 | 链表】leetcode 2. 两数相加

    个人主页:兜里游客棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里游客棉花糖 原创 收录于专栏【LeetCode】 原题链接:点击直接跳转到该题目 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位

    2024年02月05日
    浏览(41)
  • 【算法与数据结构】112、LeetCode路径总和

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

    2024年02月11日
    浏览(39)
  • 【数据结构】如何设计循环队列?图文解析(LeetCode)

    LeetCode链接:622. 设计循环队列 - 力扣(LeetCode) 目录 做题思路 只开辟 k 个空间 多开一个空间 代码实现 1. 循环队列的结构 2. 开辟空间 3. 判断空 4. 判断满 5. 队尾插入数据 6. 队头删除数据 7. 获取队头元素 8. 获取队尾元素 9. 销毁队列 全部代码 设计循环队列,使用数组或链表

    2024年02月10日
    浏览(30)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包