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. 合并两个有序链表
- 使用一个伪头节点简化边界情况的处理,通过比较两链表头部节点的值,依次选择较小的节点拼接到新链表上。
相关文章:
2024.06.19 刷题日记
41. 缺失的第一个正数 这个题目的通过率很低,是一道难题,类似于脑筋急转弯,确实不好想。实际上,对于一个长度为 N 的数组,其中没有出现的最小正整数只能在 [1,N1] 中。 这个结论并不好想,举个例子&#x…...
linux系统中,pwd获取当前路径,dirname获取上一层路径;不使用 ../获取上一层路径
在实际项目中,我们通常可以使用 pwd 来获取当前路径,但是如果需要获取上一层路径,有不想使用 …/ 的方式,可以尝试使用 dirname指令 测试shell脚本 #!/bin/bash# 获取当前路径 CURRENT_PATH$PWD echo "CURRENT_PATH$CURREN…...
DeepSpeed Monitoring Comm. Logging
Monitoring 支持多种后端:Tensorboard、WandB、Comet、CSV文件; TensorBoard例子: 自动监控:DeepSpeed自动把重要metric记录下来。只需在配置文件里enable相应的看板后端即可: {"tensorboard": {"enabl…...
关于INCA的几个实用功能
01--VUI窗口设计 这个可以按照自己的想法设计INCA观测或标定窗口 首先进入到INCA的环境内,点击实验→加载VUI窗口 选择空的窗口 打开后如下所示: 点击UI开发模式,如下图 如下: 添加标定量、观测量、示波器 窗口的大小需要在开发…...
Mamaba3--RNN、状态方程、勒让德多项式
Mamaba3–RNN、状态方程、勒让德多项式 一、简单回顾 在Mamba1和Mamba2中分别介绍了RNN和状态方程。 下面从两个图和两个公式出发,对RNN和状态方程做简单的回顾: R N N : s t W s t − 1 U x t ; O t V s t RNN: s_t Ws_{t-1}Ux_t&…...
PLC模拟量和数字量到底有什么区别?
PLC模拟量和数字量的区别 在工业自动化领域,可编程逻辑控制器(PLC)是控制各种机械设备和生产过程的核心组件。PLC通过处理模拟量和数字量来实现对工业过程的精确控制。了解模拟量和数字量的区别对于设计高效、可靠的自动化系统至关重要。 1. …...
html中如何写一个提示框,css画一个提示框
在HTML中,提示框通常使用<div>元素来创建,然后使用CSS进行样式化。以下是一个示例,展示如何在HTML中写一个提示框,并使用CSS来设计其外观。 HTML 首先,创建一个HTML文件,其中包含一个提示框的结构&…...
ExoPlayer 学习笔记
https://www.51cto.com/article/777840.html ExoPlayer支持多种媒体格式和流媒体协议的播放器 播放视频:player.play()暂停视频:player.pause()停止播放:player.stop() Media3 ExoPlayer | Android media | Android Developers implem…...
汽车IVI中控开发入门及进阶(二十七):车载摄像头vehicle camera
前言: 在车载IVI、智能座舱系统中,有一个重要的应用场景就是视频。视频应用又可分为三种,一种是直接解码U盘、SD卡里面的视频文件进行播放,一种是手机投屏,就是把手机投屏软件已视频方式投屏到显示屏上显示,另外一种就是对视频采集设备(主要就是摄像头Camera)的视频源…...
Transformer模型:未来的改进方向与潜在影响
Transformer模型:未来的改进方向与潜在影响 自从2017年Google的研究者们首次提出Transformer模型以来,它已经彻底改变了自然语言处理(NLP)领域的面貌。Transformer的核心优势在于其“自注意力(Self-Attention…...
ROS 激光雷达
ROS 激光雷达 基本工作原理 激光雷达(LIDAR,Light Detection and Ranging)是一种用于测量距离的远程感应技术。它通过向目标发射激光并分析反射回来的光来测量目标与激光发射源之间的距离。激光雷达广泛应用于多种领域,包括地理…...
杂说咋说-关于城市化发展和城市治理的几点建议(浙江借鉴)
杂说咋说-关于城市化发展和城市治理的几点建议(浙江借鉴) 近年来,浙江省坚持一张蓝图绘到底,推动城市化发展和城市治理不断迈上新台阶,全省城市化水平和城市治理能力牢牢居于全国第一方阵。当前,国内外环境…...
Linux 常用命令 - which【定位可执行文件的位置】
简介 which 命令源自于英文单词 "which",用于在环境变量 PATH 所指定的路径中搜索某个可执行文件或链接(如一个系统命令)的位置,并返回第一个搜索结果。这个命令会遍历 PATH 环境变量中的所有路径,直到找到…...
js文件导出功能
效果图: 代码示例: <!DOCTYPE html> <html> <head lang"en"><meta charset"UTF-8"><title>html 表格导出道</title><script src"js/jquery-3.6.3.js"></script><st…...
PHP转Go系列 | 字符串的使用姿势
大家好,我是码农先森。 输出 在 PHP 语言中的输出比较简单,直接使用 echo 就可以。此外,在 PHP 中还有一个格式化输出函数 sprintf 可以用占位符替换字符串。 <?phpecho 码农先森; echo sprintf(码农:%s, 先森);在 Go 语言中调用它的输…...
vue关于:deep穿透样式的理解
情况一 子组件: <div class"child"><div class"test_class">test_class<div class"test1">test1<div class"test2">test2</div></div></div></div>父组件: …...
算法 |数字计数
给出n个数字,请你求出在给出的这n个数字当中,最大的数字与次大的数字之差,最大的数字与次小的数字之差,次大的数字与次小的数字之差,次大的数字与最小的数字之差. 易错点 1 1 2 3 4 4 次小不是a[1]了 次大也不是a[n-2]了 #include<bits/stdc.h> using namespace std; …...
通义千问调用笔记
如何使用通义千问API_模型服务灵积(DashScope)-阿里云帮助中心 package com.ruoyi.webapp.utils;import com.alibaba.dashscope.aigc.generation.Generation; import com.alibaba.dashscope.aigc.generation.GenerationOutput; import com.alibaba.dashscope.aigc.generation.G…...
Linux常见的压缩文件种类与对应的压缩解压方法
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
LNMP网站架构
一、安装nginx服务 1、关闭防火墙和核心防护 systemctl stop firewalld systemctl disable firewalld setenforce 0 2、安装依赖包 yum -y install pcre-devel zlib-devel openssl-devel gcc gcc-c make 3、创建运行用户 useradd -M -s /sbin/nologin nginx 4、编译安装…...
排序算法及源代码
堆排序: 在学习堆之后我们知道了大堆和小堆,对于大堆而言第一个节点就是对大值,对于小堆而言,第一个值就是最小的值。如果我们把第一个值与最后一个值交换再对最后一个值前面的数据重新建堆,如此下去就可以实现建堆排…...
力扣第206题“反转链表”
在本篇文章中,我们将详细解读力扣第206题“反转链表”。通过学习本篇文章,读者将掌握如何使用迭代和递归的方法来解决这一问题,并了解相关的复杂度分析和模拟面试问答。每种方法都将配以详细的解释,以便于理解。 问题描述 力扣第…...
多模态大模型解读
目录 1. CLIP 2. ALBEF 3. BLIP 4. BLIP2 参考文献 (2023年)视觉语言的多模态大模型的目前主流方法是:借助预训练好的LLM和图像编码器,用一个图文特征对齐模块来连接,从而让语言模型理解图像特征并进行深层次的问…...
React是什么?
theme: condensed-night-purple highlight: atelier-cave-light React是什么? 官方的解释是:A JavaScript library for building user interfaces用于构建用户界面的 JavaScript 库 那为什么要选择用React呢? 原生的HTML、CSS、JavaScrip的…...
创新入门 | 病毒循环Viral Loop是什么?为何能实现指数增长
今天,很多高速增长的成功创业公司都在采用”病毒循环“的策略去快速传播、并扩大用户基础。究竟什么是“病毒循环”?初创公司的创始人为何需要重视这个策略?这篇文章中将会一一解答与病毒循环有关的各种问题。 一、什么是病毒循环(…...
鸿蒙HarmonyOS实战:渲染控制、路由案例
条件渲染 简单来说,就是动态控制组件的显示与隐藏,类似于vue中的v-if 但是这里写法就是用if、else、else if看起来更像是原生的感觉 效果 循环渲染 我们实际开发中,数据一般是后端返回来的对象格式,对此我们需要进行遍历&#…...
【Linux】进程控制2——进程等待(waitwaitpid)
1. 进程等待必要性 我们知道,子进程退出,父进程如果不管不顾,就可能造成"僵尸进程”的问题,进而造成内存泄漏。另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为…...
SpringBoot 统计接口调用耗时的多种方式
在实际开发中,了解项目中接口的响应时间是必不可少的事情。SpringBoot 项目支持监听接口的功能也不止一个,接下来我们分别以 AOP、ApplicationListener、Tomcat 三个方面去实现三种不同的监听接口响应时间的操作。 AOP 首先我们在项目中创建一个类 &am…...
Linux系统安装Ruby语言
Ruby是一种面向对象的脚本语言,由日本的计算机科学家松本行弘设计并开发,Ruby的设计哲学强调程序员的幸福感,致力于简化编程的复杂性,并提供一种既强大又易于使用的工具。其语法简洁优雅,易于阅读和书写,使…...
网络安全练气篇——OWASP TOP 10
1、什么是OWASP? OWASP(开放式Web应用程序安全项目)是一个开放的社区,由非营利组织 OWASP基金会支持的项目。对所有致力于改进应用程序安全的人士开放,旨在提高对应用程序安全性的认识。 其最具权威的就是“10项最严重…...
前端wordpress/谷歌seo快速排名软件首页
针对Cisco2600的配置,大致分以下6个部分:<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />1.拨号设置2.接口配置3.NAT转换4.路由设置5.DNS代理6.DHCP (选配)以下配置经过实验验证。…...
网站建设新闻/开发网站的流程
转自:http://xjsunjie.blog.iyunv.com/999372/684447在SUSE Linux下部署应用的时候,有时会遇到“Socket/File: Can’t open so many files”的问题,这其实是因为SUSE Linux系统的文件句柄限制造成的,一般系统默认都是允许打开1024…...
在某外国网站做代购/上海专业的网络推广
第一种 描述:如果条件许可,把两次请求都放在服务端处理掉一起发回来,这些就在客户端只有一次ajax了 优点:代码放在服务端,安全性比较,且服务端处理速度较快 缺点:可能请求的数据格式是json,这样在服务端处理JSON数据还需要对JSON进行反序列化…...
凡客v十商城还在吗/seo诊断专家
将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0; 思路:遍历查找非整数字符,第一个字符串位置进行判断, 采用-‘0’算出整数*10的多少次方;…...
全国被执行人名单查询/seoul是哪个国家
Android自定义半圆进度条 半圆渐变色进度条带指示 半圆开口大小可自由修改首先我们来看下效果图不同的开口大小只需要修改一个参数即可半圆1:半圆2:半圆3:如果是你想要的效果,就直接滑动到文章底部,下载源码࿰…...
wordpress 隐藏顶部/seo公司运营
整个项目包含了:开题报告 开题报告PPT 任务书 中期报告 论文模板 答辩PPT等 项目源码 主要安介绍了系统在开发过程中所应用到的一些关键的技术 主要python技术介绍;框架Django概要;MySQL数据库知识; 以及常规的网页技术HTM…...