算法闭关修炼百题计划(四)

仅供个人复习

  • 1.两数相加
  • 2.寻找峰值
  • 6.岛屿的最大面积
  • 3.最大数
  • 4.会议室
  • 5.最长连续序列
  • 6.寻找两个正序数组的中位数

1.两数相加

给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。

请你将两个数相加,并以相同形式返回一个表示和的链表。

你可以假设除了数字 0 之外,这两个数都不会以 0 开头。

/*
因为两个链表都是逆序,相当于个位数在最前面,所以可以直接相加,多余的十位数、百位数 用 temp 记录下来,加到下一个节点
*/
class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {//构建新链表的头节点和尾节点ListNode* head = nullptr;ListNode* tail = nullptr;int tmp = 0; //相加的进位,比如7+8=15,tmp=1while (l1 != nullptr || l2 != nullptr) {int val1 = l1 != nullptr ? l1->val : 0; // l1不为空,取节点的值,为空则取0int val2 = l2 != nullptr ? l2->val : 0;int sum = val1 + val2 + tmp;// 往相加的链表后拼接节点if (head == nullptr) {head = new ListNode(sum % 10);tail = head;} else {tail->next = new ListNode(sum % 10);tail = tail->next;}tmp = sum / 10; //除了个位数,剩下的是进位,放入tmpif (l1 != nullptr) l1 = l1->next;if (l2 != nullptr) l2 = l2->next;}//最后如果 tmp ≠ 0,说明还有进位,需要一个节点存放if (tmp > 0) tail->next = new ListNode(tmp);return head;}
};

2.寻找峰值

峰值元素是指其值严格大于左右相邻值的元素。

给你一个整数数组 nums,找到峰值元素并返回其索引。数组可能包含多个峰值,在这种情况下,返回 任何一个峰值 所在位置即可。

你可以假设 nums[-1] = nums[n] = -∞ 。

你必须实现时间复杂度为 O(log n) 的算法来解决此问题。

二分法,注意mid+1可能越界

class Solution {
public:int findPeakElement(vector<int>& nums) {int L = -1, R = nums.size();if(nums.size() == 1) return 0;while(L + 1 != R){int mid = (L + R) / 2;if(mid == nums.size() - 1){R = nums.size() - 1;break;}if(nums[mid] > nums[mid + 1]) R = mid;else L = mid;}return R;}
};

6.岛屿的最大面积

class Solution {
public:int dir[4][2] = {-1, 0, 0, -1, 1, 0, 0, 1};int count;void dfs(vector<vector<int>>& grid, vector<vector<bool>>& visited, int x, int y){for(int i = 0; i < 4; i ++){int nextx = x + dir[i][0];int nexty = y + dir[i][1];if(nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;if(!visited[nextx][nexty] && grid[nextx][nexty] == 1){visited[nextx][nexty] = true;count++;dfs(grid, visited, nextx, nexty);}}}int maxAreaOfIsland(vector<vector<int>>& grid) {int res = 0;vector<vector<bool>> visited(grid.size(), vector<bool>(grid[0].size(), false));for(int i = 0; i < grid.size(); i ++){for(int j = 0; j < grid[0].size(); j ++){if(grid[i][j] == 1 && !visited[i][j]){count = 1;//每个岛屿重置countvisited[i][j] = true;dfs(grid, visited, i, j);res = max(res, count);}}}return res;}};

3.最大数

给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数。

注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。

class Solution {
public:string largestNumber(vector<int>& nums) {vector<string> str;for(auto i : nums){str.push_back(to_string(i));}auto cmp = [](string left, string right){return left + right > right + left;};sort(str.begin(), str.end(), cmp);string ans = "";for(auto c : str){ans += c;}if(ans[0] == '0') return "0";return ans;}
};

4.会议室

给你一个会议时间安排的数组 intervals ,每个会议时间都会包括开始和结束的时间 intervals[i] = [starti, endi] ,返回 所需会议室的最小数量 。

输入:intervals = [[0,30],[5,10],[15,20]]
输出:2

可以把他理解为上车下车问题
同时在车上最多人数就是需要的会议室数量
在这里插入图片描述
挺巧的这个做法

class Solution {
public:int minMeetingRooms(vector<vector<int>>& intervals) {map<int, int> umap;for(auto it : intervals){umap[it[0]]++;umap[it[1]]--;}int ans = 0, cnt = 0;for(auto itt : umap){cnt += itt.second;ans = max(ans, cnt);}return ans;}
};

用map而不是unordered_map,因为键值对在map中是有序的,即元素按照键的升序排列。用他才能用上车下车的写法。

5.最长连续序列

给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

class Solution {
public:int longestConsecutive(vector<int>& nums) {unordered_set<int> set(nums.begin(), nums.end());int res = 0;for(int num : set){if(set.find(num - 1) != set.end()) continue;//不是第一个就跳过,因为我们要找第一个int curNum = num;int curLen = 1;while(set.find(curNum + 1) != set.end()){curNum += 1;curLen += 1;}res = max(res, curLen);}return res;}
};

6.寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

算法的时间复杂度应该为 O(log (m+n)) 。

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2

碎碎念:除了学然后背还能怎样呢?这篇已经接近终章了,最后应该到不了一百题,剩余不多的时间给自己复习吧,反正都是背,学了没背住就太亏了。

有难度,但可能是因为题解看多了,看懂并不难。。。(笑
简单点来说,要找第k小的,咱每次排除k / 2个元素,两个有序数组,分别找他们的第k/2 - 1个数,比较,较小的那个数所在的数字的第0~k/2-1个数都不可能是答案,所以就排除掉了,这个数字的index++,另一个数组的index怎么办?

首先明确,咱不断比较的是有可能存在答案的数组的前k/2 - 1,没被排除的数组,从下标0开始都有可能,他们的index,仍然是+ k/2 - 1,从index开始的

其次,注意边界问题,假如数组顺序是完全无缝衔接的,那么就会遇到越界问题,越界的时候说明,中位数在另一个数组中,直接加上剩余的k即可

class Solution {
public:int getKthElement(vector<int>& nums1, vector<int>& nums2, int k){int m = nums1.size();int n = nums2.size();int index1 = 0, index2 = 0;while(true){if(index1 == m) return nums2[index2 + k - 1];if(index2 == n) return nums1[index1 + k - 1];if(k == 1) return min(nums1[index1], nums2[index2]);int newIndex1 = min(index1 + k/2 - 1, m - 1);//防止越界int newIndex2 = min(index2 + k/2 - 1, n - 1);int pivot1 = nums1[newIndex1];int pivot2 = nums2[newIndex2];if(pivot1 <= pivot2){k -= newIndex1 - index1 + 1;index1 = newIndex1 + 1;}else{k -= newIndex2 - index2 + 1;index2 = newIndex2 + 1;}}}double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {int totalLength = nums1.size() + nums2.size();if(totalLength % 2 == 1) return getKthElement(nums1, nums2, (totalLength + 1) / 2);else{return (getKthElement(nums1, nums2, totalLength / 2) + getKthElement(nums1, nums2, totalLength / 2 + 1)) / 2.0;}}
};

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

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

相关文章

.NET CORE程序发布IIS后报错误 500.19

发布IIS后浏览时报错误500.19&#xff0c;同时配置文件web.config的路径中也存在问号“?”。 可能原因&#xff1a;没有安装运行时

ViT(Vision Transformer详解)

Transformer作为前沿的深度学习框架&#xff0c;带有多模态的特性&#xff0c;对于不同类型的输入数据&#xff0c;不管是文本还是图像均可进行处理&#xff0c;而ViT则是对于Transformer中的视觉方面&#xff08;也就是输入数据为图像&#xff09;的衍生物&#xff08;因Trans…

MATLAB - 浮动基座机器人的逆运动学

系列文章目录 前言 本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转&#xff0c;具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用&#xff0c;即使用安装在浮动和致动基座上的机械臂在空间操纵物体&#xff0…

k8s 中的金丝雀发布(灰度发布)

目录 1 什么是金丝雀发布 2 Canary 发布方式 3 Canary 两种发布方式实操 3.1 准备工作 3.1.1 将 nginx 命名两个版本 v1 与 v2 3.1.2 暴露端口并指定微服务类型 3.1.3 进入 pod 修改默认发布文件 3.1.4 测试 service 是否正常 3.2 基于权重的灰度发布 3.2.1 创建 Igress 资源类…

MS SQL Server 实战 统计与汇总重复记录

目录 需求 范例运行环境 数据样本设计 功能实现 上传EXCEL文件到数据库 分组统计 SQL 语句 分组汇总 SQL 语句 having 语句过滤最终统计结果 小结 需求 在日常的数据管理应用中&#xff0c;统计和汇总重复记录的情况是经常遇到的一个问题&#xff0c;然后我们会根据统…

谢希仁计算机网络 (四)—— 网络层

计算机网络&#xff08;四&#xff09;—— 网络层&#xff08;1、2&#xff09;&#xff1a;网络层概述、网络层提供的两种服务 计算机网络&#xff08;四&#xff09;—— 网络层&#xff08;1、2&#xff09;&#xff1a;网络层概述、网络层提供的两种服务_以下属于网络层范…

IntelliJ IDEA 2024.2 新特性概览

文章目录 1、重点特性:1.1 改进的 Spring Data JPA 支持1.2 改进的 cron 表达式支持1.3 使用 GraalJS 作为 HTTP 客户端的执行引擎1.4 更快的编码时间1.5 K2 模式下的 Kotlin 性能和稳定性改进 2、用户体验2.1 改进的全行代码补全2.2 新 UI 成为所有用户的默认界面2.3 Search E…

传感器模块编程实践(二)W5500 SPI转以太网模块简介及驱动源码

文章目录 一.概要二.W5500芯片介绍W5500通讯协议介绍 三.W5500模块介绍四.W5500模块原理图五.W5500以太网模通讯实验六.CubeMX工程源代码下载七.小结 一.概要 我们介绍过单片机的以太网系统一般是由&#xff1a;单片机MACPHYRJ45。有些单片机比如STM32F407VET6芯片内部自带MAC…

深度学习:GAN图像生成

GAN的诞生背景 诞生&#xff1a; 2014年由Ian Goodfellow提出 创新性&#xff1a; 无监督学习&#xff1a;GAN 提供了一种新的方法来进行无监督学习&#xff0c;即不需要对训练数据进行标注就可以学习到数据的潜在分布。对抗训练&#xff1a;通过引入对抗机制&#xff0c;G…

pygame--超级马里奥(万字详细版)

超级马里奥点我下载https://github.com/marblexu/PythonSuperMario 1.游戏介绍 小时候的经典游戏&#xff0c;代码参考了github上的项目Mario-Level-1&#xff0c;使用pygame来实现&#xff0c;从中学习到了横版过关游戏实现中的一些处理方法。原项目实现了超级玛丽的第一个小…

iSTFT 完美重构的条件详解

目录 引言1. 短时傅里叶变换&#xff08;STFT&#xff09;与逆变换&#xff08;iSTFT&#xff09;概述2. 完美重构的条件3. 数学推导4. 实现要点5. 示例代码6. 总结 引言 在数字信号处理领域&#xff0c;短时傅里叶变换&#xff08;Short-Time Fourier Transform&#xff0c;简…

鸿蒙next开发者第一课02.DevEcoStudio的使用-习题

【习题】DevEco Studio的使用 通过/及格分80/ 满分100 判断题 1. 如果代码中涉及到一些网络、数据库、传感器等功能的开发&#xff0c;均可使用预览器进行预览。F 正确(True)错误(False) 预览器不能进行传感器等特殊功能的开发,需要使用真机开发 2. module.json5文件中的…

栈与队列面试题(Java数据结构)

前言&#xff1a; 这里举两个典型的例子&#xff0c;实际上该类型的面试题是不确定的&#xff01; 用栈实现队列&#xff1a; 232. 用栈实现队列 - 力扣&#xff08;LeetCode&#xff09; 方法一&#xff1a;双栈 思路 将一个栈当作输入栈&#xff0c;用于压入 push 传入的数…

初始爬虫12(反爬与反反爬)

学到这里&#xff0c;已经可以开始实战项目了&#xff0c;多去爬虫&#xff0c;了解熟悉反爬&#xff0c;然后自己总结出一套方法怎么做。 1.服务器反爬的原因 服务器反爬的原因 总结&#xff1a; 1.爬虫占总PV较高&#xff0c;浪费资源 2.资源被批量抓走&#xff0c;丧失竞争力…

动态规划10:174. 地下城游戏

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;174.…

小米路由器ax1500+DDNS+公网IP+花生壳实现远程访问

有远程办公的需求&#xff0c;以及一些其他东西。 为什么写&#xff1f; ax1500路由器好像没搜到相关信息。以及其中有一点坑。 前置 公网ip Xiaomi路由器 AX1500 MiWiFi 稳定版 1.0.54 实现流程 花生壳申请壳域名https://console.hsk.oray.com/ 这里需要为域名实名认证 …

Linux:进程调度算法和进程地址空间

✨✨✨学习的道路很枯燥&#xff0c;希望我们能并肩走下来! 文章目录 目录 文章目录 前言 一 进程调度算法 1.1 进程队列数据结构 1.2 优先级 ​编辑 1.3 活动队列 ​编辑 1.4 过期队列 1.5 active指针和expired指针 1.6 进程连接 二 进程地址空间 2.1 …

《大规模语言模型从理论到实践》第一轮学习--Fine-tuning微调

第一轮学习目标&#xff1a;了解大模型理论体系 第二轮学习目标&#xff1a;进行具体实操进一步深入理解大模型 从大语言模型的训练过程来理解微调 大预言模型训练主要包含四个阶段&#xff1a;预训练、有监督微调、奖励建模、强化学习。 预训练&#xff08;Pretraining&…

linux中缓存,在kafka上应用总结

linux中的缓存 页缓存 pagecatch&#xff08;读缓存用于提供快速读&#xff09;块缓存&#xff08;用于提供其他设备快速写&#xff09;当对读缓存读的时候&#xff0c;修改了读的数据&#xff0c;页缓存就会被标记为脏数据&#xff0c;等到写的时候它会向块缓存同步数据&…

Redis缓存穿透雪崩击穿及解决

封装缓存空对象解决缓存穿透与逻辑过期解决缓存击穿工具类 Slf4j Component public class CacheClient {private final StringRedisTemplate stringRedisTemplate;public CacheClient(StringRedisTemplate stringRedisTemplate) {this.stringRedisTemplate stringRedisTemplat…