LeetCode
小楊同学的笔记本
迎难逆风,勇而飞翔。
展开
-
【LeetCode】283. 移动零(Java)
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。说明:必须在原数组上操作,不能拷贝额外的数组。尽量减少操作次数。class Solution { public void moveZeroes(int[] nums) { int len = nums.length; if (nums == null || len < 2) return; // 记录0的个数,不是0的原创 2020-11-19 11:47:58 · 191 阅读 · 0 评论 -
【LeetCode】1122. 数组的相对排序(Java)
给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。提示:arr1.length, arr2.length <= 10000 <= arr1[i], arr2[i] <= 1000arr2 中的元素 arr2[i] 各不相同arr2 中的每个元素 arr2[原创 2020-11-14 12:05:20 · 297 阅读 · 0 评论 -
【LeetCode】127. 单词接龙(Java)
给定两个单词(beginWord 和 endWord)和一个字典,找到从 beginWord 到 endWord 的最短转换序列的长度。转换需遵循如下规则:每次转换只能改变一个字母。转换过程中的中间单词必须是字典中的单词。说明:如果不存在这样的转换序列,返回 0。所有单词具有相同的长度。所有单词只由小写字母组成。字典中不存在重复的单词。你可以假设 beginWord 和 endWord 是非空的,且二者不相同。这道题没思路,看了weiwei哥的题解学会的,这道题用到bfs+回溯,原创 2020-11-05 16:41:17 · 301 阅读 · 0 评论 -
【LeetCode】941. 有效的山脉数组(Java)
给定一个整数数组 A,如果它是有效的山脉数组就返回 true,否则返回 false。让我们回顾一下,如果 A 满足下述条件,那么它是一个山脉数组:A.length >= 3在 0 < i < A.length - 1 条件下,存在 i 使得:A[0] < A[1] < … A[i-1] < A[I]A[i] > A[i+1] > … > A[A.length - 1]提示:0 <= A.length <= 1000原创 2020-11-03 20:01:14 · 226 阅读 · 0 评论 -
【LeetCode】349. 两个数组的交集(Java)
给定两个数组,编写一个函数来计算它们的交集。说明:输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。解法一setclass Solution { public int[] intersection(int[] nums1, int[] nums2) { // set Set<Integer> set = new HashSet<>(); // 对nums1数组进行排序 Arrays.原创 2020-11-02 13:40:43 · 485 阅读 · 0 评论 -
【LeetCode】381. O(1) 时间插入、删除和获取随机元素 - 允许重复(Java)
设计一个支持在平均 时间复杂度 O(1) 下, 执行以下操作的数据结构。注意: 允许出现重复元素。insert(val):向集合中插入元素 val。remove(val):当 val 存在时,从集合中移除一个 val。getRandom:从现有集合中随机获取一个元素。每个元素被返回的概率应该与其在集合中的数量呈线性相关。class RandomizedCollection { private List<Integer> list; // 保存所有存储的数 priva原创 2020-10-31 11:46:40 · 90 阅读 · 0 评论 -
【LeetCode】463. 岛屿的周长(Java)
给定一个包含 0 和 1 的二维网格地图,其中 1 表示陆地 0 表示水域。网格中的格子水平和垂直方向相连(对角线方向不相连)。整个网格被水完全包围,但其中恰好有一个岛屿(或者说,一个或多个表示陆地的格子相连组成的岛屿)。岛屿中没有“湖”(“湖” 指水域在岛屿内部且不和岛屿周围的水相连)。格子是边长为 1 的正方形。网格为长方形,且宽度和高度均不超过 100 。计算这个岛屿的周长。解法一迭代,最容易想到的解法。class Solution { public int islandPerime原创 2020-10-30 15:31:45 · 367 阅读 · 0 评论 -
【LeetCode】129. 求根到叶子节点数字之和(Java)
给定一个二叉树,它的每个结点都存放一个 0-9 的数字,每条从根到叶子节点的路径都代表一个数字。例如,从根到叶子节点路径 1->2->3 代表数字 123。计算从根到叶子节点生成的所有数字之和。说明: 叶子节点是指没有子节点的节点。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right;原创 2020-10-29 10:48:05 · 229 阅读 · 0 评论 -
【LeetCode】1207. 独一无二的出现次数(Java)
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。提示:1 <= arr.length <= 1000-1000 <= arr[i] <= 1000解法一自己写的,当时没想到用set,现在自己看自己的解法都感觉丢人,见笑了。class Solution { public boolean uniqueOccurrences(int[] arr) { Map&原创 2020-10-28 10:52:08 · 240 阅读 · 1 评论 -
【LeetCode】845. 数组中的最长山脉(Java)
我们把数组 A 中符合下列属性的任意连续子数组 B 称为 “山脉”:B.length >= 3存在 0 < i < B.length - 1 使得 B[0] < B[1] < … B[i-1] < B[i] > B[i+1] > … > B[B.length - 1](注意:B 可以是 A 的任意子数组,包括整个数组 A。)给出一个整数数组 A,返回最长 “山脉” 的长度。如果不含有 “山脉” 则返回 0。提示:0 <= A.l原创 2020-10-25 09:04:17 · 267 阅读 · 0 评论 -
【LeetCode】234. 回文链表(Java)
解法一数组/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public boolean isPalindrome(ListNode head) { // 链表为空或者链表节点为1时,为回文链表原创 2020-10-24 15:37:17 · 275 阅读 · 0 评论 -
【LeetCode】1024. 视频拼接(Java)
你将会获得一系列视频片段,这些片段来自于一项持续时长为 T 秒的体育赛事。这些片段可能有所重叠,也可能长度不一。视频片段 clips[i] 都用区间进行表示:开始于 clips[i][0] 并于 clips[i][1] 结束。我们甚至可以对这些片段自由地再剪辑,例如片段 [0, 7] 可以剪切成 [0, 1] + [1, 3] + [3, 7] 三部分。我们需要将这些片段进行再剪辑,并将剪辑后的内容拼接成覆盖整个运动过程的片段([0, T])。返回所需片段的最小数目,如果无法完成该任务,则返回 -1 。原创 2020-10-24 12:14:20 · 15873 阅读 · 0 评论 -
【LeetCode】925. 长按键入(Java)
你的朋友正在使用键盘输入他的名字 name。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。你将会检查键盘输入的字符 typed。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True。提示:name.length <= 1000typed.length <= 1000name 和 typed 的字符都是小写字母。class Solution { public boolean isLongPressedName(Str原创 2020-10-21 09:47:43 · 194 阅读 · 2 评论 -
【LeetCode】844. 比较含退格的字符串(Java)
给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。 # 代表退格字符。注意:如果对空文本输入退格字符,文本继续为空。提示:1 <= S.length <= 2001 <= T.length <= 200S 和 T 只含有小写字母以及字符 ‘#’。进阶:你可以用 O(N) 的时间复杂度和 O(1) 的空间复杂度解决该问题吗?解法一双栈,个人解法,解法二和三借鉴官方的题解,满足进阶的要求的应该就只有双指针了,时间复杂度为O原创 2020-10-19 10:44:31 · 240 阅读 · 0 评论 -
【LeetCode】19. 删除链表的倒数第N个节点(Java)
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。说明:给定的 n 保证是有效的。进阶:你能尝试使用一趟扫描实现吗?/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val = val; } * ListN原创 2020-10-18 10:18:22 · 179 阅读 · 0 评论 -
【LeetCode】876. 链表的中间结点(Java)
给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。提示:给定链表的结点数介于 1 和 100 之间。/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution {原创 2020-10-17 13:34:13 · 105 阅读 · 0 评论 -
【LeetCode】867. 转置矩阵(Java)
给定一个矩阵 A, 返回 A 的转置矩阵。矩阵的转置是指将矩阵的主对角线翻转,交换矩阵的行索引与列索引。提示:1 <= A.length <= 10001 <= A[0].length <= 1000class Solution { public int[][] transpose(int[][] A) { //新建一个数组,行和列与A数组相反 int[][] B = new int[A[0].length][A.length];原创 2020-10-17 13:34:08 · 132 阅读 · 0 评论 -
【LeetCode】117. 填充每个节点的下一个右侧节点指针 II(Java)
给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。进阶:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。提示:树中的节点数小于 6000-100 <原创 2020-10-17 13:34:01 · 105 阅读 · 0 评论 -
【LeetCode】116. 填充每个节点的下一个右侧节点指针(Java)
给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。初始状态下,所有 next 指针都被设置为 NULL。提示:你只能使用常量级额外空间。使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额原创 2020-10-17 13:33:55 · 287 阅读 · 0 评论 -
【LeetCode】面试题 08.04. 幂集(Java)
幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。说明:解集不能包含重复的子集。class Solution { private List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> subsets(int[] nums) { backtrack(nums, new ArrayList<>(),原创 2020-10-17 13:33:35 · 277 阅读 · 0 评论 -
【LeetCode】1005. K 次取反后最大化的数组和(Java)
给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)以这种方式修改数组后,返回数组可能的最大和。提示:1 <= A.length <= 100001 <= K <= 10000-100 <= A[i] <= 100class Solution { public int largestSumAfterKNegations(int原创 2020-10-17 13:33:30 · 181 阅读 · 0 评论 -
【LeetCode】455. 分发饼干(Java)
假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。提示:1 <= g.length <= 3 * 1040 <= s.length <= 3 * 1041 &原创 2020-10-17 13:33:24 · 293 阅读 · 0 评论 -
【LeetCode】860. 柠檬水找零(Java)
在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。注意,一开始你手头没有任何零钱。如果你能给每位顾客正确找零,返回 true ,否则返回 false 。提示:0 <= bills.length <= 10000bills[i] 不是 5 就是 10 或是 20class原创 2020-10-17 13:33:17 · 231 阅读 · 0 评论 -
【LeetCode】122. 买卖股票的最佳时机 II(Java)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。解法一贪心class Solution { public int maxProfit(int[] prices) { if (prices.length == 1) return 0; //每次都是今天买明天卖,如果跌了,不进行相加,即撤原创 2020-10-16 09:55:24 · 117 阅读 · 0 评论 -
【LeetCode】1518. 换酒问题(Java)
小区便利店正在促销,用 numExchange 个空酒瓶可以兑换一瓶新酒。你购入了 numBottles 瓶酒。如果喝掉了酒瓶中的酒,那么酒瓶就会变成空的。请你计算 最多 能喝到多少瓶酒。提示:1 <= numBottles <= 1002 <= numExchange <= 100解法一class Solution { public int numWaterBottles(int numBottles, int numExchange) {原创 2020-10-16 09:55:18 · 266 阅读 · 0 评论 -
【LeetCode】1002. 查找常用字符(Java)
给定仅有小写字母组成的字符串数组 A,返回列表中的每个字符串中都显示的全部字符(包括重复字符)组成的列表。例如,如果一个字符在每个字符串中出现 3 次,但不是 4 次,则需要在最终答案中包含该字符 3 次。你可以按任意顺序返回答案。提示:1 <= A.length <= 1001 <= A[i].length <= 100A[i][j] 是小写字母class Solution { public List<String> commonChars(St原创 2020-10-17 13:33:47 · 122 阅读 · 0 评论 -
【LeetCode】1217. 玩筹码(Java)
数轴上放置了一些筹码,每个筹码的位置存在数组 chips 当中。你可以对 任何筹码 执行下面两种操作之一(不限操作次数,0 次也可以):将第 i 个筹码向左或者右移动 2 个单位,代价为 0。将第 i 个筹码向左或者右移动 1 个单位,代价为 1。最开始的时候,同一位置上也可能放着两个或者更多的筹码。返回将所有筹码移动到同一位置(任意位置)上所需要的最小代价。提示:1 <= chips.length <= 1001 <= chips[i] <= 10^9cl原创 2020-10-16 09:55:05 · 141 阅读 · 0 评论 -
【LeetCode】1403. 非递增顺序的最小子序列(Java)
给你一个数组 nums,请你从中抽取一个子序列,满足该子序列的元素之和 严格 大于未包含在该子序列中的各元素之和。如果存在多个解决方案,只需返回 长度最小 的子序列。如果仍然有多个解决方案,则返回 元素之和最大 的子序列。与子数组不同的地方在于,「数组的子序列」不强调元素在原数组中的连续性,也就是说,它可以通过从数组中分离一些(也可能不分离)元素得到。注意,题目数据保证满足所有约束条件的解决方案是 唯一 的。同时,返回的答案应当按 非递增顺序 排列。提示:1 <= nums.length原创 2020-10-16 09:54:59 · 173 阅读 · 0 评论 -
【LeetCode】944. 删列造序(Java)
给定由 N 个小写字母字符串组成的数组 A,其中每个字符串长度相等。你需要选出一组要删掉的列 D,对 A 执行删除操作,使 A 中剩余的每一列都是 非降序 排列的,然后请你返回 D.length 的最小可能值。删除 操作的定义是:选出一组要删掉的列,删去 A 中对应列中的所有字符,形式上,第 n 列为 [A[0][n], A[1][n], …, A[A.length-1][n]])。(可以参见 删除操作范例)提示:1 <= A.length <= 1001 <= A[i].le原创 2020-10-16 09:54:53 · 97 阅读 · 0 评论 -
【LeetCode】303. 区域和检索 - 数组不可变(Java)
给定一个整数数组 nums,求出数组从索引 i 到 j(i ≤ j)范围内元素的总和,包含 i, j 两点。实现NumArray类:NumArray(int[] nums)用整数数组nums初始化对象。int sumRange(int i, int j)返回nums数组的元素之和,范围为[i,j](包括sum(nums [i],nums [i + 1],…,nums [j]))提示:0 <= nums.length <= 104-105 <= nums[i] <原创 2020-10-16 09:54:40 · 99 阅读 · 0 评论 -
【LeetCode】121. 买卖股票的最佳时机(Java)
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。注意:你不能在买入股票前卖出股票。解法一暴力破解class Solution { public int maxProfit(int[] prices) { //暴力破解 if (prices == null || prices.length < 2) return 0; i原创 2020-10-16 09:54:33 · 781 阅读 · 1 评论 -
【LeetCode】240. 搜索二维矩阵 II(Java)
编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 target。该矩阵具有以下特性:每行的元素从左到右升序排列。每列的元素从上到下升序排列。class Solution { public boolean searchMatrix(int[][] matrix, int target) { //特判 if (matrix == null || matrix.length == 0) return false; //原创 2020-10-16 09:54:27 · 110 阅读 · 0 评论 -
【LeetCode】215. 数组中的第K个最大元素(Java)
在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。说明:你可以假设 k 总是有效的,且 1 ≤ k ≤ 数组的长度。解法一排序class Solution { public int findKthLargest(int[] nums, int k) { //排序 Arrays.sort(nums); return nums[nums.length - k]; }原创 2020-10-15 10:09:37 · 124 阅读 · 0 评论 -
【LeetCode】530. 二叉搜索树的最小绝对差(Java)
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。提示:树中至少有 2 个节点。这道题和783. 二叉搜索树节点最小距离相同。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * }原创 2020-10-15 10:09:31 · 103 阅读 · 0 评论 -
【LeetCode】102. 二叉树的层序遍历(Java)
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { public List&l原创 2020-10-12 13:06:37 · 71 阅读 · 0 评论 -
【LeetCode】416. 分割等和子集(Java)
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。注意:每个数组中的元素不会超过 100数组的大小不会超过 200class Solution { public boolean canPartition(int[] nums) { int len = nums.length; if (len == 0) return false; //得出数组总和 int su原创 2020-10-15 10:09:25 · 212 阅读 · 0 评论 -
【LeetCode】53. 最大子序和(Java)
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。算法小白,凭实力说不会。(doge) 因为之前没学过贪心、动态规划和分治,所以这道题没什么思路。看了一圈题解区发现这道题有5种解法:第一种是暴力破解,不过时间复杂度为O(N³),所以我就直接跳过,没去了解。第二种为贪心算法,官方视频的第一种解法,我比较感兴趣,而且容易理解,指针没指向一个元素时,先判断这个元素之前的元素和是否小于0,如果是,丢弃之前的元素和,重新从当前元素开始计算,如果大于0,就元素原创 2020-10-16 09:54:47 · 282 阅读 · 0 评论 -
【LeetCode】169. 多数元素(Java)
解法一class Solution { public int majorityElement(int[] nums) { //map int maxCount = -1, result = -1; Map<Integer, Integer> map = new HashMap<>(); //放到map中统计个数 for (int num : nums) { int cou原创 2020-10-15 10:09:13 · 79 阅读 · 0 评论 -
【LeetCode】100. 相同的树(Java)
给定两个二叉树,编写一个函数来检验它们是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; }原创 2020-10-15 10:09:07 · 96 阅读 · 0 评论 -
【LeetCode】690. 员工的重要性(Java)
给定一个保存员工信息的数据结构,它包含了员工唯一的id,重要度 和 直系下属的id。比如,员工1是员工2的领导,员工2是员工3的领导。他们相应的重要度为15, 10, 5。那么员工1的数据结构是[1, 15, [2]],员工2的数据结构是[2, 10, [3]],员工3的数据结构是[3, 5, []]。注意虽然员工3也是员工1的一个下属,但是由于并不是直系下属,因此没有体现在员工1的数据结构中。现在输入一个公司的所有员工信息,以及单个员工id,返回这个员工和他所有下属的重要度之和。注意:一个员工最原创 2020-10-15 10:08:59 · 270 阅读 · 0 评论