当前位置: 首页 > 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;列表和详情…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面

代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口&#xff08;适配服务端返回 Token&#xff09; export const login async (code, avatar) > {const res await http…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

在Mathematica中实现Newton-Raphson迭代的收敛时间算法(一般三次多项式)

考察一般的三次多项式&#xff0c;以r为参数&#xff1a; p[z_, r_] : z^3 (r - 1) z - r; roots[r_] : z /. Solve[p[z, r] 0, z]&#xff1b; 此多项式的根为&#xff1a; 尽管看起来这个多项式是特殊的&#xff0c;其实一般的三次多项式都是可以通过线性变换化为这个形式…...

[大语言模型]在个人电脑上部署ollama 并进行管理,最后配置AI程序开发助手.

ollama官网: 下载 https://ollama.com/ 安装 查看可以使用的模型 https://ollama.com/search 例如 https://ollama.com/library/deepseek-r1/tags # deepseek-r1:7bollama pull deepseek-r1:7b改token数量为409622 16384 ollama命令说明 ollama serve #&#xff1a…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...