寻找两个有序数组的中位数
寻找最长回文子串
Z变换
水池问题
三数之和
删除链表倒数第n个节点
括号匹配问题
交换链表的节点
查找元素在排序数组中的开始位置和结束位置
实现子串的查找
下一个排列
数独问题
寻找两个有序数组的中位数
思想:
- 将两个数组看为一个数组,找中位数就等于找总排序完的len/2位置,或者中间两数的平均数。
- 两个序列拿出前 k/2 舍去,这部分是一定不可能的。剩下二序列头元素更小的哪一个就是要求中位数
- 但是存在一个数组的长度不够k/2的情况,因此如果一个数组长度len1 < k/2 ,找 总数组k位置的问题,减小为找舍去更小数组所有元素后,第 k - len1 长度的元素 的问题。
1 | class Solution { |
寻找最长回文子串
思想:
- 关键在于回文串长度可能是奇数 也可能是偶数
- 将序列划分成 2N-1 个比较点(两字符的间隙也视为开始判断的起点)
- 每次都从一个切片点开始扩展,遇到不满足回文的子序列时,下次就从该位置开始判断。
- 时间复杂度为O(n)
1 | class Solution { |
Z 变换
题干:
将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。
比如输入字符串为 “LEETCODEISHIRING” 行数为 3 时,排列如下:
L C I R
E T O E S I I G
E D H N
之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:”LCIRETOESIIGEDHN”。来源:力扣(LeetCode)
关键:
- 要找到 Z 字字符放置位置的关系
- 总间隔为gap = N+N-2
- 每一行,一个Z的字符间隙之和都是gap,gap1=gap-2i,gap2=2i,gap2
1 | class Solution { |
水池问题
题干:
给定 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
来源:力扣(LeetCode)
思想——典型的动态规划
随着宽度减小,只有高度更小的柱体高度变高才会有可能让体积变大
1 | class Solution { |
三数之和
题干:
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],
满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]来源:力扣(LeetCode)
思想:降维,让三维变为二维
排序
确定一个数(非负数)让另外连个比它大的数之和等于它的相反数(避免重复)
三数之和最接近问题:就是三数之和变体,多记录一个差值
1 | class Solution { |
删除链表倒数第n个节点
题干:
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
来源:力扣(LeetCode)
思想
遍历一遍,增加一个记录gap的量,当未达到n删除指针不动,gap加一
gap等于n时候,删除指针也不断移动,gap不变。
到最后,用删除指针删除节点
1 | /** |
括号匹配问题
模式匹配的一种
包含多种题型
本质都是动态规划或者加上栈的运用
有效括号匹配
问题:
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。来源:力扣(LeetCode)
1 | class Solution { |
括号的生成
本质:DFS
题目:
给出 n 代表生成括号的对数,请你写出一个函数,使其能够生成所有可能的并且有效的括号组合。
例如,给出 n = 3,生成结果为:
[
“((()))”,
“(()())”,
“(())()”,
“()(())”,
“()()()”
]来源:力扣(LeetCode)
1 | class Solution { |
最长有效括号
给定一个只包含 ‘(‘ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。
示例 1:
输入: “(()”
输出: 2
解释: 最长有效括号子串为 “()”
示例 2:输入: “)()())”
输出: 4
解释: 最长有效括号子串为 “()()”来源:力扣(LeetCode)
1 | class Solution { |
合并K个有序链表
题目:
合并 k 个排序链表,返回合并后的排序链表。请分析和描述算法的复杂度。
示例:
输入:
[
1->4->5,
1->3->4,
2->6
]
输出: 1->1->2->3->4->4->5->6来源:力扣(LeetCode)
1 | /** |
交换链表的节点
利用O(N)的时间完成任务
两两交换链表中的节点
题干:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例:
给定 1->2->3->4, 你应该返回 2->1->4->3.
来源:力扣(LeetCode)
1 | /** |
K 组一个翻转
题干:
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
示例 :
给定这个链表:1->2->3->4->5
当 k = 2 时,应当返回: 2->1->4->3->5
当 k = 3 时,应当返回: 3->2->1->4->5
说明 :
你的算法只能使用常数的额外空间。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。来源:力扣(LeetCode)
1 | public ListNode reverseKGroup(ListNode head, int k) { |
实现子串的查找
题干:
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
输入: haystack = “hello”, needle = “ll”
输出: 2
示例 2:输入: haystack = “aaaaa”, needle = “bba”
输出: -1
说明:当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf() 定义相符。
来源:力扣(LeetCode)
1 | class Solution { |
下一个排列
题干:
实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1来源:力扣(LeetCode)
1 | class Solution { |
查找元素在排序数组中的开始位置和结束位置
题干:
给定一个按照升序排列的整数数组 nums,和一个目标值 target。找出给定目标值在数组中的开始位置和结束位置。
你的算法时间复杂度必须是 O(log n) 级别。
如果数组中不存在目标值,返回 [-1, -1]。
来源:力扣(LeetCode)
1 | class Solution { |
数独问题
有效的数独
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。来源:力扣(LeetCode)
1 | class Solution { |