每日LeetCode
算法
知之为知
记录学习内容
展开
-
11.搜索插入位置-LeetCode-Java
给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。你可以假设数组中无重复元素。示例 1:输入: [1,3,5,6], 5 输出: 2示例 2:输入: [1,3,5,6], 2 输出: 1示例 3:输入: [1,3,5,6], 7 输出: 4示例 4:输入: [1,3,5,6], 0 输出: 0class Solution { public int searchInsert(int[] nums, int原创 2020-06-26 18:30:23 · 65 阅读 · 0 评论 -
24.二叉树的最小深度-LeetCode-Java
给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最小深度 2./** * 方法一:层次遍历,访问每一层depth++,直到访问到某一层的元素是叶子节点 */class Solution { int depth = 1; Queue queu原创 2020-07-03 14:06:45 · 2768 阅读 · 0 评论 -
53.两个数组的交集 II-LeetCode-Java
给定两个数组,编写一个函数来计算它们的交集。示例 1:输入:nums1 = [1,2,2,1], nums2 = [2,2]输出:[2,2]示例 2:输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输出:[4,9] 说明:输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。import java.util.ArrayList;import java.util.HashMap;class Solu原创 2020-07-21 10:35:56 · 82 阅读 · 0 评论 -
30.最小栈-LeetCode-Java
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。push(x) —— 将元素 x 推入栈中。pop() —— 删除栈顶的元素。top() —— 获取栈顶元素。getMin() —— 检索栈中的最小元素。 示例:输入:["MinStack","push","push","push","getMin","pop","top","getMin"][[],[-2],[0],[-3],[],[],[],[]]输出:[null,null,null,null原创 2020-07-05 09:08:37 · 88 阅读 · 0 评论 -
65.键盘行-LeetCode-Java
给定一个单词列表,只返回可以使用在键盘同一行的字母打印出来的单词。示例:输入: ["Hello", "Alaska", "Dad", "Peace"]输出: ["Alaska", "Dad"]注意:你可以重复使用键盘上同一字符。你可以假设输入的字符串将只包含字母。class Solution { public String[] findWords(String[] words) { ArrayList<String> ret = new ArrayLis原创 2020-08-08 20:34:55 · 102 阅读 · 0 评论 -
3.整数反转-LeetCode-Java
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1: 输入: 123 输出: 321示例 2: 输入: -123 输出: -321示例 3: 输入: 120 输出: 21注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。class Solution { public static int reverse(int x) { try原创 2020-06-16 22:33:16 · 412 阅读 · 0 评论 -
22.二叉树的最大深度-LeetCode-Java
给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点的节点。示例:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNod原创 2020-07-03 08:51:25 · 69 阅读 · 0 评论 -
1.两数之和-LeetCode-Java
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]/** * 方法一:使用两个for循环,两两相加=target 则返回数组下标值 * 复杂度:O(n2) */public c原创 2020-06-14 10:15:38 · 85 阅读 · 0 评论 -
67.七进制数-LeetCode-Java
给定一个整数,将其转化为7进制,并以字符串形式输出。示例 1:输入: 100 输出: "202"示例 2:输入: -7 输出: "-10"注意: 输入范围是 [-1e7, 1e7] 。/** * [ 100%7=2 (√) 100/7=14 ] * [ 14%7=0 (√) 14/7=2 ] * [ 2%7=2 (√) 2/7=0 ] */class Solution { public String convertToBase7(int num) {原创 2020-08-11 22:03:00 · 199 阅读 · 0 评论 -
68.相对名次-LeetCode-Java
给出 N 名运动员的成绩,找出他们的相对名次并授予前三名对应的奖牌。前三名运动员将会被分别授予 “金牌”,“银牌” 和“ 铜牌”("Gold Medal", "Silver Medal", "Bronze Medal")。(注:分数越高的选手,排名越靠前。)示例 1:输入: [5, 4, 3, 2, 1]输出: ["Gold Medal", "Silver Medal", "Bronze Medal", "4", "5"]解释: 前三名运动员的成绩为前三高的,因此将会分别被授予 “金牌”,“银原创 2020-08-14 19:37:36 · 156 阅读 · 0 评论 -
31.相交链表-LeetCode-Java
编写一个程序,找到两个单链表相交的起始节点。示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前有 2原创 2020-07-05 10:25:22 · 68 阅读 · 0 评论 -
56.大小为 K 且平均值大于等于阈值的子数组数目-LeetCode-Java
给你一个整数数组 arr 和两个整数 k 和 threshold 。请你返回连续长度为 k 且平均值大于等于 threshold 的子数组数目。示例 1:输入:arr = [2,2,2,2,5,5,5,8], k = 3, threshold = 4输出:3解释:子数组 [2,5,5],[5,5,5] 和 [5,5,8] 的平均值分别为 4,5 和 6 。其他长度为 3 的子数组的平均值都小于 4 (threshold 的值)。示例 2:输入:arr = [1,1,1,1,1], k =原创 2020-07-23 11:30:58 · 144 阅读 · 0 评论 -
57.左叶子之和-LeetCode-Java
计算给定二叉树的所有左叶子之和。示例: 3 / \ 9 20 / \ 15 7在这个二叉树中,有两个左叶子,分别是 9 和 15,所以返回 24//Definition for a binary tree node.class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}/原创 2020-07-24 11:49:10 · 87 阅读 · 0 评论 -
17.爬楼梯-LeetCode-Java-待完善
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?注意:给定 n 是一个正整数。示例 1: 输入: 2 输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3 输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶/** * 方法一:递归 * (超出时间限制) */class原创 2020-06-30 20:52:36 · 97 阅读 · 0 评论 -
33.两数之和 II - 输入有序数组-LeetCode-Java
给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数。函数应该返回这两个下标值 index1 和 index2,其中 index1 必须小于 index2。说明:返回的下标值(index1 和 index2)不是从零开始的。你可以假设每个输入只对应唯一的答案,而且你不可以重复使用相同的元素。示例:输入: numbers = [2, 7, 11, 17], target = 19输出: [1,4]解释: 2 与 17 之和等于目标数 19 。因此 index1 = 1,原创 2020-07-05 22:47:17 · 76 阅读 · 0 评论 -
14.最后一个单词的长度-LeetCode-Java
定一个仅包含大小写字母和空格 ' ' 的字符串 s,返回其最后一个单词的长度。如果不存在最后一个单词,请返回 0 。说明:一个单词是指仅由字母组成、不包含任何空格字符的 最大子字符串。示例1:输入: "Hello World" 输出: 5示例2:输入:"Today is a nice day" 输出: 3示例3:输入:"a " 输出: 1class Solution { public int lengthOfLastWord(String s) { char原创 2020-06-27 09:00:55 · 91 阅读 · 0 评论 -
62.重复的子字符串-LeetCode-Java-待完善
给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。示例 1:输入: "abab" 输出: True解释: 可由子字符串 "ab" 重复两次构成。示例 2:输入: "aba" 输出: False示例 3:输入: "abcabcabcabc" 输出: True解释: 可由子字符串 "abc" 重复四次构成。 (或者子字符串 "abcabc" 重复两次构成。)/** * 解法一:比如字符串"abcabcabcabc原创 2020-07-30 15:30:18 · 119 阅读 · 0 评论 -
21.对称二叉树-LeetCode-Java
给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 进阶:你可以运用递归(深度周游)和迭代(广度周游)两种方法解决这个问题吗?/** * 方法一:先序遍历=后序遍历的逆序 * 对称二叉树 左 = 右原创 2020-07-02 12:21:39 · 97 阅读 · 0 评论 -
69.完美数-LeetCode-Java
对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为“完美数”。给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False示例:输入: 28 输出: True解释: 28 = 1 + 2 + 4 + 7 + 14 提示:输入的数字 n 不会超过 100,000,000. (1e8)// 方法一:从num/2开始递减遍历 时间复杂度O(n)class Solution { public boolean checkPerfectNumber(in原创 2020-08-15 23:13:31 · 228 阅读 · 0 评论 -
23.平衡二叉树-LeetCode-Java
给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。示例 1: 给定二叉树 [3,9,20,null,null,15,7] 3 / \ 9 20 / \ 15 7返回 true 。示例 2: 给定二叉树 [1,2,2,3,3,null,null,4,4] 1 / \ 2 2 / \ 3 3 / \ 4原创 2020-07-03 09:43:32 · 139 阅读 · 0 评论 -
40.二叉树的所有路径-LeetCode-Java
给定一个二叉树,返回所有从根节点到叶子节点的路径。说明: 叶子节点是指没有子节点的节点。示例:输入: 1 / \2 3 \ 5输出: ["1->2->5", "1->3"]解释: 所有根节点到叶子节点的路径为: 1->2->5, 1->3/** * 先序遍历(深度优先遍历 DFS) 访问所有路径 * 思考:这里path使用String类型,可不可以使用StringBuilder */class Solution {原创 2020-07-11 08:03:53 · 127 阅读 · 0 评论 -
49.区域和检索 - 数组不可变-LeetCode-Java
给定一个整数数组 nums,求出数组从索引 i 到 j (i ≤ j) 范围内元素的总和,包含 i, j 两点。示例:给定 nums = [-2, 0, 3, -5, 2, -1],求和函数为 sumRange()sumRange(0, 2) -> 1sumRange(2, 5) -> -1sumRange(0, 5) -> -3说明:你可以假设数组不可变。会多次调用 sumRange 方法(成千上万次调用)/** * 方法一:常规方法 * 每次调用s原创 2020-07-18 10:02:36 · 65 阅读 · 0 评论 -
43.缺失数字-LeetCode-Java
给定一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数。示例 1:输入: [3,0,1] 输出: 2示例 2:输入: [9,6,4,2,3,5,7,0,1] 输出: 8 说明:你的算法应具有线性时间复杂度。你能否仅使用额外常数空间来实现?/** * 方法一:使用一个等长的数组 * 同样这里数组可以换成hash表 * 空间复杂度O(n) */ class Solution { public int missin原创 2020-07-12 13:56:01 · 173 阅读 · 0 评论 -
13.最大子序和-LeetCode-Java
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。示例:输入: [-2,1,-3,4,-1,2,1,-5,4],输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。进阶:如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的分治法求解。class Solution { public int maxSubArray(int[] nums) { int max = Integer.MIN_VALUE原创 2020-06-27 08:24:36 · 77 阅读 · 0 评论 -
5.罗马数字转整数-LeetCode-Java
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值I 1V 5X 10L 50C 100D 500M 1000例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常原创 2020-06-20 16:44:37 · 116 阅读 · 0 评论 -
60.找到所有数组中消失的数字-LeetCode-Java
给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次。找到所有在 [1, n] 范围之间没有出现在数组中的数字。您能在不使用额外空间且时间复杂度为O(n)的情况下完成这个任务吗? 你可以假定返回的数组不算在额外空间内。示例:输入:[4,3,2,7,8,2,3,1]输出:[5,6]/** * 常规思路:new int[n]做标记使用:空间复杂度O(n) * 原地操作:用原数组标记是否已经出现过:改变值为负则表原创 2020-07-28 21:40:42 · 143 阅读 · 0 评论 -
4.回文数-LeetCode-Java
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121 输出: true示例 2:输入: -121 输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。思路:将一个整数倒叙输出比较即可int->String->StringBuilder->StringBuilder.reverse()public class palindromeNumber {原创 2020-06-19 11:54:16 · 90 阅读 · 0 评论 -
41.各位相加-LeetCode-Java
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。示例:输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。 由于 2 是一位数,所以返回 2。进阶:你可以不使用循环或者递归,且在 O(1) 时间复杂度内解决这个问题吗?// 方法一:递归class Solution { public int addDigits(int num) { int sum = 0; while (num != 0)原创 2020-07-11 22:17:16 · 115 阅读 · 0 评论 -
38.旋转数组-LeetCode-Java
给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。示例 1:输入: [1,2,3,4,5,6,7] 和 k = 3输出: [5,6,7,1,2,3,4]解释:向右旋转 1 步: [7,1,2,3,4,5,6]向右旋转 2 步: [6,7,1,2,3,4,5]向右旋转 3 步: [5,6,7,1,2,3,4]示例 2:输入: [-1,-100,3,99] 和 k = 2输出: [3,99,-1,-100]解释: 向右旋转 1 步: [99,-1,-100,3]原创 2020-07-08 21:56:45 · 146 阅读 · 0 评论 -
16.二进制求和-LeetCode-Java
给你两个二进制字符串,返回它们的和(用二进制表示)。输入为 非空 字符串且只包含数字 1 和 0。示例 1:输入: a = "11", b = "1" 输出: "100"示例 2:输入: a = "1010", b = "1011" 输出: "10101"执行用时:8 ms, 在所有 Java 提交中击败了12.49%的用户内存消耗:39.7 MB, 在所有 Java 提交中击败了7.69%的用户 * 二进制加法 十进制加法 * 步骤: 1.反转 2.短的补齐位数 3.计算 %原创 2020-06-29 11:50:25 · 168 阅读 · 0 评论 -
12.外观数列-LeetCode-Java
给定一个正整数 n(1 ≤ n ≤ 30),输出外观数列的第 n 项。注意:整数序列中的每一项将表示为一个字符串。「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。前五项如下:1. 12. 113. 214. 12115. 111221第一项是数字 1描述前一项,这个数是 1 即 “一个 1 ”,记作 11描述前一项,这个数是 11 即 “两个 1 ” ,记作 21描述前一项,这个数是 21 即 “一个 2 一个 1原创 2020-06-26 19:28:00 · 205 阅读 · 0 评论 -
6.有效的括号-LeetCode-Java-待完善
import java.util.ArrayList;/** * 顺序读取字符串,读取一个字符与栈中首字符比较,能配对出栈,不能配对压栈, * 如果最后栈空返回true,否则返回false * 这里自定义了一个栈,java工具类也有栈java.util.Stack */class Solution { public static boolean isValid(String s) { Stack stack = new Stack(); for (char原创 2020-06-21 20:10:07 · 103 阅读 · 0 评论 -
26.买卖股票的最佳时机-LeetCode-Java-待完善
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你最多只允许完成一笔交易(即买入和卖出一支股票一次),设计一个算法来计算你所能获取的最大利润。示例 1:输入: [7,1,5,3,6,4]输出: 5解释: 在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 示例 2:输入: [7,6,4,3原创 2020-07-03 22:09:04 · 63 阅读 · 0 评论 -
36.Excel表列序号-LeetCode-Java
给定一个Excel表格中的列名称,返回其相应的列序号。例如, A -> 1 B -> 2 C -> 3 ... Z -> 26 AA -> 27 AB -> 28 ... 示例 1: 输入: "A" 输出: 1示例 2: 输入: "AB" 输出: 28示例 3: 输入: "ZY" 输出: 701/** * ASCII码 A~Z(65~90) */class Solution {原创 2020-07-06 22:09:32 · 78 阅读 · 0 评论 -
19.合并两个有序数组-LeetCode-Java
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。 示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出: [1,2,2,3,5,6]/** * 插入排序:1.原创 2020-07-01 11:28:45 · 337 阅读 · 0 评论 -
28.只出现一次的数字-LeetCode-Java
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。说明:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?示例 1:输入: [2,2,1]输出: 1示例 2:输入: [4,1,2,1,2]输出: 4/** * 方法一:使用set去重 额外使用O(n)的空间 */class Solution { public int singleNumber(int[] nums) { HashSet s原创 2020-07-04 09:46:03 · 96 阅读 · 0 评论 -
55.找不同-LeetCode-Java
给定两个字符串 s 和 t,它们只包含小写字母。字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。请找出在 t 中被添加的字母。示例:输入:s = "abcd"t = "abdec"输出:e解释:'e' 是那个被添加的字母。和"43.缺失数字"一个思路/** * 方法一:找单身狗 */class Solution { public char findTheDifference(String s, String t) { int i;原创 2020-07-22 14:30:19 · 162 阅读 · 0 评论 -
18.删除排序链表中的重复元素-LeetCode-Java
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。示例 1:输入: 1->1->2输出: 1->2示例 2:输入: 1->1->2->3->3输出: 1->2->3// 方法一:这里使用set判别是否是重复元素,增加了额外的时间/空间开销import java.util.HashSet;import java.util.Set;class Solution { public ListNode delete原创 2020-07-01 09:45:11 · 2126 阅读 · 0 评论 -
63.汉明距离-LeetCode-Java
两个整数之间的汉明距离指的是这两个数字对应二进制位不同的位置的数目。给出两个整数 x 和 y,计算它们之间的汉明距离。注意:0 ≤ x, y < 231.示例:输入: x = 1, y = 4输出: 2解释:1 (0 0 0 1)4 (0 1 0 0) ↑ ↑上面的箭头指出了对应二进制位不同,共有2处二进制位不同。class Solution { public int hammingDistance(int x, int y) {原创 2020-08-01 14:36:48 · 380 阅读 · 0 评论 -
9.移除元素-LeetCode-Java
给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并原地 修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1:给定 nums = [3,2,2,3], val = 3,函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。示例 2:给定 nums = [0,1,2,2,3,0,4,2原创 2020-06-23 11:49:30 · 99 阅读 · 0 评论