LeetCode 200. 岛屿数量
给你一个由 '1'(陆地)和 '0'(水)组成的的二维网格,请你计算网格中岛屿的数量。
岛屿总是被水包围,并且每座岛屿只能由水平方向和/或竖直方向上相邻的陆地连接形成。
此外,你可以假设该网格的四条边均被水包围。
示例 1:
输入:grid = [ ["1","1","1","1","0"], ["1","1","0","1","0"], ["1","1","0","0","0"], ["0","0","0","0","0"]]输出:1
示例 2:
输入:grid = [ ["1","1","0","0","0"], ["1","1","0","0","0"], ["0","0","1","0","0"], ["0","0","0","1","1"]]输出:3
提示:
m == grid.length
n == grid[i].length
1 <= m, n <= 300
grid[i][j] 的值为 '0' 或 '1'
思路
dfs搜索,每次遇到一个岛屿则将陆地全部变成海水,记录遇到的岛屿数即可。
class Solution { publi ...
LeetCode 33. 搜索旋转排序数组
整数数组 nums 按升序排列,数组中的值 互不相同 。
在传递给函数之前,nums 在预先未知的某个下标 k(0 <= k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标 从 0 开始 计数)。例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2] 。
给你 旋转后 的数组 nums 和一个整数 target ,如果 nums 中存在这个目标值 target ,则返回它的下标,否则返回 -1 。
示例 1:
输入:nums = [4,5,6,7,0,1,2], target = 0输出:4
示例 2:
输入:nums = [4,5,6,7,0,1,2], target = 3输出:-1
示例 3:
输入:nums = [1], target = 0输出:-1
提示:
1 <= nums.length <= 5000
-10^4 <= nums[i] ...
LeetCode 25. K个一组翻转链表
给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。
k 是一个正整数,它的值小于或等于链表的长度。
如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。
进阶:
你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。
示例 1:
img
输入:head = [1,2,3,4,5], k = 2输出:[2,1,4,3,5]
示例 2:
img
输入:head = [1,2,3,4,5], k = 3输出:[3,2,1,4,5]
示例 3:
输入:head = [1,2,3,4,5], k = 1输出:[1,2,3,4,5]
示例 4:
输入:head = [1], k = 1输出:[1]
提示:
列表中节点的数量在范围 sz 内
1 <= sz <= 5000
0 <= Node.val <= 1000
1 <= k <= sz
思路
只需先计算出链表总长度,然后以k个为一组迭代即可 ,翻转的思路参照剑指 Offer 24. 反转链表。
cla ...
剑指Offer 24. 反转链表
本题是一道简单题,解析本题的原因是本题的思想可以用于解决25. K 个一组翻转链表这道Hard题。
先看题目描述。定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL
限制:
0 <= 节点个数 <= 5000
注意:本题与主站 206 题相同:https://leetcode-cn.com/problems/reverse-linked-list/
思路
比较容易想到的思路是双指针迭代,如同官方解析所说的:
假设链表为,我们想要把它改成。
在遍历链表时,将当前节点的指针改为指向前一个节点。由于节点没有引用其前一个节点,因此必须事先存储其前一个节点。在更改引用之前,还需要存储后一个节点。最后返回新的头引用。
class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; ...
LeetCode 146. LRU缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。
实现 LRUCache 类:
LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存
int get(int key) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。
void put(int key, int value) 如果关键字 key 已经存在,则变更其数据值 value ;如果不存在,则向缓存中插入该组 key-value 。如果插入操作导致关键字数量超过 capacity ,则应该 逐出 最久未使用的关键字。
函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
示例:
输入["LRUCache", "put", "put", "get", "put", "get", "put", "get", "get", "get"][[2], [1, 1], [2, 2], [1], [3, 3], [2], [4, 4], [1], [3], [4]]输出[null, null, null, 1, null, - ...
LeetCode 103. 二叉树的锯齿形层序遍历
给你二叉树的根节点 root ,返回其节点值的 锯齿形层序遍历 。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。
示例 1:
输入:root = [3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]
示例 2:
输入:root = [1]输出:[[1]]
示例 3:
输入:root = []输出:[]
提示:
树中节点数目在范围 [0, 2000] 内-100 <= Node.val <= 100
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/binary-tree-zigzag-level-order-traversal 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
层次遍历当然是使用队列实现。Queue在Java中是一个接口,接口下有add,offer,poll,peek等方法。LinkedList类实现了这个接口(常用的还有优先级队列PriorityQueue),所以我们在这里使用LinkedList,但我们并不直 ...
LeetCode 54. 螺旋矩阵
给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。
示例 1:
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]
示例 2:
输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]
提示:
m == matrix.lengthn == matrix[i].length1 <= m, n <= 10-100 <= matrix[i][j] <= 100
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/spiral-matrix 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
递归处理即可。
class Solution { public List<Integer> ans = new ArrayList<>(8); int[][] ...
剑指Offer 12. 矩阵中的路径
给定一个m x n二维字符网格board和一个字符串单词word。如果word存在于网格中,返回true;否则,返回false。
单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。
例如,在下面的3×4的矩阵中包含单词"ABCCED"(单词中的字母已标出)。
示例 1:
输入:board = [["A","B","C","E"],["S","F","C","S"],["A","D","E","E"]], word = "ABCCED"输出:true
示例 2:
输入:board = [["a","b"],["c","d"]], word = "abcd"输出:false
提示:
1 <= board.length <= 200 1 <= board[i].length <= 200 board和word仅由大小写英文字母组成
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/ju-zhen-zhong-de-lu-j ...
剑指Offer II 076. 数组中的第 k 大的数字
给定整数数组nums和整数k,请返回数组中第k个最大的元素。
请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。
示例 1:
输入: [3,2,1,5,6,4] 和 k = 2输出: 5
示例 2:
输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4
提示:
1 <= k <= nums.length <= 104 104 <= nums[i] <= 104
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/xx4gT2 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
求一个数列中的第k大的数,将前k个数建小顶堆,后面若比堆顶元素还小,则舍去,否则将堆顶置换成该元素,然后维护堆,最后输出堆顶元素。
class Solution { public int findKthLargest(int[] nums, int k) { PriorityQueue<Integer> least = new Pr ...
剑指Offer II 060. 出现频率最高的 k 个数字
给定一个整数数组nums和一个整数k,请返回其中出现频率k高的元素。可以按任意顺序返回答案。
示例 1:
输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]
示例 2:
输入: nums = [1], k = 1输出: [1]
提示:
1 <= nums.length <= 105 k的取值范围是[1, 数组中不相同的元素的个数] 题目数据保证答案唯一,换句话说,数组中前k个高频元素的集合是唯一的
进阶:所设计算法的时间复杂度 必须 优于,其中是数组大小。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/g5c51o 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
使用HashMap先统计数字出现的次数。然后考虑使用大顶堆来统计前频繁出现的数字。
class Solution { public int[] topKFrequent(int[] nums, int k) { Map<Integer, Integer> map = ...