算法

浏览该分类下的所有文章

922. 按奇偶排序数组 II

该题要求将长度为偶数且奇、偶数各占一半的数组重新排列,使得奇数位于奇数索引、偶数位于偶数索引。思路是分别收集数组中的所有偶数和奇数,分别存入两个长度为 n/2 的临时数组,然后交替写回原数组:先放一个偶数,再放一个奇数,依次完成整个数组的重构。代码实现中使用两次遍历完成分离和合并,时间复杂度 O(n),额外空间 O(n)。

13. 罗马数字转整数

本文介绍了 LeetCode 第13题“罗马数字转整数”。先给出罗马字符及其数值,并说明仅在 I、X、C 前置于特定更大字符时构成减法(如 IV、IX、XL、XC、CD、CM)。题目要求把合法的罗马数字(长度 ≤15,数值 1~3999)转换为整数。提供的解法遍历字符串,记录前一个字符的数值;若前值小于当前值则减去前值,否则加上前值,遍历结束后再加上最后一个数值。该算法时间 O(n)、空间 O(1)。代码实现采用 switch 映射字符到数值。

1507. 转变日期格式

本文介绍 LeetCode 1507 “转变日期格式”题目:输入形如 “Day Month Year”(如 “20th Oct 2052”)的字符串,需要输出标准格式 “YYYY‑MM‑DD”。核心思路是先按空格拆分获取年、月、日,使用月份数组映射英文缩写到两位数字,去除日中的序数后缀并补零。代码实现通过字符串分割、遍历匹配、replace 与条件格式化完成转换,保证输出符合“YYYY‑MM‑DD”。

20.有效的括号

本文介绍了判断仅含括号字符的字符串是否有效的问题。要求左括号必须被对应类型且顺序正确的右括号闭合。给出示例并说明输入长度上限为10⁴。解法使用栈:遍历字符,遇左括号压入对应的右括号,遇右括号时检查栈顶是否匹配并弹出,若不匹配或栈空则返回false。遍历结束后栈为空即为有效。代码实现简洁高效,时间复杂度 O(n),空间复杂度 O(n)。

1108. IP 地址无效化

本文介绍了 LeetCode 1108 题 “IP 地址无效化”。要求将给定的有效 IPv4 地址中的每个点号(.)替换为字符串 “[.]”,返回处理后的结果。文中给出两例输入输出示范,并提供了 Java 实现:遍历地址字符,遇到 ‘.’ 时追加 “[.]”,否则直接追加原字符,最终返回构建的字符串。该解法时间复杂度 O(n),空间复杂度 O(n)。

数据结构之线性表详解

本文系统阐述了线性表的三种基本实现。首先介绍数组:连续内存存储,支持 O(1) 随机读写,插入/删除需搬移元素导致 O(n) 时间,需扩容且空间必须连续,广泛用于 ArrayList、Redis 等。随后讲解链表:节点通过指针链接,采用随机存储,可灵活插入、删除,时间复杂度均为 O(1)(查找为 O(n)),不受连续空间限制,适用于树、图、LRU 等。最后简述栈的概念及其数组、链表两种实现,强调后进先出特性及 push、pop 操作。文中对比了数组和链表的优缺点,指出读多写少适合数组,频繁插删适合链表。整体呈现线性表的存储原理、操作实现、复杂度分析及典型应用场景。

338. 比特位计数

本文介绍了 LeetCode 第 338 题“比特位计数”。给定整数 n,需要计算区间 [0, n] 内每个数的二进制表示中 1 的个数,并返回长度为 n+1 的数组。示例说明了输入输出对应关系。文中给出一种 O(n) 时间、O(1) 额外空间的动态规划实现:若 i 为偶数,则 ans[i] = ans[i/2](最高位为 0),否则 ans[i] = ans[i‑1] + 1(在前一个数基础上增加一个 1)。代码基于该思路完成求解。

739. 每日温度

本文介绍了 LeetCode 第 739 题 “每日温度”。题目要求对给定的气温数组,计算每一天需要等待多少天才能出现更高温度,若之后没有更高温度则返回 0。文中给出三个示例说明输入输出关系,并提供了基于单调递减栈的 Java 解法:遍历温度数组,利用栈记录尚未找到更高温度的下标,当遇到更高温度时弹出栈中下标并计算间隔天数,最终得到结果数组。

75. 颜色分类

本题要求对仅包含 0、1、2(分别代表红、白、蓝)的长度为 n 的数组就地排序,使相同颜色相邻且顺序为红、白、蓝。核心思路是经典的荷兰国旗算法:利用左指针 left、右指针 right 和遍历指针 i,将 0 移到左侧、2 移到右侧,遇到 1 时直接前进。代码实现中通过条件判断在 O(n) 时间、O(1) 额外空间内完成交换,实现了高效的原地排序。

插入排序

插入排序将数组划分为已排序区和未排序区,逐个取出未排序首元素并在已排序区找到合适位置插入。实现思路是遍历数组,用临时变量保存待插入值,向左移动比它大的元素,直至定位插入点。代码示例展示了每轮的数组变化。优化措施是在遇到比待插入小的元素时立即停止比较,并直接移动而非交换。插入排序是稳定算法,最坏时间复杂度为O(n²),在近乎有序的情况下可降至O(n)。

5. 最长回文子串

本文介绍了求解“最长回文子串”问题的实现思路与代码。给定字符串 s,要求在其中找出最长的回文子串。核心算法采用中心扩展法:遍历可能的回文中心(包括字符本身和字符间的空隙),分别向左右两侧扩展,只要左右字符相等即继续扩展,并记录长度最大的子串。代码实现中,循环遍历 2·len‑1 个中心位置,通过 left、right 指针进行扩展比较,最终返回最长回文子串 result。示例输入 "babad"、"cbbd"、"a"、"ac" 均得到正确输出。

647. 回文子串

本文介绍了 LeetCode 647 “回文子串”问题:统计字符串中所有回文子串的数量,子串位置不同即视为不同。通过中心扩展法遍历 2·n‑1 个可能的中心,分别向左右扩展,只要左右字符相等即计数并继续扩展,最终返回计数结果。代码实现简洁,时间复杂度 O(n²),空间复杂度 O(1)。