Leetcode 第 366 场周赛题解

Leetcode 第 366 场周赛题解

  • Leetcode 第 366 场周赛题解
    • 题目1:2894. 分类求和并作差
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:2895. 最小处理时间
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:2896. 执行操作使两个字符串相等
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:2897. 对数组执行操作使平方和最大
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 366 场周赛题解

题目1:2894. 分类求和并作差

思路

模拟

代码

/** @lc app=leetcode.cn id=2894 lang=cpp** [2894] 分类求和并作差*/// @lc code=start
// class Solution
// {
// public:
//     int differenceOfSums(int n, int m)
//     {
//         int num1 = 0, num2 = 0;
//         for (int i = 1; i <= n; i++)
//         {
//             if (i % m == 0)
//                 num2 += i;
//             else
//                 num1 += i;
//         }
//         return num1 - num2;
//     }
// };class Solution
{
public:int differenceOfSums(int n, int m){// total = num1 + num2// ans = num1 - num2 = total - 2 * num2int num = 0;for (int i = 1; i <= n; i++)if (i % m == 0)num += i;return (1 + n) * n / 2 - 2 * num;}
};
// @lc code=end

one-line code:

return n * (n + 1) / 2 - n / m * (n / m + 1) * m;

复杂度分析

时间复杂度:O(n)。

空间复杂度:O(1)。

题目2:2895. 最小处理时间

思路

贪心。

直觉上来说,最早空闲时间越大的处理器,处理 tasks 越小的任务,那么完成时间越早。

我们可以把 processorTime 从小到大排序,tasks 从大到小排序,那么答案就是 processorTime[i] + tasks[4 * i] 的最大值。

代码

/** @lc app=leetcode.cn id=2895 lang=cpp** [2895] 最小处理时间*/// @lc code=start
class Solution
{
public:int minProcessingTime(vector<int> &processorTime, vector<int> &tasks){int n = processorTime.size();int min_time = INT_MIN;sort(processorTime.begin(), processorTime.end());sort(tasks.begin(), tasks.end(), greater<int>());for (int i = 0; i < n; i++){int process_max_time = processorTime[i] + tasks[4 * i];min_time = max(min_time, process_max_time);}return min_time;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogn),其中 n 为数组 processorTime 的长度。

空间复杂度:O(1)。

题目3:2896. 执行操作使两个字符串相等

思路

两种操作都不会改变字符串中 1 和 0 的个数的奇偶性。

特判:

  1. s1 == s2,无需操作,返回0。
  2. s1中1的个数的奇偶性不等于s2中1的个数的奇偶性,无法让二者相等,返回-1。

遍历两个字符串,将字符不同的索引保存在数组 pos 中。

若字符不同的索引数为 pos.size(),那么有 pos.size()/2 对字符需要进行翻转。我们先只考虑操作一,将每两个下标都进行操作一翻转,那么总的操作代价为 x∗pos.size()/2。

然后遍历数组 pos,查看两个相邻下标进行操作二的翻转是否比进行操作一的翻转所需要的代价还小。如果还小,则把答案更新为两个相邻下标进行操作二翻转时的代价。

当一个下标和相邻的下标进行操作二翻转时,它只和前面的下标或者后面的下标组成一对进行翻转,但不能和前面的下标和后面的下标同时进行翻转。

在下面的代码中,cur 表示的是当前下标和前面下标不做操作二时的最优解,pre 表示前一个下标和前前一个下标不做操作二翻转时的最优解, pre+pos[i]−pos[i−1]−x 表示前一个下标和前前一个下标不做操作二翻转但和当前下标做操作二翻转时的最优解。

代码

/** @lc app=leetcode.cn id=2896 lang=cpp** [2896] 执行操作使两个字符串相等*/// @lc code=start
class Solution
{
public:int minOperations(string s1, string s2, int x){// 特判if (s1 == s2)return 0;if (count(s1.begin(), s1.end(), '1') % 2 != count(s2.begin(), s2.end(), '1') % 2)return -1;int n = s1.size();vector<int> pos;for (int i = 0; i < n; i++)if (s1[i] != s2[i])pos.push_back(i);int cur = pos.size() / 2 * x, pre = cur;for (int i = 1; i < pos.size(); i++){int next = min(cur, pre + pos[i] - pos[i - 1] - x);pre = cur;cur = next;}return cur;}
};
// @lc code=end

复杂度分析

时间复杂度:O(n),其中 n 是字符串 s1 的长度。

空间复杂度:O(n),其中 n 是字符串 s1 的长度。

题目4:2897. 对数组执行操作使平方和最大

思路

位运算+贪心

考虑两个数 a 和 b 的二进制表示,讨论二进制第 i 位在 a 和 b 中是否为 1 的情况:

  • 若 a 和 b 的第 i 位都是 0,那么 a AND b 和 a OR b 的第 i 位也都是 0。
  • 若 a 和 b 的第 i 位恰有一个 1,那么 a AND b 的第 i 位是 0,a OR b 的第 i 位是 1。
  • 若 a 和 b 的第 i 位都是 1,那么 a AND b 和 a OR b 的第 i 位也都是 1。

所以操作等价于:把一个数的 0 和另一个数的同一个比特位上的 1 交换。

令 f(a) 表示 a 的二进制表示中有几个 1。

我们发现:f(a) + f(b) = f(a AND b) + f(a OR b)。只不过所有的 1 首先都被 a OR b “抢”了,剩下的 1 才会留给 a AND b。也就是说,每个二进制位中,1 的总数不变。我们可以通过任意次操作,把 1 都集中在某个数里。

设交换前两个数是 x 和 y(x > y),把小的数上的 1 给大的数,假设交换后 x 增加了 d,那么 y 也减少了 d。

交换前:x2+y2

交换后:(x+d)2+(y-d)2=x2+y2+2d(x-y)+2d2>x2+y2

这说明应该通过交换,让一个数越大越好。

相当于把 1 都聚集在一个数中,比分散到不同的数更好。

因此做法就是统计每个二进制位里有多少 1,然后每次用这些 1 拼出尽可能大的数即可。

代码

/** @lc app=leetcode.cn id=2897 lang=cpp** [2897] 对数组执行操作使平方和最大*/// @lc code=start
class Solution
{
private:const int MOD = 1e9 + 7;public:int maxSum(vector<int> &nums, int k){vector<int> count(32, 0);for (const int num : nums){for (int i = 0; i < 32; i++)count[i] += (num >> i) & 01;}long long ans = 0;for (int i = 0; i < k; i++){int x = 0;for (int i = 0; i < 32; i++)if (count[i] > 0){x += 1 << i;count[i]--;}ans = (ans + (long long)x * x) % MOD;}return ans;}
};
// @lc code=end

复杂度分析

时间复杂度:O(nlogU),其中 n 为数组 nums 的长度,U 为数组 nums 的最大值。

空间复杂度:O(logU),其中 U 为数组 nums 的最大值。

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

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

相关文章

【Java基础面试四十六】、 List<? super T>和List<? extends T>有什么区别?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;问题 参考答案&#x…

计算机算法分析与设计(15)---贪心算法(虚拟汽车加油问题和最优分解问题)

文章目录 一、虚拟汽车加油问题1.1 问题描述1.2 思路分析1.3 代码编写 二、最优分解问题2.1 问题描述2.2 思路分析2.3 代码编写 一、虚拟汽车加油问题 1.1 问题描述 一辆虚拟汽车加满油后可行驶 n n n km。旅途中有若干加油站。设计一个有效算法&#xff0c;指出应在哪些加油…

MyBatisPlus实现连表操作、批量处理

1、实现连表查询 正常来说单靠mybatisplus无法实现连表查询&#xff0c;只能靠单表sql然后进行拼接形成连表查询&#xff0c;或者使用xml文件去编写sql语句来实现连表查询。但他又给我们提供了一个插件MyBatis-Plus-Join&#xff0c;用来弥补mybatisplus再连表上的不足&#…

Apache Jmeter测压工具快速入门

Jmeter测压工具快速入门 一、Jmeter介绍二、Jmeter On Mac2.1 下载2.2 安装2.2.1 环境配置2.2.2 初始化设置 2.3 测试2.3.1 创建JDBC Connection Configuration2.3.2 创建线程组2.3.3 创建JDBC Request2.3.4 创建结果监控2.3.5 运行结果 2.4 问题记录2.4.1 VM option UseG1GC异…

【C语言】每日一题(旋转数组)

旋转数组&#xff0c;链接奉上 目录 方法:创建额外的数组&#xff1a;整体思路&#xff1a;代码实现&#xff1a; 数组反转&#xff1a;整体思路&#xff1a;代码实现&#xff1a;小插曲&#xff1a; 方法: 创建额外的数组&#xff1a; 整体思路&#xff1a; 创建一个额外的…

PJSIP 2.7.2对G.729的支持,编译bcg729步骤

PJSIP 2.7.2对G.729的支持&#xff0c;编译bcg729步骤 下载BCG729源码升级cmake编译BCG729编译pjsip2.7.2 pjsua测试 下载BCG729源码 git clone git://git.linphone.org/bcg729.git升级cmake 注&#xff1a;编译BCG729要求cmake版本大于3.0&#xff0c;如果版本已经达到要求&…

oracle实现搜索不区分大小写

<if test"code ! null and code ! ">and upper(code) like upper(%${code}%) </if>关键字upper

51单片机的时钟系统

1.简介 51内置的时钟系统可以用来计时&#xff0c;与主程序分割开来&#xff0c;在计时过程中不会终端主程序&#xff0c;还可以通过开启时钟中断来执行相应的操作。 2.单片机工作方式 单片机内部有两个十六位的定时器T0和T1。每个定时器有两种工作方式选择&#xff0c;分别…

Redis-Sentinel高可用架构学习

Redis-Sentinel高可用架构 Redis主从复制过程&#xff1a; 主从同步原理 Redis Sentinel&#xff08;哨兵&#xff09;高可用集群方案&#xff1a;Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案。 当用Redis做Master-slave的高可用方案时&#xff0c;假如master宕机了…

STM32F4_照相机

目录 前言 1. BMP编码 2. JPEG编码 前言 我们所要实现的照相机&#xff0c;支持BMP图片格式的照片和JPEG图片格式的照片。 1. BMP编码 BMP文件是由文件头、位图信息头、颜色信息和图形数据四部分构成。 1. BMP文件头&#xff08;14个字节&#xff09;&#xff1a;BMP文件…

numpy矩阵画框框

在n>5(n是奇数)的nn数组中&#xff0c;用*画外方框和内接菱形。 (本笔记适合熟悉numpy的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a;大咖免费“圣经”教程《 python 完全自学教程》&#xff0c;不仅仅是基础那…

c++中的继承

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、继承的概念及定义1、继承的概念2、继承的定义2.1 定义格式2.2 继承关系和访问限定符2.3 继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承…

【SA8295P 源码分析 (四)】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析

【SA8295P 源码分析】26 - QNX Ethernet MAC 驱动 之 emac_rx_thread_handler 数据接收线程 源码分析 一、emac_rx_thread_handler():通过POLL 轮询方式获取数据二、emac_rx_poll_mq():调用 pdata->clean_rx() 来处理消息三、emac_configure_rx_fun_ptr():配置 pdata->…

【27】c++设计模式——>迭代器模式(遍历双向链表)(2)

//实现双向链表 #pragma once #include<iostream> #include<string> #include<vector> using namespace std;class Iterator; class ForwardIterator; class ReverseIterator;//链表的最小组成部分是一个节点&#xff0c;先实现一个节点 struct Node //c中st…

在Espressif-IDE中使用Wokwi仿真ESP32

陈拓 2023/10/17-2023/10/19 1. 概述 在Espressif-IDE v2.9.0版本之后可直接在IDE中使用Wokwi模拟器。 1.1 什么是 Wokwi 模拟器&#xff1f; Wokwi 是一款在线电子模拟器&#xff0c;支持模拟各种开发板、元器件和传感器&#xff0c;例如乐鑫产品 ESP32。 Wokwi 提供基于浏…

【单元测试】--工具与环境

一、单元测试工具概览 1.1 JUnit JUnit 是一个广泛用于 Java 程序开发的开源测试框架。它是单元测试的标准工具之一&#xff0c;用于编写和运行测试用例&#xff0c;以确保 Java 程序的各个组件按预期工作。以下是一些关键特点和概念&#xff0c;来介绍 JUnit&#xff1a; 注…

深度学习笔记_5 经典卷积神经网络LeNet-5 解决MNIST数据集

1、定义LeNet-5模型&#xff0c;包括卷积层和全连接层。 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms# 导入必要的库# 定义 LeNet-5 模型 class LeNet5(nn.Module):def __init__(self):super(LeNet5, self…

xxl-job学习

学习链接 xxl-job官方文档 【分布式任务调度】三、XXL-JOB详细介绍 xxljob从入门到精通-全网段最全解说 XXL-JOB分布式任务调度框架(一)-基础入门 XXL-JOB分布式任务调度框架(二)-策略详解 XXL-JOB分布式任务调度框架(三)-集群部署 XXL-JOB分布式任务调度框架(四)-源码分析…

C语言每日一题(16) 消失的数字

题目链接 一.题目描述 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 二.题目分析 方法1 异或法 基于异或的思想&#xff0c;将0与数组中的数一一进行异或后得到的值&#xff0c;再与0…

行为型模式-备忘录模式

备忘录模式保存一个对象的某个状态&#xff0c;以便在适当的时候恢复对象。备忘录模式属于行为型模式。 意图&#xff1a;在不破坏封装性的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态。 主要解决&#xff1a;所谓备忘录模式就是在不破坏…