Leetcode学习
回文数
反转一半数字
第一个想法是将数字转换为字符串,并检查字符串是否为回文。
但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。
第二个想法是将数字本身反转,然后将反转的数字与原始数字比较,如果它们是相同的,那么这个数字就是回文。
但是,如果反转后的数字大于int.MAX,我们将遇到整数溢出问题。
反转int数字的一半,如果该数字是回文,反转后半部分应与原始数字的前半部分相同。
例如,输入 1221,我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”,并将其与前半部分 “12” 进行比较,因为二者相同,我们得知数字 1221 是回文。
首先,我们应该处理一些临界情况。所有负数都不可能是回文,例如:-123 不是回文,因为 - 不等于 3。所以我们可以对所有负数返回 false。除了 0 以外,所有个位是 0 的数字不可能是回文,因为最高位不等于 0。所以我们可以对所有大于 0 且个位是 0 的数字返回 false。
整个过程中,不断将原始数字除以10,然后给反转的数字乘上10,当原始数字小于或等于反转后的数字时,就意味着已经处理了一半位数的数字了。
最长公共前缀
显然,最长公共前缀的长度不会超过字符串数组中的最短字符串的长度。
用minLength表示字符串数组中的最短字符串的长度,则可以在[o, minLength]范围内通过二分查找得到最长公共前缀的长度。
每次查找返回的中间值mid,判断每个字符串的长度为mid的前缀是否相同,如果相同则最长公共前缀的长度一定大于或等于mid,如果不相同则小于mid。
移除链表元素
给一个链表的头节点head和一个整数val,请删除链表中所有满足Node.val==val的节点,并返回新的头节点。
递归
链表的定义具有递归的性质,因此链表题目常可以用递归的方法求解。
对于给定的链表,首先对除了头节点head以外的节点进行删除操作,然后判断。
递归的终止条件是head为空,此时直接返回head。
当head不为空时,递归地进行删除操作,然后判断 head 的节点值是否等于 val并决定是否要删除 head。
同构字符串
哈希表
需要判断s和t每个位置上的字符是否都一一对应,即s的任意一个字符被t中唯一的字符对应,反之也成立,称为双射。
因此,维护两张哈希表,第一张哈希表以s中字符为键,t中字符为值。
爬楼梯
假设你正在爬楼梯,需要n阶才能到达楼顶
每次可以爬1或2个台阶,有多少种不同方法可以爬楼梯?
用f(x)表示爬到第x级台阶的方案数,最后一步可能跨了一级台阶,也可能跨了两级台阶,所以可以列出如下式子:
f(x) = f(x-1) + f(x-2)
买卖股票的最佳时机二
不能同时参与多笔交易,因此每天交易结束后只可能存在手里有一只股票或者没有股票的状态。
定义状态dp[i][0]表示第i天交易完后手里没有股票的最大利润,dp[i][1]表示第i天交易完后手里持有一支股票的最大利润(i从0开始)。
dp[i][0]的转移方程,如果这一天交易完后手里没有股票,那么可能前一天也没有,或者前一天的时候有
dp[i][0] = max{dp[i-1][0], dp[i-1][1]+prices[i]}
dp[i][1],可能前一天就有这个股票,可能前一天没有然后买下了股票
dp[i][1] = max{dp[i-1][1], dp[i-1][0]-prices[i]}
对于初始状态,根据状态定义
dp[0][0] = 0;
dp[0][1] = -prices[0];
因此,只需要从前往后计算即可。
由于全部交易结束后,持有股票的收益一定低于不持有股票的收益
所以的最后答案一定为dp[n-1][0]
使用最小花费爬楼梯
给一个整数数组,cost[i]是从楼梯第i个台阶向上爬需要的费用,一旦支付此费用,可以向上爬一个或者两个台阶。
可以从下标0或1开始爬,求最低花费。
动态规划
假设数组cost的长度为n,则n个阶梯分别对应下标0到n-1,楼梯顶部对应下标n,问题等价于计算达到下标n的最小划分。
创建长度为n+1的数组dp,其中dp[i]表示达到下标i的最小花费。
dp[0] = dp[1] = 0;
dp[i] = min{dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]}
构造限制重复的字符串
给一个字符串s和一个整数repeatLimit,用s中的字符构造一个新字符,使任何字母连续出现的次数都不超过repeatLimit次。
每次选择当前剩余的字典序最大的字符添加到字符串末尾,如果字符串末尾的字符已经连续出现了repeatLimit次,则将字典序次大的字符添加到末尾,随后选择当前剩余字典序最大的字符添加到末尾,直到使用完。
用下标i指向当前未使用的字典序最大的字符,用下标j指向当前未使用的字典序的次大的字符(满足count[j]>0以及j<i),用m记录当前已经填入的末尾字符的连续次数。
拿出最少数目的魔法豆
给定一个正整数数组beans,其中每个整数表示一个袋子里装的魔法豆的数目。
可将问题转化为:寻找某一个数字x,当我们将豆子数量小于x的袋子清空,并将豆子数量大于x的袋中豆子数量变为x时,拿出的豆子数量最少。
那么,x一定等于某一个袋子的豆子数。
跳跃游戏
nums[i]表示从i向前跳转的最大长度,返回到达nums[n-1]的最小跳跃次数。
这道题典型是贪心算法,通过局部最优解得到全局最优解
反向查找出发位置
目标是到达最后一个位置,因此可以考虑跳跃最后一步之前所在的位置。
如果有多个位置都能通过跳跃到达最后一个位置,那么可以贪心地选择距离最后一个位置最远的位置。
正向查找可到达的最大位置
如果贪心地进行正向查找,每次找到可到达的最远位置,就可以在线性时间内得到最少跳跃次数。
在具体实现中,我们维护能够到达的最大下标位置,称为边界。到达边界时,更新边界,并将跳跃次数增加1。
盛最多水的容器
双指针
在初始时,左右指针分别指向数组的左右两端,它们可以容纳的水量为min(1,7)*8 = 8。
此时需要移动哪个指针呢?应该移动数字较小的那个指针,这是因为容纳的水量是由两个指针指向的较小值*指针之间的距离。
双指针代表的是可以作为容器边界的所有位置的范围。在一开始,双指针指向数组的左右边界,表示数组中所有的位置都可以作为容器的边界,因此还没有进行任何尝试。
在链表中插入最大公约数
给一个链表头head,每个结点包含一个整数值。
在相邻结点之间,插入一个新的结点,节点值为这两个相邻结点值的最大公约数。
class Solution{
public:ListNode* insertGreatestCommonDivisors(ListNode* head) {ListNode* node = head;while(node->next){node->next = new ListNode(__gcd(node->val,node->next->val), node->next);node = node->next->next;}return head;}
};
删除排序链表中的重复元素
给定一个已排序的链表的头head,删除所有重复元素,使每个元素只出现一次,返回已排序的链表。
删除排序链表中的重复元素二
我们只需要对链表进行一次遍历,就可以删除重复的元素。
由于链表的头节点可能会被删除,因此我们需要额外使用一个哑结点(dummy node)指向链表的头节点。
从指针cur指向链表的哑结点,然后遍历
故障键盘
笔记本键盘存在故障,当上面输入字符’i’时,会反转之前所写的字符。
使用双端队列进行模拟
比较直观的思路是维护答案字符串ans,当遇到非i字符时,就将其加入字符串的末尾,否则将字符串进行反转。
然而字符串翻转需要O(l)的时间,其中l是当前ans的长度,这样做的时间复杂度较高。
事实上,当字符串进行反转后,在末尾添加字符,相当于不对字符串进行反转,并且在开头添加字符,因此维护一个双端队列和一个布尔变量head来维护答案。
head初始值为假
- 当遇到非i字符时,head为假时,直接添加到末尾,head为真时,添加到队头。
- 遇到i时,head取反。
如果head为真,就将队列中的字符反序构造。
找出克隆二叉树中的相同节点
给两棵二叉树,原始树orginal和克隆树cloned,以及一个位于原始树的target节点,找到克隆树对应的节点。
深度优先搜索
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {
public:TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {if(original == nullptr){return nullptr;}if(original == target){return cloned;}TreeNode* left = getTargetCopy(original->left, cloned->left, target);if(left != nullptr){return left;}return getTargetCopy(original->right, cloned->right, target);}
};
广度优先搜索
使用队列同时对二叉树original和cloned进行广度优先搜索,初始时分别将根节点original和clone压入队列q1和q2。
假设当前搜索的节点分别为node1和node2,将node1和node2分别弹出队列,如果node1节点的引用等于target,那么返回node2,否则分别将node1和node2的非空子节点压入队列q1和q2。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/class Solution {
public:TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {queue<TreeNode *> q1,q2;q1.push(original);q2.push(cloned);while(!q1.empty()){TreeNode *node1 = q1.front();TreeNode *node2 = q2.front();q1.pop();q2.pop();if(node1 == target){return node2;}if(node1->left != nullptr){q1.push(node1->left);q2.push(node2->left);}if(node1->right != nullptr){q1.push(node1->right);q2.push(node2->right);}}return nullptr;}
};
在带权树网络中统计可连接服务器对数目
给一颗无限带权树,树中总共有n个节点,表示n个服务器,服务器从0到n-1编号。
如果两个服务器a,b和c满足以下条件,那么我们称服务器a和b通过服务器c可连接:
- a<b
- c到a的距离是可以被整除
- c到b的距离可以被整除
- c到b的路径从c到a的路径没有公共边
count[i]表示通过服务器i可连接的服务器对的数目
丑数
class Solution{
public:bool isUgly(int n){if(n <= 0){return false;}vector<int> factors = {2, 3, 5};for(int factor:factors){while(n % factor == 0){n /= factor;}}return n == 1;}
}
丑数二
最小堆
初始化堆为空,首先将最小的丑数1加入堆。
每次取出堆顶元素,则x是堆中最小的丑数,由于2x,3x,5x也是丑数,因此将2x,3x,5x加入堆。
上述做法会导致堆中出现重复元素的情况。
为了避免,使用哈希集合去重。
在排除重复元素的情况下,第n次从最小堆中取出的元素就是第n个丑数。
class Solution {
public:int nthUglyNumber(int n) {vector<int> factors = {2, 3, 5};unordered_set<long> seen;priority_queue<long, vector<long>, greater<long>> heap;seen.insert(1L);heap.push(1L);int ugly = 0;for(int i=0; i<n; i++){long curr = heap.top();heap.pop();ugly = (int)curr;for(int factor: factors){long next = curr * factor;if(!seen.count(next)){seen.insert(next);heap.push(next);}}}return ugly;}
};
合并两个有序数组
给两个非递减顺序排列的整数数组nums和nums,另有两个整数m和n,分别表示nums1和nums2中的元素数目。
直接合并排序
把数组nums放进数组nums1的尾部,然后直接对整个数组进行排序。
移除元素
相关文章:

Leetcode学习
回文数 反转一半数字 第一个想法是将数字转换为字符串,并检查字符串是否为回文。 但是,这需要额外的非常量空间来创建问题描述中所不允许的字符串。 第二个想法是将数字本身反转,然后将反转的数字与原始数字比较,如果它们是相同…...
python 列出面板数据所有变量名
在Python中,处理面板数据(Panel Data)通常使用pandas库,特别是当数据以DataFrame或Panel(尽管Panel在较新版本的pandas中已被弃用)的形式存在时。然而,由于Panel的弃用,现代做法通常…...

知乎网站只让知乎用户看文章,普通人看不了
知乎默认不显示全部文章,需要点击展开阅读全文 然而点击后却要登录,这意味着普通人看不了博主写的文章,只有成为知乎用户才有权力查看文章。我想这不是知乎创作者希望的情况,他们写文章肯定是希望所有人都能看到。 这个网站篡改…...
web前端的实习记录:探索、挑战与成长
web前端的实习记录:探索、挑战与成长 踏入web前端实习的旅程,我怀揣着对未知的好奇与对技术的渴望,开始了一段全新的学习与实践。在这个过程中,我经历了四个方面的技术探索,五个方面的挑战应对,六个方面的…...
正则表达式的详解带你认识正则表达式的意义
前言 我们都知道协议通常通过添加固定的字符、报头、特定的数字等来定义数据的结构和格式。将正确的信息提取出来是十分重要的,而正则表达式可以用来描述和匹配这些固定的结构,从而提取出所需的信息。并且正则表达式还可以处理大量复杂的字符串。这篇…...

中国现在最厉害的书法家颜廷利:东方伟大思想家哲学家教育家
中国书法界名人颜廷利教授,一位在21世纪东方哲学、科学界及当代中国教育领域内具有深远影响力的泰斗级人物,不仅以其深厚的国学修为和对易经姓名学的独到见解著称,还因其选择在济南市历城区的龙泉大街以及天桥区的凤凰山庄与泉星小区等地设立…...
OS常用操作
目录 1 文件和目录操作 1. 1 创建目录 1.2 删除目录 1.3 列出目录内容 1.4 删除文件 1.5 打开和关闭文件描述符 1.6 修改文件权限 1.7 获取和设置文件属性 2 路径操作 2.1 获取当前工作目录 2.2 改变工作目录 2.3 路径操作 2.4 添加 Python 的模块搜索路径列表 3 …...

【IC验证】03 UVM
...
Jira的原理及应用详解(六)
本系列文章简介: 在当今快速发展的软件开发和项目管理领域,有效的团队协作和精确的项目进度追踪是确保项目成功的关键。Jira作为一款广受欢迎的项目和问题追踪工具,以其强大的功能、灵活的定制性以及卓越的用户体验,赢得了全球众多…...

Linux进程间通信之System V
目录 认识system V: system V共享内存: 共享内存的基本原理: 共享内存的数据结构: 共享内存的建立与释放: 共享内存的建立: 共享内存的释放: 共享内存的关联: 共享内存的去关联…...

力扣hot100:394. 字符串解码(递归/括号匹配,字符串之间相对顺序)
LeetCode:394. 字符串解码 本题容易想到用递归处理,在写递归时主要是需要明确自己的递归函数的定义。 不过我们也可以利用括号匹配的方式使用栈进行处理。 1、递归 定义递归函数string GetString(string & s,int & i); 表示处理处理整个numbe…...

【C++11】多线程常用知识
知识体系 thread C++ thread中最常用的两个函数是join和detach,怎么选择呢,简单来说,如果希望等待线程结束,用join,如果希望异步执行,且不等待执行结果,那么就用detach;thread_local可以简单理解为一个线程级别的全局变量;线程id在调试多线程程序时是非常有用的东西;…...

详解linux设备下的/dev/null
/dev/zero是一个特殊的设备文件,它在Linux系统中通常被用来生成无限数量的零数据流。 这个设备文件位于/dev目录下,它不代表任何实际的硬件设备,而是一个虚拟设备。 当从/dev/zero设备中读取数据时,会得到无限数量的零字节&…...

GPT-4 Turbo 和 GPT-4 的区别
引言 人工智能(AI)领域的发展日新月异,OpenAI 的 GPT 系列模型一直是这一领域的佼佼者。GPT-4 和 GPT-4 Turbo 是目前市场上最先进的语言模型之一。本文将详细探讨 GPT-4 和 GPT-4 Turbo 之间的区别,以帮助用户更好地理解和选择适…...

基于小波多分辨分析的一维时间序列信号趋势检测与去除(MATLAB R2018a)
小波最开始是数学上提出的概念,并且在纯数学的王国里存在了一个世纪之久。最开始是为了弥补傅里叶分析的缺陷,即傅里叶级数发散的问题,并寻找出能够代替傅里叶分析的方法。从最早的一些艰难的探索开始直到慢慢发展成为一套完整系统的小波分析…...
Linux RedHat7.6操作系统的xfs格式化后,mount不生效
Linux RedHat7.6操作系统的xfs格式化后,mount不生效 问题现象 最近在准备测试环境的过程中,当对xfs文件系统格式化后,mount磁盘,通过df -h命令查看,未显示挂载磁盘信息 [rootZHZXLxjspo0db003 ~]# mount /dev/datavg/datavg-lv_data /data…...

高并发ping多台主机IP
简介 社区或者是大型公司往往有成千上万或者几百台设备,保持设备始终在线对网络运维人员来说至关重要,然而一个一个登录检查,或者一个一个ping并不明智,累人且效率极低,并出错率高。花钱买检测服务当我没说。 shell编…...
03 Linux 内核数据结构
Linux kernel 有四种重要的数据结构:链表、队列、映射、二叉树。普通驱动开发者只需要掌握链表和队列即可。 链表和队列 Linux 内核都有完整的实现,我们不需要深究其实现原理,只需要会使用 API 接口即可。 1、链表 链表是 Linux 内核中最简单、最普通的数据结构。链表是一…...

关于软件调用独显配置指引【笔记】
关于笔记本电脑不支持独显直连的,bios下也是没有切换独显直连的选项的,处理方法 简单的来说按照图片指引可配置让软件调用独显: 1、进入系统→屏幕→显示卡界面; 2、【添加应用】浏览需要调用独显的软件安装目录,并打开…...

正大国际期货:什么是主力合约?
一个期货品种,在同一时间段,会上市多个月份的合约, 由于主力合约交易量大,流动性高,一般建议新手交易主力合约。 主力合约通常指交易集中,流动性好的合约 ,即在一段时间内交易量和持仓量最大的…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...
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 开发者设计的强大库ÿ…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...