Leetcode刷题
acmug
Go to bed early, get up early, knock code
展开
-
leetcode375
leetcode375public class findRadius475 { /** * 刚开始的想法是要遍历每个加热器,所以思路就是错的,我们的肯本目标是让房子有暖气,所以应该遍历房子 * @param houses * @param heaters * @return */ public int findRadius(int[] houses, int[] heaters) { Arrays.sort(heaters)原创 2021-12-20 19:04:25 · 101 阅读 · 0 评论 -
leetcode630
题目链接leetcode630public class scheduleCourse630 { /** * 贪心,有限选择课程结束时间早的,考虑 [[5,5],[4,6],[2,6]],如果执行先学习[5,5],发现后面的都不能学习,但是发现5 > 2,那么可以将5抛出,替换为2,是为了缩小时间差 * @param courses * @return */ public int scheduleCourse(int[][] courses)原创 2021-12-14 18:30:37 · 208 阅读 · 0 评论 -
leetcode807
题目链接leetcode807class Solution { public int maxIncreaseKeepingSkyline(int[][] grid) { int ans = 0; int n = grid.length; int[] west = new int[n]; int[] north = new int[n]; for (int i = 0; i < n; i++) {原创 2021-12-13 18:41:46 · 169 阅读 · 0 评论 -
leetocde709
题目链接leetocde709public class toLowerCase709 { public String toLowerCase(String s) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < s.length(); i++) { char c = s.charAt(i); if(c >= 65 &&原创 2021-12-12 12:35:13 · 3792 阅读 · 0 评论 -
leetcode911
题目链接leetcode911class TopVotedCandidate { private int[] persons; private int[] times; private int length; int[] dp; int[] count; public TopVotedCandidate(int[] persons, int[] times) { this.persons = persons; this.原创 2021-12-11 20:48:15 · 177 阅读 · 0 评论 -
leetcode748
题目链接leetcode748int[] thymeleaf = new int[26]; public String shortestCompletingWord(String licensePlate, String[] words) { String ans = ""; int minlength = 16; licensePlate = licensePlate.toLowerCase(); for (int i = 0;原创 2021-12-10 14:25:22 · 191 阅读 · 0 评论 -
leetcode230. 二叉搜索树中第K小的元素
题目描述给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。输入:root = [3,1,4,null,2], k = 1输出:1递归 private int count = 0; private int ans = -1; public void dfs(TreeNode root, int k) { if (root == null || ans == -1) return;原创 2021-10-18 11:49:39 · 91 阅读 · 0 评论 -
leetcode 剑指offer 069
题目描述符合下列属性的数组 arr 称为 山峰数组(山脉数组) :arr.length >= 3存在 i(0 < i < arr.length - 1)使得:arr[0] < arr[1] < ... arr[i-1] < arr[i]arr[i] > arr[i+1] > ... > arr[arr.length - 1]给定由整数组成的山峰数组 arr ,返回任何满足 arr[0] < arr[1] < ... arr[i -原创 2021-10-14 11:17:27 · 211 阅读 · 0 评论 -
leetcode29两数相除
题目描述给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。返回被除数 dividend 除以除数 divisor 得到的商。整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2示例 1:输入: dividend = 10, divisor = 3输出: 3解释: 10/3 = truncate(3.33333..) = trunca原创 2021-10-13 12:27:28 · 76 阅读 · 0 评论 -
leetcode441排列硬币
题目描述这是一道简单题,为什么要记录这道题?1.为了提醒自己时刻考虑数据是否会产生溢出,以及怎么处理溢出,有许多小的skills2. 提醒自己数学理论知识在acm的应用提示:请大家先想一想这道题你会这么做,贴下题目链接,点击这里进行跳转你总共有 n 枚硬币,并计划将它们按阶梯状排列。对于一个由 k 行组成的阶梯,其第 i 行必须正好有 i 枚硬币。阶梯的最后一行 可能 是不完整的。给你一个数字 n ,计算并返回可形成 完整阶梯行 的总行数。输入:n = 5 输出:2 解释:因为第三行不完原创 2021-10-11 10:58:22 · 87 阅读 · 0 评论 -
leetcode352数据流拆分
题目信息给你一个由非负整数 a1, a2, ..., an 组成的数据流输入,请你将到目前为止看到的数字总结为不相交的区间列表。实现 SummaryRanges 类:SummaryRanges() 使用一个空数据流初始化对象。void addNum(int val) 向数据流中加入整数 val 。int[][] getIntervals() 以不相交区间 [starti, endi] 的列表形式返回对数据流中整数的总结。输入:["SummaryRanges", "addNum", "getIn原创 2021-10-10 16:38:46 · 127 阅读 · 0 评论 -
leetcode600非连续1个数
数位DP对于「数位 DP」题,都存在「询问 [a, b](a 和 b 均为正整数,且 a < b)区间内符合条件的数值个数为多少」的一般形式,通常我们需要实现一个查询 [0, x]有多少合法数值的函数 int dp(int x),然后应用「容斥原理」求解出 [a, b]的个数:dp(b) - dp(a - 1)。暴力采用位运算,如果存在相邻1,那么无符号右移&本身!=0,那么说明不符合题意class Solution {public: int findIntegers(原创 2021-09-15 18:27:33 · 87 阅读 · 0 评论 -
LeetCode9. 回文数
题目描述判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。示例 1:输入: 121输出: true示例 2:输入: -121输出: false解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。示例 3:输入: 10输出: false解释: 从右向左读, 为 01 。因此它不是一个回文数。进阶:你能不将整数转为字符串来解决这个问题简单暴力,转换为字符串class Solution { pu原创 2020-12-13 00:51:47 · 109 阅读 · 0 评论 -
LeetCode7. 整数反转
题目描述给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。示例 1:输入: 123输出: 321 示例 2:输入: -123输出: -321示例 3:输入: 120输出: 21注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。怎么判断整数溢出思路一,通过字符串转换加try catch的方式来解决,由于字符串转换的效率较低且使用较多库函数,所以解题方原创 2020-12-11 11:19:54 · 246 阅读 · 0 评论 -
LeetCode6. Z 字形变换
题目描述将一个给定字符串根据给定的行数,以从上往下、从左到右进行 Z 字形排列。比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下:L C I RE T O E S I I GE D H N之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例 1:输入: s =原创 2020-12-11 10:33:51 · 99 阅读 · 0 评论 -
LeetCode5. 最长回文子串
题目描述给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。示例 1:输入: "babad"输出: "bab"注意: "aba" 也是一个有效答案。示例 2:输入: "cbbd"输出: "bb"暴力根据回文子串的定义,枚举所有长度大于等于 2 的子串,依次判断它们是否是回文;在具体实现时,可以只针对大于“当前得到的最长回文子串长度”的子串进行“回文验证”;在记录最长回文子串的时候,可以只记录“当前子串的起始位置”和“子串长度”,不必做截取。这一步转载 2020-12-10 17:28:58 · 260 阅读 · 0 评论 -
LeetCode3. 无重复字符的最长子串
题目描述给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入: s = "abcabcbb"输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: s = "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: s = "pwwkew"输出: 3解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke原创 2020-12-09 14:07:22 · 71 阅读 · 0 评论 -
LeetCode2两数相加
题目描述给出两个 非空 的链表用来表示两个非负的整数。其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字。如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和。您可以假设除了数字 0 之外,这两个数都不会以 0 开头。示例:输入:(2 -> 4 -> 3) + (5 -> 6 -> 4)输出:7 -> 0 -> 8原因:342 + 465 = 807/** * Definition for singly-原创 2020-12-08 21:54:01 · 100 阅读 · 0 评论 -
LeetCode1两数之和
方法一:暴力枚举class Solution { public int[] twoSum(int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; ++i) { for (int j = i + 1; j < n; ++j) { if (nums[i] + nums[j] == target) {原创 2020-12-08 21:13:40 · 53 阅读 · 0 评论 -
LeetCode300. 最长上升子序列
题目描述给定一个无序的整数数组,找到其中最长上升子序列的长度。示例:输入: [10,9,2,5,3,7,101,18]输出: 4 解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4。说明:可能会有多种最长上升子序列的组合,你只需要输出对应的长度即可。你算法的时间复杂度应该为 O(n2) 。进阶: 你能将算法的时间复杂度降低到 O(n log n) 吗?动态规划class Solution { public int lengthOfLIS(int[] nums)原创 2020-12-08 09:27:52 · 56 阅读 · 0 评论 -
LeetCode65有效数字,和剑指offer表示数值的字符串不完全相同。
题目描述验证给定的字符串是否可以解释为十进制数字。例如:"0" => true" 0.1 " => true"abc" => false"1 a" => false"2e10" => true" -90e3 " => true" 1e" => false"e3" => false" 6e-1" => true" 99e2.5 " => false"53.5e93" => true" --6 " => fa原创 2020-11-25 15:43:30 · 101 阅读 · 0 评论 -
K个一组反转链表
题目描述给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。示例:给你这个链表:1->2->3->4->5当 k = 2 时,应当返回: 2->1->4->3->5当 k = 3 时,应当返回: 3->2->1->4->5典型的递归调用和反转链表。/** * Definition for s原创 2020-11-25 15:06:45 · 61 阅读 · 0 评论 -
LeetCode1370. 上升下降字符串
题目描述给你一个字符串 s ,请你根据下面的算法重新构造字符串:从 s 中选出 最小 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最小 的字符,且该字符比上一个添加的字符大,将它 接在 结果字符串后面。重复步骤 2 ,直到你没法从 s 中选择字符。从 s 中选出 最大 的字符,将它 接在 结果字符串的后面。从 s 剩余字符中选出 最大 的字符,且该字符比上一个添加的字符小,将它 接在 结果字符串后面。重复步骤 5 ,直到你没法从 s 中选择字符。重复步骤 1 到 6 ,直到原创 2020-11-25 14:54:59 · 70 阅读 · 0 评论 -
LeetCode222. 完全二叉树的节点个数
题目描述给出一个完全二叉树,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。1. 普适方法public int countNodes(TreeNode root) { if (root == null){ return 0; } return countNodes(root.left) +原创 2020-11-25 12:46:57 · 656 阅读 · 0 评论 -
LeetCode452. 用最少数量的箭引爆气球
题目描述在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。由于它是水平的,所以纵坐标并不重要,因此只要知道开始和结束的横坐标就足够了。开始坐标总是小于结束坐标。一支弓箭可以沿着 x 轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引原创 2020-11-23 22:22:47 · 153 阅读 · 0 评论 -
LeetCode242. 有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。两个数组,使用计数排序判断是否相等。class Solution { public boolean isAnagram(String s, String t) { int[] ans1 = new int[26]; int[] ans2 = new int[26]; for(int i =0;i<s.length();i++){ ans1原创 2020-11-22 11:35:05 · 53 阅读 · 0 评论 -
LeetCode148. 排序链表
题目描述给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序。时间复杂度o(nlogn),归并排序需要注意,每次分割链表时,前一个链表的next置为null,如上图6,2,3等。class Solution { public ListNode sortList(ListNode head) { if (head == null || head.next == null)原创 2020-11-22 01:01:30 · 52 阅读 · 0 评论 -
LeetCode1030. 距离顺序排列矩阵单元格
给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)输入:R = 1, C = 2, r0 = 0原创 2020-11-22 00:54:35 · 98 阅读 · 0 评论 -
LeetCode134加油站
在一条环路上有 N 个加油站,其中第 i 个加油站有汽油 gas[i] 升。你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。如果你可以绕环路行驶一周,则返回出发时加油站的编号,否则返回 -1。说明: 如果题目有解,该答案即为唯一答案。输入数组均为非空数组,且长度相同。输入数组中的元素均为非负数。输入: gas = [1,2,3,4,5]cost = [3,4,5,1,2]输出: 3解释原创 2020-11-21 13:39:46 · 107 阅读 · 0 评论 -
LeetCode283.移动零
题目描述给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。输入: [0,1,0,3,12]输出: [1,3,12,0,0]方法一,两次遍历,将不是零的元素往前移动,怎么移动,当然是用一个指针来记录。最后将剩下的这段区域内的元素全部置为0。class Solution { public void moveZeroes(int[] nums) { if(nums==null) { return; } //第一次遍历的时候,j指针记录非0原创 2020-11-20 22:11:33 · 78 阅读 · 0 评论 -
LeetCode147. 对链表进行插入排序
关于链表问题,一般情况下要创建一个新的节点,使其next指针指向题目中给定的头节点。目的是方便对头节点进行操作。我的想法,每次出现待插入节点,都需要从前往后找需要插入的节点位置。class Solution { public ListNode insertionSortList(ListNode head) { if(head==null || head.next==null){ return head; } //额外的节点原创 2020-11-20 15:27:47 · 67 阅读 · 0 评论 -
LeetCode406. 根据身高重建队列
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]关键在于排序,问题是怎么排。身高从高到低,因为插入的时候可以将身高低的放在前面。 /** * 解题思路:先排序再插入原创 2020-11-16 12:24:23 · 147 阅读 · 0 评论 -
LeetCode402移掉K位数字
题目描述给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。输入: num = "1432219", k = 3输出: "1219"解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。输入: num = "10200", k = 1输出: "200"解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。输入: num = "10", k = 2输出: "0"解释: 从原数字移除所有的数字,剩余为空就是0。原创 2020-11-16 10:12:47 · 140 阅读 · 0 评论 -
LeetCode1122数组的相对排序
题目描述给你两个数组,arr1 和 arr2,arr2 中的元素各不相同arr2 中的每个元素都出现在 arr1 中对 arr1 中的元素进行排序,使 arr1 中项的相对顺序和 arr2 中的相对顺序相同。未在 arr2 中出现过的元素需要按照升序放在 arr1 的末尾。计数排序...原创 2020-11-15 17:49:25 · 94 阅读 · 0 评论 -
LeetCode922
题目描述给定一个非负整数数组 A, A 中一半整数是奇数,一半整数是偶数。对数组进行排序,以便当 A[i] 为奇数时,i 也是奇数;当 A[i] 为偶数时, i 也是偶数。你可以返回任何满足上述条件的数组作为答案。我的想法,从头遍历,遇到不符合A[i]%2!=i%2的条件时,从i+1开始找不满足A[j]%2!=j%2 && A[j]%2!=A[i]%2,然后交换值。class Solution { public int[] sortArrayByParityII(int[原创 2020-11-13 16:42:05 · 67 阅读 · 0 评论 -
LeetCode328奇偶链表
题目描述给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。请尝试使用原地算法完成。你的算法的空间复杂度应为 O(1),时间复杂度应为 O(nodes),nodes 为节点总数什么是原地算法In computer science, an in-place algorithm is an algorithm which transforms input using no auxiliary data structure原创 2020-11-13 16:36:24 · 117 阅读 · 0 评论 -
LeetCode514自由之路
定义状态我们用dp[i][j] 表示从游戏开始到拼接完成key[0:i] 在ring[j]==key[i]的时候最小步数可能很多人对后半句话很困惑,什么是:在ring[j]==key[i]的时候最小步数这是本题的难点所在,因为存在重复字符串,所以我们把所有重复的位置都考虑到。比如一下情况:ring="ababac"key="ab"第一步 我们先开始拼接a,我们要把ring中每一个a都计算到计算的结果是:dp[0][0]=1dp[0][2]=3dp[0][4]=3为什么出现上面三个结果原创 2020-11-11 15:30:42 · 95 阅读 · 0 评论 -
LeetCode327区间和的个数
题目描述给定一个整数数组 nums,返回区间和在 [lower, upper] 之间的个数,包含 lower 和 upper。区间和 S(i, j) 表示在 nums 中,位置从 i 到 j 的元素之和,包含 i 和 j (i ≤ j)。输入: nums = [-2,5,-1], lower = -2, upper = 2,输出: 3 解释: 3个区间分别是: [0,0], [2,2], [0,2],它们表示的和分别为: -2, -1, 2。解题思路定义sum[] 数组sum[i]代表数组原创 2020-11-10 20:57:17 · 253 阅读 · 0 评论 -
LeetCode973最接近原点的 K 个点
方法一:排序O(nlogn)class Solution { public int[][] kClosest(int[][] points, int K) { Arrays.sort(points, new Comparator<int[]>() { public int compare(int[] point1, int[] point2) { return (point1[0] * point1[0] + po原创 2020-11-10 09:32:29 · 102 阅读 · 0 评论 -
LeetCode1356. 根据数字二进制下 1 的数目排序
题目描述给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。请你返回排序后的数组。关键是重写排序方法,看下面程序即可方法一:暴力对每个十进制的数转二进制的时候统计一下 1 的个数即可。class Solution { public int[] sortByBits(int[] arr) { int[] bit = new int[10001];原创 2020-11-07 00:30:24 · 65 阅读 · 0 评论