Leetcode 第 122 场双周赛题解

news2025/1/18 9:51:56

Leetcode 第 122 场双周赛题解

  • Leetcode 第 122 场双周赛题解
    • 题目1:3010. 将数组分成最小总代价的子数组 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3011. 判断一个数组是否可以变为有序
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3012. 通过操作使数组长度最小
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3013. 将数组分成最小总代价的子数组 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 122 场双周赛题解

题目1:3010. 将数组分成最小总代价的子数组 I

思路

给你一个长度为 n 的整数数组 nums 。

一个数组的代价是它的第一个元素。比方说,[1,2,3] 的代价是 1 ,[3,4,1] 的代价是 3 。

你需要将 nums 分成 3 个连续且没有交集的子数组。

请你返回这些子数组的最小代价总和 。

第一个代价一定是 nums[0],后面两个代价是 nums[1,…,n] 的最小值和次小值。

三个代价的和就是答案。

代码

/*
 * @lc app=leetcode.cn id=3010 lang=cpp
 *
 * [3010] 将数组分成最小总代价的子数组 I
 */

// @lc code=start
class Solution
{
public:
    int minimumCost(vector<int> &nums)
    {
        // 特判
        if (nums.size() == 3)
            return accumulate(nums.begin(), nums.end(), 0);

        int n = nums.size();

        // 第一个代价一定是 nums[0]
        int cost = *nums.begin();
        nums.erase(nums.begin());

        // 后面两个代价是 nums[1,...,n] 的最小值和次小值
        auto it = min_element(nums.begin(), nums.end());
        cost += *it;
        nums.erase(it);
        it = min_element(nums.begin(), nums.end());
        cost += *it;

        return cost;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

题目2:3011. 判断一个数组是否可以变为有序

思路

分组循环。

适用场景:按照题目要求,数组会被分割成若干组,每一组的判断/处理逻辑是相同的。

核心思想:

  1. 外层循环负责遍历组之前的准备工作(记录开始位置),和遍历组之后的工作(排序)。
  2. 内层循环负责遍历组,找出这一组最远在哪结束。

这个写法的好处是,各个逻辑块分工明确,也不需要特判最后一组(易错点)。

用分组循环找到一个组, 对这个组排序,最后判断整个数组是否有序。

代码

/*
 * @lc app=leetcode.cn id=3011 lang=cpp
 *
 * [3011] 判断一个数组是否可以变为有序
 */

// @lc code=start
class Solution
{
public:
    bool canSortArray(vector<int> &nums)
    {
        int n = nums.size();
        int i = 0;

        // 分组循环
        while (i < n) // 外层循环
        {
            int ones = countOne(nums[i]);
            int start = i;
            // 内层循环
            while (i < n && countOne(nums[i]) == ones)
                i++;
            // 循环结束后 nums[start,...,i) 是一个区间
            sort(nums.begin() + start, nums.begin() + i);
        }
        return is_sorted(nums.begin(), nums.end());
    }
    // 辅函数 - 计算 x 在二进制下数位为 1 的数目
    int countOne(int x)
    {
        int count = 0;
        while (x)
        {
            count += x % 2;
            x /= 2;
        }
        return count;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

题目3:3012. 通过操作使数组长度最小

思路

在这里插入图片描述

代码

/*
 * @lc app=leetcode.cn id=3012 lang=cpp
 *
 * [3012] 通过操作使数组长度最小
 */

// @lc code=start
class Solution
{
public:
    int minimumArrayLength(vector<int> &nums)
    {
        int min_x = *min_element(nums.begin(), nums.end());
        for (int &num : nums)
        {
            if (num % min_x)
                return 1;
        }
        return (ranges::count(nums, min_x) + 1) / 2;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是数组 nums 的元素个数。

空间复杂度:O(1)。

题目4:3013. 将数组分成最小总代价的子数组 II

思路

堆 + 滑动窗口。

题解:两个有序集合维护前 k-1 小(Python/Java/C++/Go)

代码

/*
 * @lc app=leetcode.cn id=3013 lang=cpp
 *
 * [3013] 将数组分成最小总代价的子数组 II
 */

// @lc code=start
class Solution
{
public:
    long long minimumCost(vector<int> &nums, int k, int dist)
    {
        k--;
        long long sum = accumulate(nums.begin(), nums.begin() + dist + 2, 0LL);
        multiset<int> L(nums.begin() + 1, nums.begin() + dist + 2), R;

        auto L2R = [&]()
        {
            int x = *L.rbegin();
            sum -= x;
            L.erase(L.find(x));
            R.insert(x);
        };

        auto R2L = [&]()
        {
            int x = *R.begin();
            sum += x;
            R.erase(R.find(x));
            L.insert(x);
        };

        while (L.size() > k)
            L2R();

        long long ans = sum;
        for (int i = dist + 2; i < nums.size(); i++)
        {
            // 移除 out
            int out = nums[i - dist - 1];
            auto it = L.find(out);
            if (it != L.end())
            {
                sum -= out;
                L.erase(it);
            }
            else
                R.erase(R.find(out));

            // 添加 in
            int in = nums[i];
            if (in < *L.rbegin())
            {
                sum += in;
                L.insert(in);
            }
            else
                R.insert(in);

            // 维护大小
            if (L.size() == k - 1)
                R2L();
            else if (L.size() == k + 1)
                L2R();

            ans = min(ans, sum);
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(nlog⁡(dist)),其中 n 为数组 nums 的元素个数。

空间复杂度:O(dist)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1455643.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink介绍

Flink 介绍 文章目录 Flink 介绍1. 简介1.1 背景1.2 用途 2. 核心概念2.1 流&#xff08;Stream&#xff09;2.2 转换&#xff08;Transformation&#xff09;2.3 窗口&#xff08;Window&#xff09;2.4 状态&#xff08;State&#xff09; 3. 编程模型3.1 编程模型介绍3.2 程…

原生微信小程序开发记录

1. 拿到项目 先构建 2.小程序与普通网页开发的区别 网页开发渲染线程和脚本线程是互斥的&#xff0c;这也是为什么长时间的脚本运行可能会导致页面失去响应&#xff0c;而在小程序中&#xff0c;二者是分开的&#xff0c;分别运行在不同的线程中。网页开发者可以使用到各种浏览…

UE5 C++ UObject实例化

一.创建UObject C类 在MyObject中声明结构体FMyDataTableStruct 在MyPawn里面&#xff0c;先将头文件里包含 MyObject.h 在MyPawn中声明一个UMyObject类型的指针 TSubclassOf 是提供 UClass 类型安全性的模板类。例如您在创建一个投射物类&#xff0c;允许设计者指定伤害类型…

单主模式和多主模式切换

1 组复制模式切换注意点 组复制有两种运行模式&#xff0c;一种是单主模式&#xff0c;一种是多主模式。这个模式是在整个组中设置的&#xff0c;由 group_replication_single_primary_mode 这个系统变量指定&#xff0c;而且在所有成员上必须保持一致。ON 表示单主模式&#…

相机图像质量研究(33)常见问题总结:图像处理对成像的影响--锯齿

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有哪些缺点?

虽然使用倒模耳机壳UV树脂胶液制作HIFI耳机隔音降噪耳机壳有很多优点&#xff0c;但也存在一些缺点和需要注意的事项&#xff1a; 技术要求高&#xff1a;制作过程需要一定的技术和经验&#xff0c;如模具制作、树脂混合和填充等。如果没有足够的经验和技巧&#xff0c;可能会…

陇剑杯 2021刷题记录

题目位置&#xff1a;https://www.nssctf.cn/上有 陇剑杯 2021 1. 签到题题目描述分析答案小结 2. jwt问1析1答案小结 问2析2答案小结 问3析3答案 问4析4答案 问5析5答案 问6析6答案 3. webshell问1析1答案 问2析2答案 问3析3答案 1. 签到题 题目描述 此时正在进行的可能是_…

基于51/STM32单片机的智能药盒 物联网定时吃药 药品分类

功能介绍 以51/STM32单片机作为主控系统&#xff1b; LCD1602液晶显示当前时间、温湿度、药品重量 3次吃药时间、药品类目和药品数量 HX711压力采集当前药品重量 红外感应当前药盒是否打开 DS1302时钟芯片显示当前年月日、时分秒、星期 DHT11采集当前环境温度和湿度 …

css2背景

css2背景 一.背景颜色二.背景图片三.背景平铺四.背景图片位置五.背景图像固定六.复合型写法七.背景颜色半透明八.总结 一.背景颜色 默认是transparent(透明&#xff09; 二.背景图片 默认是none 三.背景平铺 默认是background-repeat(平铺&#xff09; 四.背景图片位置…

ZigBee学习——基于AF的数据通信

文章目录 一、简单描述符1.1 简单介绍1.2 简单描述结构体介绍1.3 结构体中的簇1.4 应用场景 二、AF通信原理2.1 通信过程2.2 端点号分类2.3 通信方式2.4 注册简单描述符 三、数据发送API简介3.1 AF层数据发送API3.2 基于AF层封装的通信API3.2.1 点对点通信API3.2.2 广播通信API…

124.乐理基础-五线谱-大三度、小三度

内容参考于&#xff1a;三分钟音乐社 上一个内容&#xff1a;123.乐理基础-五线谱-大二度、小二度、音数-CSDN博客 上一个内容里的练习答案&#xff1a; 大三度、小三度&#xff1a;还是数音数&#xff0c;详情看上一个内容里写的 练习&#xff1a;

mmap映射文件使用示例

mmap 零拷贝技术可以应用于很多场景&#xff0c;其中一个典型的应用场景是网络文件传输。 假设我们需要将一个大文件传输到远程服务器上。在传统的方式下&#xff0c;我们可能需要将文件内容读入内存&#xff0c;然后再将数据从内存复制到网络协议栈中&#xff0c;最终发送到远…

C++Qt:noteBookPro_01

一、创建项目 选择Qt Widgets 常用的是QWidgets和MainWindow。两者的区别&#xff1a; QWidgets用于简单的窗口&#xff0c;没有内置的菜单栏、工具栏和状态栏。适用于简单专用的应用程序&#xff0c;不需要复杂的界面组件。 MainWindow是包含完整的菜单栏、工具栏和状态栏的主…

初始树莓派 + VMware17 安装树莓派(Raspberry Pi 4B/5)

文章目录 树莓派入门 VMware17 安装树莓派(Raspberry Pi 4/5B)前言一、树莓派入门指南&#xff1a;从零开始探索树莓派树莓派4B和5对比 二、在VMware Workstation 17上安装树莓派4B/5操作系统&#xff1a;实现强大性能与便捷模拟工具准备开始安装树莓派1.创建一个虚拟机2. 选择…

<网络安全>《39 网络攻防专业课<第五课 - 常见漏洞利用与修复>》

1 Windows服务器系统入侵流程 1.1 NetBios漏洞攻防 NetBIOS&#xff08;Network Basic Input Output System&#xff0c;网络基本输入/输出系统&#xff09;是一种应用程序接口&#xff08;API&#xff09;&#xff0c;系统可以利用WINS服务、广播及Lmhost文件等多种模式&…

day04-股票K线功能实现

股票K线功能实现 今日目标 1.理解股票T和T-1概念&#xff0c;实现成交量对比功能; 2.理解个股涨跌幅度统计功能; 2.1 分析业务&#xff0c;SQL落地; 2.2 完善不存在数据的区间默认回显功能; 3.理解个股分时线业务&#xff0c;并实现功能; 4.理解个股日K线业务&#xff0c;并实…

2.18作业

作业要求&#xff1a;使用fgets统计给定文件的行数 程序代码&#xff1a; #include<stdlib.h> #include<string.h> #include<stdio.h>int main(int argc, const char *argv[]) {if(argc!2){printf("input file error\n");printf("usage:./a…

爬虫之正则表达式

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 概念&#xff1a; 正则表达式(regular expression)描述了一种字符串匹配的模式&#xff08;pattern&#xff09;&#xff0c;正则匹配是一个模糊的匹配(不是精确匹配) 如下四个方法经常使用&#xff1a; match()search()f…

数据分析师SQL面试准备(part1)

1. SQL 万能框架 2. SQL的书写顺序&#xff0c;跟程序真的执行顺序不同 3. 4. 5. 6. 7. case when utilization 8. 9. 10. 11.

【RL】Monte Carlo Learning(蒙特卡洛学习)

Lecture 5: Monte Carlo Learning The simplest MC-based RL algorithm: MC Basic 理解MC basic算法的关键是理解如何将policy iteration算法迁移到model-free的条件下。 Policy iteration算法在每次迭代过程中有两步&#xff1a; { Policy evaluation: v π k r π k γ…