当前位置: 首页 > news >正文

leetcode解题思路分析(一百四十)1201 - 1208 题

  1. 丑数3
    给你四个整数:n 、a 、b 、c ,请你设计一个算法来找出第 n 个丑数。丑数是可以被 a 或 b 或 c 整除的 正整数 。

容斥原理+二分法

class Solution {
public:int nthUglyNumber(int n, int a, int b, int c) {long long ab = lcm((long long)a, (long long)b);long long bc = lcm((long long)b, (long long)c);long long ac = lcm((long long)a, (long long)c);long long abc = lcm((long long)ab, (long long)ac);int left = 1, right = 2e9;auto check = [&](int x) {return n <= (long long) x / a + x / b + x / c - x / ab - x / ac - x / bc + x / abc;};while (left < right) {int mid = left + (right - left) / 2;if (check(mid)) {right = mid;} else {left = mid + 1;}}return left;}
};
  1. 交换字符串中的元素
    给你一个字符串 s,以及该字符串中的一些「索引对」数组 pairs,其中 pairs[i] = [a, b] 表示字符串中的两个索引(编号从 0 开始)。你可以 任意多次交换 在 pairs 中任意一对索引处的字符。返回在经过若干次交换后,s 可以变成的按字典序最小的字符串

看似是字符串,实际是多个Pairs构成的多个子连通图问题。首先用并查集分割,然后遍历字符串将每个索引位置确定在哪个集合中,然后对每个集合排序,最后输出出来

class Solution {
public:int find(vector<int> &parent, int i) {if (parent[i] == i) {return i;}else {parent[i] = find(parent, parent[i]);return parent[i];}}void unify(vector<int> &parent, int i, int j) {parent[find(parent, i)] = find(parent, j);}string smallestStringWithSwaps(string s, vector<vector<int>>& pairs) {int len = s.size();string ans(s);vector<int> parent(len);for (int i = 0; i < len; ++i) {parent[i] = i;}for (int i = 0; i < pairs.size(); ++i) {unify(parent, pairs[i][0], pairs[i][1]);}map<int, priority_queue<char, vector<char>, greater<char>>> charMap;for (int i = 0; i < len; ++i) {charMap[find(parent, i)].push(s[i]);}for (int i = 0; i < len; ++i) {ans[i] = charMap[find(parent, i)].top();charMap[find(parent, i)].pop();}return ans;}
};
  1. 项目管理
    有 n 个项目,每个项目或者不属于任何小组,或者属于 m 个小组之一。group[i] 表示第 i 个项目所属的小组,如果第 i 个项目不属于任何小组,则 group[i] 等于 -1。项目和小组都是从零开始编号的。可能存在小组不负责任何项目,即没有任何项目属于这个小组。
    请你帮忙按要求安排这些项目的进度,并返回排序后的项目列表:
    同一小组的项目,排序后在列表中彼此相邻。
    项目之间存在一定的依赖关系,我们用一个列表 beforeItems 来表示,其中 beforeItems[i] 表示在进行第 i 个项目前(位于第 i 个项目左侧)应该完成的所有项目。
    如果存在多个解决方案,只需要返回其中任意一个即可。如果没有合适的解决方案,就请返回一个 空列表 。

主要是拓扑排序的应用

class Solution {
public:vector<int> topologicalSort(vector<vector<int>> &Adj, vector<int> &Indegree, int n){vector<int> res;queue<int> q;for(int i = 0;i<n;i++){if(Indegree[i]==0){q.push(i);}}while(!q.empty()){int front = q.front();q.pop();res.push_back(front);for(int successor: Adj[front]){Indegree[successor]--;if(Indegree[successor]==0){q.push(successor);}}}if(res.size()==n){return res;}return vector<int>();}vector<int> sortItems(int n, int m, vector<int>& group, vector<vector<int>>& beforeItems) {// 第 1 步:数据预处理,给没有归属于一个组的项目编上组号for(int i=0;i<group.size();i++){if(group[i] == -1){group[i] = m;m++;}}// 第 2 步:实例化组和项目的邻接表vector<vector<int>> groupAdj(m, vector<int>());vector<vector<int>> itemAdj(n, vector<int>());// 第 3 步:建图和统计入度数组vector<int> groupsIndegree(m, 0);vector<int> itemIndegree(n, 0);int len = group.size();for(int i=0;i<len;i++){int currentGroup = group[i];for(int beforeItem: beforeItems[i]){int beforeGroup = group[beforeItem];if(beforeGroup!=currentGroup){groupAdj[beforeGroup].push_back(currentGroup);groupsIndegree[currentGroup]++;}}}for(int i=0;i<n;i++){for(int item: beforeItems[i]){itemAdj[item].push_back(i);itemIndegree[i]++;}}// 第 4 步:得到组和项目的拓扑排序结果vector<int> groupList = topologicalSort(groupAdj, groupsIndegree, m);if(groupList.size()==0){return vector<int> ();}vector<int> itemList = topologicalSort(itemAdj, itemIndegree, n);if(itemList.size()==0){return vector<int> ();}// 第 5 步:根据项目的拓扑排序结果,项目到组的多对一关系,建立组到项目的一对多关系// key:组,value:在同一组的项目列表map<int, vector<int>> group2Items;for(int item: itemList){group2Items[group[item]].push_back(item);}// 第 6 步:把组的拓扑排序结果替换成为项目的拓扑排序结果vector<int> res;for(int groupId: groupList){vector<int> items = group2Items[groupId];for(int item: items){res.push_back(item);}}return res;} 
};
  1. 最后一个能进入电梯的人
    有一群人在等着上公共汽车。然而,巴士有1000 公斤的重量限制,所以可能会有一些人不能上。写一条 SQL 查询语句查找 最后一个 能进入电梯且不超过重量限制的 person_name 。题目确保队列中第一位的人可以进入电梯,不会超重。

将每一条记录的 weight 按照 turn 的顺序和自定义变量相加并生成新的记录。生成临时表并处理。

# Write your MySQL query statement below
SELECT a.person_name
FROM (SELECT person_name, @pre := @pre + weight AS weightFROM Queue, (SELECT @pre := 0) tmpORDER BY turn
) a
WHERE a.weight <= 1000
ORDER BY a.weight DESC
LIMIT 1
  1. 设计跳表
constexpr int MAX_LEVEL = 32;
constexpr double P_FACTOR = 0.25;struct SkiplistNode {int val;vector<SkiplistNode *> forward;SkiplistNode(int _val, int _maxLevel = MAX_LEVEL) : val(_val), forward(_maxLevel, nullptr) {}
};class Skiplist {
private:SkiplistNode * head;int level;mt19937 gen{random_device{}()};uniform_real_distribution<double> dis;public:Skiplist(): head(new SkiplistNode(-1)), level(0), dis(0, 1) {}bool search(int target) {SkiplistNode *curr = this->head;for (int i = level - 1; i >= 0; i--) {/* 找到第 i 层小于且最接近 target 的元素*/while (curr->forward[i] && curr->forward[i]->val < target) {curr = curr->forward[i];}}curr = curr->forward[0];/* 检测当前元素的值是否等于 target */if (curr && curr->val == target) {return true;} return false;}void add(int num) {vector<SkiplistNode *> update(MAX_LEVEL, head);SkiplistNode *curr = this->head;for (int i = level - 1; i >= 0; i--) {/* 找到第 i 层小于且最接近 num 的元素*/while (curr->forward[i] && curr->forward[i]->val < num) {curr = curr->forward[i];}update[i] = curr;}int lv = randomLevel();level = max(level, lv);SkiplistNode *newNode = new SkiplistNode(num, lv);for (int i = 0; i < lv; i++) {/* 对第 i 层的状态进行更新,将当前元素的 forward 指向新的节点 */newNode->forward[i] = update[i]->forward[i];update[i]->forward[i] = newNode;}}bool erase(int num) {vector<SkiplistNode *> update(MAX_LEVEL, nullptr);SkiplistNode *curr = this->head;for (int i = level - 1; i >= 0; i--) {/* 找到第 i 层小于且最接近 num 的元素*/while (curr->forward[i] && curr->forward[i]->val < num) {curr = curr->forward[i];}update[i] = curr;}curr = curr->forward[0];/* 如果值不存在则返回 false */if (!curr || curr->val != num) {return false;}for (int i = 0; i < level; i++) {if (update[i]->forward[i] != curr) {break;}/* 对第 i 层的状态进行更新,将 forward 指向被删除节点的下一跳 */update[i]->forward[i] = curr->forward[i];}delete curr;/* 更新当前的 level */while (level > 1 && head->forward[level - 1] == nullptr) {level--;}return true;}int randomLevel() {int lv = 1;/* 随机生成 lv */while (dis(gen) < P_FACTOR && lv < MAX_LEVEL) {lv++;}return lv;}
};
  1. 独一无二的出现次数
    给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。

两次哈希统计数量就行了

class Solution {
public:bool uniqueOccurrences(vector<int>& arr) {std::unordered_map<int, int> CntMap;std::set<int> OccurSet;std::unordered_map<int, int>::iterator iter;for (auto n: arr){CntMap[n]++;}for (iter = CntMap.begin(); iter != CntMap.end(); ++iter){OccurSet.insert(iter->second);}return OccurSet.size() == CntMap.size();}
};
  1. 尽可能使字符串相等
    给你两个长度相同的字符串,s 和 t。将 s 中的第 i 个字符变到 t 中的第 i 个字符需要 |s[i] - t[i]| 的开销(开销可能为 0),也就是两个字符的 ASCII 码值的差的绝对值。用于变更字符串的最大预算是 maxCost。在转化字符串时,总开销应当小于等于该预算,这也意味着字符串的转化可能是不完全的。如果你可以将 s 的子字符串转化为它在 t 中对应的子字符串,则返回可以转化的最大长度。如果 s 中没有子字符串可以转化成 t 中对应的子字符串,则返回 0。

题意中很重要的一点是只能第i位互换,降低了难度。所以这里可以先求出数组每一位的差值,diff[]。然后采用滑动窗口的方式去找寻满足maxCost以内的最大窗口。

class Solution {
public:int equalSubstring(string s, string t, int maxCost) {int n = s.length();vector<int> diff(n, 0);for (int i = 0; i < n; i++) {diff[i] = abs(s[i] - t[i]);}int maxLength = 0;int start = 0, end = 0;int sum = 0;while (end < n) {sum += diff[end];while (sum > maxCost) {sum -= diff[start];start++;}maxLength = max(maxLength, end - start + 1);end++;}return maxLength;}
};

相关文章:

leetcode解题思路分析(一百四十)1201 - 1208 题

丑数3 给你四个整数&#xff1a;n 、a 、b 、c &#xff0c;请你设计一个算法来找出第 n 个丑数。丑数是可以被 a 或 b 或 c 整除的 正整数 。 容斥原理二分法 class Solution { public:int nthUglyNumber(int n, int a, int b, int c) {long long ab lcm((long long)a, (lo…...

FPGA设计的指导性原则 (一)

这一部分主要介绍FPGA/CPLD设计的指导性原则,如FPGA设计的基本原则、基本设 计思想、基本操作技巧、常用模块等。FPGA/CPLD设计的基本原则、思想、技巧和常用模 块是一个非常大的问题,在此不可能面面俱到,只能我们公司项目中常用的一些设计原则与 方法提纲携领地加以介绍,希…...

【架构】常见技术点--服务治理

导读&#xff1a;收集常见架构技术点&#xff0c;作为项目经理了解这些知识点以及解决具体场景是很有必要的。技术要服务业务&#xff0c;技术跟业务具体结合才能发挥技术的价值。 目录 1. 微服务 2. 服务发现 3. 流量削峰 4. 版本兼容 5. 过载保护 6. 服务熔断 7. 服务…...

手撕数据结构—单链表

✅作者&#xff1a;简单^不简单 &#x1f525;系列专栏&#xff1a;C语言数据结构 &#x1f496;如果文章有错误&#xff0c;时刻欢迎大家的指正。当然觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4ac;格言&#xff1a;希望我…...

Benewake(北醒) 快速实现 TF02-i-RS485 与电脑通信操作说明

目录 一、前言二、工具准备1. USB-RS485 转接器2. TF02-i-RS4853. 兆信直流电源4.连接线、绝缘胶带、螺丝刀5. PC&#xff1a;Windows 系统6. 串口助手软件 三、连接方式1. USB-RS485 转接板接口说明2. TF02-i-RS485 引脚定义3. 连接图 四、TF02-i-RS485 与电脑通信操作说明1. …...

【分享】科大讯飞星火认知大模型(初体验)

前言&#xff1a; 哈喽&#xff0c;大家好&#xff0c;我是木易巷~ 随着人工智能技术的迅猛发展&#xff0c;自然语言处理&#xff08;NLP&#xff09;成为了热门话题。在众多NLP模型中&#xff0c;科大讯飞星火认知大模型成为了一个备受瞩目的新秀&#xff0c;今天我们来了解…...

logstash 采集应用日志切割问题

1.logstash [oswatch@rce1 conf]$ cat test.conf input { file { path=>["/tmp/test/test.log*"] } } output { stdout { codec=>rubydebug{} } } 2.python脚本: [oswatch@rce1 conf]$ cat t1.py #!/usr/bin/python # -*- coding: UTF-…...

计算机网络实验:认识Packet Tracer软件

目录 前言实验目的实验内容及要求相关知识点实验指导实验过程总结 前言 计算机网络是当今信息技术的重要组成部分&#xff0c;它涉及到多种硬件和软件的协同工作&#xff0c;以实现数据的传输和交换。为了更好地理解和掌握计算机网络的基本原理和技术&#xff0c;我们需要进行…...

【MySQL新手到通关】第六章 时间日期函数

文章目录 1.获取日期时间函数1.1 获取当前日期时间1.2 获取当前日期1.3 获取当前时间 2.日期格式化★★★2.1 日期转指定格式字符串2.2 字符串转日期 3.日期间隔3.1 增加日期间隔 ★★★3.2 减去一个时间间隔★★★3.3 日期相差天数&#xff08;天&#xff09;3.4 相差时间&…...

深蓝学院C++基础笔记 第 1 章 C++初探

第 1 章 C初探 1&#xff0e;从Hello World 谈起 Hello World: #include <iostream> int mian() { std::cout << "Hello World!" << std::endl; }函数: 一段能被反复调用的代码&#xff0c;可以接收输入&#xff0c;进行处理并(或)产生输出-返回…...

【配电网重构】基于混合整数二阶锥配电网重构研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

Kubernetes mysql 实战以及外部存储处理 [一]

在 Kubernetes 中部署 MySQL 数据库需要考虑以下几个方面: 部署方式:可以选择使用 StatefulSet 或者 Deployment 进行部署,如果需要有状态的服务,使用 StatefulSet 更加合适。存储:MySQL 需要一个持久化存储来保存数据。可以使用 Kubernetes 提供的 PersistentVolumeClaim…...

使用【Python+Appium】实现自动化测试

一、环境准备 1.脚本语言&#xff1a;Python3.x IDE&#xff1a;安装Pycharm 2.安装Java JDK 、Android SDK 3.adb环境&#xff0c;path添加E:\Software\Android_SDK\platform-tools 4.安装Appium for windows&#xff0c;官网地址 Redirecting 点击下载按钮会到GitHub的…...

位图和布隆过滤器

位图和布隆过滤器 位图的概念位图的简单模拟实现位图set位图reset位图test 位图总的代码和实现位图的应用布隆过滤器布隆过滤器的简单实现相关操作讨论布隆过滤器的结构设计布隆过滤器插入布隆过滤器查找 布隆过滤器总代码 布隆过滤器优点和缺陷海量数据面试题哈希切割位图应用…...

Eclipse 教程Ⅳ

Eclipse 工作空间(Workspace) eclipse 工作空间包含以下资源&#xff1a; 项目文件文件夹 项目启动时一般可以设置工作空间&#xff0c;你可以将其设置为默认工作空间&#xff0c;下次启动后无需再配置&#xff1a; 工作空间(Workspace)有明显的层次结构。 项目在最顶级&…...

Webpack搭建本地服务器

1 开启本地服务器 2 HMR热模块替换 3 devServer配置 4 开发和生成环境 需要本地服务的目的就在每次我们保存项目源文件的时候都可以自动打包新的打包文件&#xff0c; 这里主要讲webpack-dev-server&#xff1a; 先安装&#xff1a; npm install webpack-dev-server -D 需要…...

基于Go开发PaaS平台3

Go开发PaaS平台核心功能 代码仓库地址GitHub - yunixiangfeng/gopaas 10-18 中间件前端页面以及核心API开发&#xff08;中&#xff09; C:\Users\Administrator\Desktop\gopaas\middlewareapi\handler\middlewareApiHandler.go package handlerimport ("context"…...

虎牙直播在微服务改造的实践总结

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…...

设置线程池的大小

线程池的理想大小取决于被提交任务的类型以及所部署系统的特性。在代码中通常不会固定线程池的大小,而应该通过某种配置机制来提供,或者根据Runtime. availableProcessors来动态计算。 幸运的是&#xff0c;要设置线程池的大小也并不困难&#xff0c;只需要避免“过大”和“过…...

Vue3 除了 keep-alive,还有哪些实现页面缓存的方法

有这么一个需求&#xff1a;列表页进入详情页后&#xff0c;切换回列表页&#xff0c;需要对列表页进行缓存&#xff0c;如果从首页进入列表页&#xff0c;就要重新加载列表页。 对于这个需求&#xff0c;我的第一个想法就是使用keep-alive来缓存列表页&#xff0c;列表和详情…...

python打卡day49

知识点回顾&#xff1a; 通道注意力模块复习空间注意力模块CBAM的定义 作业&#xff1a;尝试对今天的模型检查参数数目&#xff0c;并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

Oracle查询表空间大小

1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

通过Wrangler CLI在worker中创建数据库和表

官方使用文档&#xff1a;Getting started Cloudflare D1 docs 创建数据库 在命令行中执行完成之后&#xff0c;会在本地和远程创建数据库&#xff1a; npx wranglerlatest d1 create prod-d1-tutorial 在cf中就可以看到数据库&#xff1a; 现在&#xff0c;您的Cloudfla…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

css的定位(position)详解:相对定位 绝对定位 固定定位

在 CSS 中&#xff0c;元素的定位通过 position 属性控制&#xff0c;共有 5 种定位模式&#xff1a;static&#xff08;静态定位&#xff09;、relative&#xff08;相对定位&#xff09;、absolute&#xff08;绝对定位&#xff09;、fixed&#xff08;固定定位&#xff09;和…...

C++中string流知识详解和示例

一、概览与类体系 C 提供三种基于内存字符串的流&#xff0c;定义在 <sstream> 中&#xff1a; std::istringstream&#xff1a;输入流&#xff0c;从已有字符串中读取并解析。std::ostringstream&#xff1a;输出流&#xff0c;向内部缓冲区写入内容&#xff0c;最终取…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...