2024.06.19 刷题日记

41. 缺失的第一个正数

这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N+1] 中。

这个结论并不好想,举个例子:nums = [3,4,-1,1],长度为 4,未出现的最小正数是 2;极端一点,nums = [1,2,3,4],未出现的最小正数是 5。因此算法的第一步就是预处理,将这个范围之外的数全部标记掉:

		for (int& num : nums) {if (num <= 0 || num > n) {num = n + 1;}}

对于 nums = [3,4,-1,1],操作之后,nums = [3,4,5,1]

第二步,需要将符合条件的数,放到它标记到应该呆的位置上,标记方法是取反,比如 1,就放到第一个位置 0,将每一个数操作一遍:

		for (int i = 0; i < n; ++i) {int pos = abs(nums[i]) - 1; // 计算原始数字对应的索引if (pos < n && nums[pos] > 0) { // 只有在正常范围内的数才进行放置nums[pos] =-nums[pos]; // 通过取负值来标记这个位置的数字已经存在}}

对于 nums = [3,4,5,1],操作之后,nums = [3,4,-5,1]nums = [3,4,-5,-1]nums = [3,4,-5,-1](不变)、nums = [-3,4,-5,-1]。经过这轮操作之后,会发现,第二个数没有被标记,因此数组中没有 2,因此将 2 返回:

		for (int i = 0; i < n; ++i) {if (nums[i] > 0) {return i + 1; // 返回缺失的第一个正数}}return n + 1; // 如果1到n都存在,那么返回n+1

73. 矩阵置零

这道题目的思路是,首先判断第一行或者第一列是否有 0 元素:

		bool firstRowZero = false;bool firstColZero = false;for (int i = 0; i < m; i++) {if (matrix[i][0] == 0) {firstColZero = true;break;}}for (int j = 0; j < n; j++) {if (matrix[0][j] == 0) {firstRowZero = true;break;}}

然后根据非第一列非第一行得元素是否为零,标记第一列或者第一行:

 		for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][j] == 0) {matrix[i][0] = 0;matrix[0][j] = 0;}}}

当第一行或者第一列被标记了,就可以根据这个信息来标记其它元素了:

		for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (matrix[i][0] == 0 || matrix[0][j] == 0) {matrix[i][j] = 0;}}}

最后根据flags 置第一行第一列元素为 0:

		if (firstColZero) {for (int i = 0; i < m; i++) {matrix[i][0] = 0;}}if (firstRowZero) {for (int j = 0; j < n; j++) {matrix[0][j] = 0;}}

48. 旋转图像

这个题目的思路是先转置,然后反转每一行:

class Solution {
public:void rotate(vector<vector<int>>& matrix) {int n = matrix.size();// 转置矩阵for (int i = 0; i < n; ++i) {for (int j = i; j < n; ++j) {swap(matrix[i][j], matrix[j][i]);}}// 反转每一行for (int i = 0; i < n; ++i) {reverse(matrix[i].begin(), matrix[i].end());}}
};

240. 搜索二维矩阵 II

我以为这道题要从左上角开始搜索,后来才发现必须通过右上或者坐下,因为这两个方向中,元素单调性是相反的,单调性如果相同,是没办法排除的:

class Solution {
public:bool searchMatrix(vector<vector<int>>& matrix, int target) {if (matrix.empty() || matrix[0].empty())return false;int m = matrix.size();int n = matrix[0].size();int i = 0, j = n - 1;while (i < m && j >= 0) {if (matrix[i][j] == target) {return true;} else if (matrix[i][j] > target) {j--; } else {i++; }}return false; }
};

160. 相交链表

这道题目简单,直接双指针,因为 A+B = B+A,它们这样运行一圈后,必然会相交:

class Solution {
public:ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {if (headA == NULL || headB == NULL)return NULL;ListNode* pA = headA;ListNode* pB = headB;while (pA != pB) {// 如果达到末尾,则转向另一链表的头部pA = pA == NULL ? headB : pA->next;pB = pB == NULL ? headA : pB->next;}// 若相遇,则 pA 或 pB 为交点,或两者均为 NULL,未相交return pA;}
};

206. 反转链表

这个题目用两种解法,递归和迭代:

class Solution {
public:ListNode* reverseList(ListNode* head) {// 递归// if(head ==  nullptr || head->next == nullptr)// return head;// ListNode *newNode = reverseList(head->next);// head->next->next = head;// head->next = nullptr;// return newNode;// 迭代ListNode* prev = nullptr; // 前一个结点ListNode* curr = head;    // 遍历ListNode* next = nullptr; // 存储下一个结点while (curr != nullptr) {next = curr->next; // 存储下一个结点curr->next = prev; // 反转当前prev = curr;       // 移动curr = next;       // 移动}return prev;}
};

234. 回文链表

这个题目能用到上面的解法,先用快慢指针找到中点,然后反转后面的链表,然后双指针从两边向中心靠近且比较:

class Solution {
public:bool isPalindrome(ListNode* head) {if (head == nullptr || head->next == nullptr)return true;ListNode *slow = head, *fast = head, *prev = nullptr, *next = nullptr;while (fast != nullptr && fast->next != nullptr) {fast = fast->next->next;slow = slow->next;}while (slow != nullptr) {next = slow->next;slow->next = prev;prev = slow;slow = next;}ListNode* left = head;ListNode* right = prev;while (right != nullptr) {if (left->val != right->val)return false;left = left->next;right = right->next;}return true;}
};

141. 环形链表

快慢指针:

	bool hasCycle(ListNode* head) {ListNode *fast = head, *slow = head;while (fast != nullptr && slow != nullptr) {fast = fast->next;if (fast == nullptr)return false;fast = fast->next;slow = slow->next;if (slow == fast)return true;}return false;}

142. 环形链表 II

这个用哈希表简直是降维打击:

	ListNode *detectCycle(ListNode *head) {unordered_set<ListNode *> visited;while (head != nullptr) {if (visited.count(head)) {return head;}visited.insert(head);head = head->next;}return nullptr;}

21. 合并两个有序链表

使用一个伪头结点,然后将所有的结点挂在这个结点上:

class Solution {
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode dummy(0); ListNode* tail = &dummy; // 使用一个尾指针,始终指向新链表的最后一个节点while (list1 && list2) {if (list1->val < list2->val) {tail->next = list1;  // 接上 list1 的当前节点list1 = list1->next; // 移动 list1 指针} else {tail->next = list2;  // 接上 list2 的当前节点list2 = list2->next; // 移动 list2 指针}tail = tail->next; // 移动尾指针到新链表的末尾}tail->next = list1 ? list1 : list2;return dummy.next; }
};

总结

41. 缺失的第一个正数

  • 利用索引作为哈希键通过元素取反来标记存在的数字,有效利用数组自身空间来存储信息。
  • 确保处理后的数组中,每个数字都在其应有的位置上,没有则是缺失的最小正数。

73. 矩阵置零

  • 使用矩阵的第一行和第一列作为标记数组,记录哪些行列需要被置零。
  • 分步处理,先标记,后置零,注意操作的顺序和逻辑清晰。

48. 旋转图像

  • 先转置矩阵,然后反转每一行,是一种简洁的在原地操作矩阵的方法,符合题目要求的空间复杂度。

240. 搜索二维矩阵 II

  • 从右上角(或左下角)开始搜索,利用行和列的单调性来排除行或列,这种策略提高了搜索效率。

160. 相交链表

  • 双指针法,一个从链表A出发到链表B,另一个从链表B出发到链表A,两者会在交点相遇。
  • 由于路径长度相同(A+B=B+A),所以两指针会同时到达交点。

206. 反转链表

  • 迭代和递归两种方式,迭代方式通过交换指针方向在原地反转链表,而递归则是通过递归栈来实现。

234. 回文链表

  • 快慢指针找到中点,反转后半部分,然后前后两部分进行比对。
  • 这种方法充分利用了链表的特性,减少了空间复杂度。

141. 环形链表

  • 快慢指针法检测环,快指针每次走两步,慢指针每次走一步,如果相遇则说明有环。

142. 环形链表 II

  • 使用哈希表记录访问过的节点,第一个重复访问的节点即为环的入口。
  • 或者使用快慢指针确定环的存在后,用两个指针从头和相遇点出发,第二次相遇点即为环的入口。

21. 合并两个有序链表

  • 使用一个伪头节点简化边界情况的处理,通过比较两链表头部节点的值,依次选择较小的节点拼接到新链表上。

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

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

相关文章

移动硬盘在苹果电脑上无法识别的诊断与恢复策略

一、问题描述 在数字时代&#xff0c;移动硬盘已成为我们存储和传输数据的重要工具。然而&#xff0c;当我们将移动硬盘插入苹果电脑时&#xff0c;有时会遇到无法识别的情况&#xff0c;这让我们感到十分困扰。本文将详细探讨移动硬盘插苹果电脑后读不出来的现象&#xff0c;…

浸没式液冷服务器的换热效率及节能潜力分析

服务器浸没式液冷的换热效率及节能潜力 摘要&#xff1a;我们针对服务器浸没式液冷实验台进行了深入测试&#xff0c;探究了不同室外温度和服务器发热功率对系统制冷PUE的影响。实验数据显示&#xff0c;该系统的制冷PUE值介于1.05至1.28之间&#xff0c;高效节能特点显著。 在…

坚持刷题|反转链表

文章目录 题目思考实现1. 迭代方式实现链表翻转2. 递归方式实现链表翻转 Hello&#xff0c;大家好&#xff0c;我是阿月。坚持刷题&#xff0c;老年痴呆追不上我&#xff0c;今天继续链表&#xff1a;反转链表 题目 LCR 024. 反转链表 思考 翻转链表是一个常见的算法问题&a…

为什么带上符号位计算,仍然可以算出正负数对应的补码

文章目录 &#x1f680;前言&#x1f680; 为什么要引入原反补码✈️ 利用加法表示减法✈️ 关于数字在计算机中的存储&#x1f680; 数学解释 &#x1f680; 为什么带上符号位计算&#xff0c;仍然可以算出正负数对应的补码 &#x1f680;前言 为应付期末&#xff0c;速成数电…

Linux系统之配置Nginx负载均衡

Linux系统之配置Nginx负载均衡 一、Nginx介绍1.1 Nginx简介1.2 Nginx反向代理1.3 相关概念二、本次实践介绍2.1 本次实践简介2.2 本次实践环境规划三、部署两台web服务器3.1 运行两个Docker容器3.2 编辑测试文件四、配置负载均衡4.1 安装nginx软件4.2 编辑nginx配置文件4.3 启动…

基于PHP的奶茶商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的奶茶商城系统 一 介绍 此奶茶商城系统基于原生PHP开发&#xff0c;数据库mysql&#xff0c;ajax实现数据交换。系统角色分为用户和管理员。系统在原有基础上添加了糖度的选择。 技术栈 phpmysqlajaxphpstudyvscode 二 功能 用户…

CVE-2020-1957 漏洞复现

先声明一下&#xff0c;免杀还是会更的&#xff0c;不过中间可能会穿插一下渗透的内容&#xff01;&#xff01;&#xff01; 踩坑点&#xff1a; 在一开始翻阅了CSDN之后&#xff0c;发现不同文章之间存在出入&#xff0c;于是最后去了CVE的官方文档&#xff0c;和参考一些国…

【TB作品】MSP430G2553,单片机,口袋板, 交通灯控制系统

题8 交通灯控制系统 十字路口交通灯由红、绿两色LED显示器&#xff08;两位8段LED显示器&#xff09;组成&#xff0c;LED显示器显示切换倒计时&#xff0c;以秒为单位&#xff0c;每秒更新一次&#xff1b;为确保安全&#xff0c;绿LED计数到0转红&#xff0c;经5秒延时&#…

深度学习(十三)——损失函数与反向传播

一、损失函数&#xff1a;Loss Function 官网文档&#xff1a;torch.nn — PyTorch 2.0 documentation 1. Loss Function的作用 每次训练神经网络的时候都会有一个目标&#xff0c;也会有一个输出。目标和输出之间的误差&#xff0c;就是用\(Loss\) \(Function\)来衡量的。所以…

UniAudio 1.5:大型语言模型(LLMs)驱动的音频编解码器

大型语言模型&#xff08;LLMs&#xff09;在文本理解和生成方面展示了卓越的能力&#xff0c;但它们不能直接应用于跨模态任务&#xff0c;除非进行微调。本文提出了一种跨模态上下文学习方法&#xff0c;使未进行进一步训练的LLMs能够在少量示例的情况下&#xff0c;无需任何…

【吊打面试官系列-Mysql面试题】Myql 中的事务回滚机制概述 ?

大家好&#xff0c;我是锋哥。今天分享关于 【Myql 中的事务回滚机制概述 ?】面试题&#xff0c;希望对大家有帮助&#xff1b; Myql 中的事务回滚机制概述 ? 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位…

CSS3基本语法

文章目录 一、CSS引入方式二、选择器1、标签选择器2、类选择器3、id选择器4、通配符选择器 三、字体操作1、字体大小2、字体粗细3、字体样式&#xff08;是否倾斜&#xff09;4、字体修改常见字体系列 修改字体系列语法 四、文本操作1、文本缩进2、文本水平对齐方式3、文本修饰…

进阶篇05——存储过程、存储函数、触发器

存储过程 简介 基本语法 创建和调用 -- 创建名为p1的存储过程&#xff0c;小括号里可以跟参数 -- 存储过程个人觉得就是SQL里的函数 create procedure p1() begin-- begin 和 end 之间是封装的SQL语句-- 可以是一条SQL也可以是多条SQLselect * from student; end;-- 调用存储…

c++中string的用法

STL的简介 一.什么是STL二.STL的六大组件2.1仿函数2.2空间配置器2.3 算法2.4 迭代器2.5容器2.6配置器 三.string类3.1string类3.2string类的常用接口说明代码示例运行结果 3.3string类对象的容量操作代码示例sizelengthcapcityempty resizereverse 3.4string类对象的访问及遍历…

JAVA - 注释

JAVA - 注释 单行注释多行注释文档注释 在计算机语言中&#xff0c;注释是计算机语言的一个重要组成部分&#xff0c;用于在源代码中解释代码的作用&#xff0c;可以增强程序的可读性&#xff0c;可维护性。Java 注释是一种在 Java 程序中用于提供代码功能说明的文本。注释不会…

今年618各云厂商的香港服务器优惠活动汇总

又到了一年618年中钜惠活动时间&#xff0c;2024年各大云服务器厂商都有哪些活动呢&#xff1f;有哪些活动包括香港服务器呢&#xff1f;带着这些问题&#xff0c;小编给大家一一讲解各大知名厂商的618活动有哪些值得关注的地方&#xff0c;如果对你有帮助&#xff0c;欢迎点赞…

2024年6月19日 (周三) 叶子游戏新闻

超市播音系统: 定时播放不同音乐 强制卸载软件: 一款强制卸载软件 人气漫改《忍者杀手》动作游戏7月24日登陆Switch角川游戏日前宣布&#xff0c;旗下人气漫改动作游戏《忍者杀手&#xff1a;火烧新琦玉》将于7月24日登陆Switch&#xff0c;本作已经上架Steam&#xff0c;感兴趣…

pytorch基础——张量的创建与基本操作

在PyTorch中&#xff0c;所有的数据都是通过张量&#xff08;Tensor&#xff09;来表示的。张量是一个多维数组&#xff0c;可以包含标量、向量、矩阵等数据类型。 导入PyTorch库 首先&#xff0c;我们需要导入PyTorch库。 import torch创建张量 可以使用torch.tensor()函数来…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 部门组队编程(200分) - 三语言AC题解(Python/Java/Cpp)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f…

亚特全球链锯文化推广大使活动盛大启航

&#xff08;本台记者报&#xff09;链锯&#xff0c;这一象征着力量与技艺的工具&#xff0c;自诞生以来便见证了人类工业文明的进步。从最初的简易链锯到如今的多功能锂电链锯&#xff0c;彰显了人类对于技艺与科技的追求&#xff0c;其演变历程不仅映射出人类科技的巨大飞跃…