搜索二维矩阵II
力扣 240. 搜索二维矩阵 II题目说明编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target 。该矩阵具有以下特性:
每行的元素从左到右升序排列。每列的元素从上到下升序排列。
提示:
m == matrix.length
n == matrix[i].length
1 <= n, m <= 300
-10^9 <= matrix[i][j] <= 10^9
每行的所有元素从左到右升序排列
每列的所有元素从上到下升序排列
-10^9 <= target <= 10^9
示例示例 1:
12输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], target = 5输出:true
示例 2:
12输入:matrix = [[1,4,7,11,15],[2,5,8,12,19],[3,6,9,16,22],[10,13,14,17,24],[18,21,23,26,30]], tar ...
无重叠区间
力扣 435. 无重叠区间题目说明给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。
提示:
可以认为区间的终点总是大于它的起点。
区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。
示例示例 1:
12345输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。
示例 2:
12345输入: [ [1,2], [1,2], [1,2] ]输出: 2解释: 你需要移除两个 [1,2] 来使剩下的区间没有重叠。
示例 3:
12345输入: [ [1,2], [2,3] ]输出: 0解释: 你不需要移除任何区间,因为它们已经是无重叠的了。
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,因为需要保证区间不重复,我们可以将右区间进行排序,每次选取右区间较小的进行选择,让我们来看看具体如何实现的吧。
实现123456789101112131415161718192021222324252627282930313233clas ...
岛屿数量
力扣 200. 岛屿数量题目说明给你一个由 ‘1’(陆地)和 ‘0’(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 '0' 或 '1'
示例示例 1:
1234567输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0",&qu ...
杨辉三角II
力扣 119. 杨辉三角 II题目说明给定一个非负索引 rowIndex,返回「杨辉三角」的第 rowIndex 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
提示:
0 <= rowIndex <= 33
示例示例 1:
12输入: rowIndex = 3输出: [1,3,3,1]
示例 2:
12输入: rowIndex = 0输出: [1]
示例 3:
12输入: rowIndex = 1输出: [1,1]
笔者理解此题是一道数学算法问题,在力扣题库中被定义为简单题。
解法当笔者阅读完此题后,直接采用了倒序滚动更新的方式,倒序保证了中间的变得越大,滚动实现了空间优化,让我们来看看具体如何实现的吧。
实现1234567891011121314151617181920class Solution { public List<Integer> getRow(int rowIndex) { // 新建一个integer对象数组 Integer[] dp = new Inte ...
设计模式入门
引入
就如上图所示的,接下来我们会分为创造型、结构型以及行为型来进行扩展。
一、创建型设计模式创建型设计模式包括:单例模式、工厂模式、建造者模式、原型模式。它主要解决对象的创建问题,封装复杂的创建过程,解耦对象的创建代码和使用代码。
1. 单例模式保证全局仅有一个实例,并提供一个访问它的全局访问点。
单例模式用来创建全局唯一的对象。一个类只允许创建一个对象(或者叫实例),那这个类就是一个单例类,这种设计模式就叫作单例模式。单例有几种经典的实现方式,它们分别是:懒汉式、饿汉式、双重检测、静态内部类、枚举。
尽管单例是一个很常用的设计模式,在实际的开发中,我们也确实经常用到它,但是,有些人认为单例是一种反模式(anti-pattern),并不推荐使用,主要的理由有以下几点:
单例对OOP特性的支持不友好
单例会隐藏类之间的依赖关系
单例对代码的扩展性不友好
单例对代码的可测试性不友好
单例不支持有参数的构造函数
那有什么替代单例的解决方案呢?如果要完全解决这些问题,我们可能要从根上寻找其他方式来实现全局唯一类。比如,通过工厂模式、IOC容器来保证全局唯一性。
有人把单例当作反模式,主张 ...
最小覆盖子串
力扣 76. 最小覆盖子串题目说明给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 "" 。
提示:
对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。
如果 s 中存在这样的子串,我们保证它是唯一的答案。
示例示例 1:
12输入:s = "ADOBECODEBANC", t = "ABC"输出:"BANC"
示例 2:
12输入:s = "a", t = "a"输出:"a"
示例 3:
1234输入: s = "a", t = "aa"输出: ""解释: t 中两个字符 'a' 均应包含在 s 的子串中,因此没有符合条件的子字符串,返回空字符串。
笔者理解此题是一道字符串算法问题,在力扣题库中被定义为困难题。
解法当笔者阅读 ...
设计哈希映射
力扣 706. 设计哈希映射题目说明不使用任何内建的哈希表库设计一个哈希映射(HashMap)。
实现 MyHashMap 类:
MyHashMap() 用空映射初始化对象
void put(int key, int value) 向 HashMap 插入一个键值对 (key, value) 。如果 key 已经存在于映射中,则更新其对应的值 value 。
int get(int key) 返回特定的 key 所映射的 value ;如果映射中不包含 key 的映射,返回 -1 。
void remove(key) 如果映射中存在 key 的映射,则移除 key 和它所对应的 value 。
提示:
0 <= key, value <= 10^6
最多调用 10^4 次 put、get 和 remove 方法
示例示例 1:
12345678910111213141516输入:["MyHashMap", "put", "put", "get", "get", & ...
最长有效括号
力扣 32. 最长有效括号题目说明给你一个只包含 '(' 和 ')' 的字符串,找出最长有效(格式正确且连续)括号子串的长度。
提示:
0 <= s.length <= 3 * 10^4
s[i] 为 '(' 或 ')'
示例示例 1:
123输入:s = "(()"输出:2解释:最长有效括号子串是 "()"
示例 2:
123输入:s = ")()())"输出:4解释:最长有效括号子串是 "()()"
示例 3:
12输入:s = ""输出:0
笔者理解此题是一道字符串算法问题,在力扣题库中被定义为困难题。
解法当笔者阅读完此题后,直接动态规划状态转移的方法,让我们来看看具体如何实现的吧。
实现12345678910111213141516171819202122232425262728class Solution { /* * 动态规划 */ publ ...
合并K个升序链表
力扣 23. 合并K个升序链表题目说明给你一个链表数组,每个链表都已经按升序排列。
请你将所有链表合并到一个升序链表中,返回合并后的链表。
提示:
k == lists.length
0 <= k <= 10^4
0 <= lists[i].length <= 500
-10^4 <= lists[i][j] <= 10^4
lists[i] 按 升序 排列
lists[i].length 的总和不超过 10^4
示例示例 1:
12345678910输入:lists = [[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[ 1->4->5, 1->3->4, 2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->4->5->6
示例 2:
12输入:lists = []输出:[]
示例 3:
12输入:lists = [[]]输出:[]
笔者理解此题是一道链表算法问题,在力扣题库中 ...
子集
力扣 10. 正则表达式匹配题目说明给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。
解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。
提示:
1 <= nums.length <= 10
-10 <= nums[i] <= 10
nums 中的所有元素 互不相同
示例示例 1:
12输入:nums = [1,2,3]输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]
示例 2:
12输入:nums = [0]输出:[[],[0]]
笔者理解此题是一道数组算法问题,在力扣题库中被定义为中等题。
解法当笔者阅读完此题后,发现我们可以直接向后遍历,遇到一个数就把所有子集加上该数组成新的子集,遍历完毕即是所有子集,让我们来看看具体如何实现的吧。
实现12345678910111213141516171819202122232425262728293031/* * 数组 */public List<List<Integer>> subse ...








