算法
Leetcode
059
这个作者很懒,什么都没留下…
展开
-
餐厅过滤器(自定义排序)
一、题目给你一个餐馆信息数组 restaurants,其中 restaurants[i] = [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false,如果为 true 就意味着你应该只包括 veganFriendlyi 为 true 的餐馆,为 false 则意味着可以包括任何餐馆。此外,我们还有最大价格 maxPrice 和原创 2022-02-13 21:37:39 · 211 阅读 · 0 评论 -
长度最小的子数组(前缀和+二分 、滑动窗口)
一、题目给定一个含有 n 个正整数的数组和一个正整数 target 。找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。示例 1:输入:target = 7, nums = [2,3,1,2,4,3]输出:2解释:子数组 [4,3] 是该条件下的长度最小的子数组。示例 2:输入:target = 4, nums = [1,4,4]输出:1示例 3原创 2022-02-13 14:52:00 · 195 阅读 · 0 评论 -
车队(空间换时间典型方法)
一、题目N 辆车沿着一条车道驶向位于 target 英里之外的共同目的地。每辆车 i 以恒定的速度 speed[i] (英里/小时),从初始位置 position[i] (英里) 沿车道驶向目的地。一辆车永远不会超过前面的另一辆车,但它可以追上去,并与前车以相同的速度紧接着行驶。此时,我们会忽略这两辆车之间的距离,也就是说,它们被假定处于相同的位置。车队 是一些由行驶在相同位置、具有相同速度的车组成的非空集合。注意,一辆车也可以是一个车队。即便一辆车在目的地才赶上了一个车队,它们仍然会被视作是原创 2022-01-15 23:40:38 · 189 阅读 · 0 评论 -
岛屿的最大面积(DFS)
一、题目给你一个大小为 m x n 的二进制矩阵 grid 。岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在 水平或者竖直的四个方向上 相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。岛屿的面积是岛上值为 1 的单元格的数目。计算并返回 grid 中最大的岛屿面积。如果没有岛屿,则返回面积为 0 。链接:https://leetcode-cn.com/problems/max-area-of-island二、思路典型的岛屿问题,四个方向进原创 2022-01-15 20:10:48 · 204 阅读 · 0 评论 -
爱吃香蕉的珂珂(二分法左边界)
一、题目珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。示例 1:输入: piles = [3,6,7,11], H = 8输出原创 2022-01-15 20:05:30 · 97 阅读 · 0 评论 -
和为 K 的子数组(前缀和)
一、题目给你一个整数数组 nums 和一个整数 k ,请你统计并返回该数组中和为 k 的连续子数组的个数。示例 1:输入:nums = [1,1,1], k = 2输出:2示例 2:输入:nums = [1,2,3], k = 3输出:2提示:1 <= nums.length <= 2 * 104-1000 <= nums[i] <= 1000-107 <= k <= 10链接:https://leetcode-cn.com/problems/su原创 2022-01-15 20:01:34 · 328 阅读 · 0 评论 -
航班预订统计(差分数组)
一、题目这里有 n 个航班,它们分别从 1 到 n 进行编号。有一份航班预订表 bookings ,表中第 i 条预订记录 bookings[i] = [firsti, lasti, seatsi] 意味着在从 firsti 到 lasti (包含 firsti 和 lasti )的 每个航班 上预订了 seatsi 个座位。请你返回一个长度为 n 的数组 answer,里面的元素是每个航班预定的座位总数。示例 1:输入:bookings = [[1,2,10],[2,3,20],[2,5,25]原创 2022-01-15 19:49:38 · 142 阅读 · 0 评论 -
查找和最小的K对数字(top k问题优先队列)
一、题目给定两个以升序排列的整数数组 nums1 和 nums2 , 以及一个整数 k 。定义一对值 (u,v),其中第一个元素来自 nums1,第二个元素来自 nums2 。请找到和最小的 k 个数对 (u1,v1), (u2,v2) … (uk,vk) 。示例 1:输入: nums1 = [1,7,11], nums2 = [2,4,6], k = 3输出: [1,2],[1,4],[1,6]解释: 返回序列中的前 3 对数:[1,2],[1,4],[1,6],[7,2],[7,4原创 2022-01-09 22:55:34 · 394 阅读 · 0 评论 -
最多可以参加的会议数目(贪心)
一、题目给你一个数组 events,其中 events[i] = [startDayi, endDayi] ,表示会议 i 开始于 startDayi ,结束于 endDayi 。你可以在满足 startDayi <= d <= endDayi 中的任意一天 d 参加会议 i 。注意,一天只能参加一个会议。请你返回你可以参加的 最大 会议数目。链接:https://leetcode-cn.com/problems/maximum-number-of-events-that-can-be原创 2022-01-09 19:02:50 · 498 阅读 · 0 评论 -
无重叠区间(贪心算法)
一、题目给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间 [1,2] 和 [2,3] 的边界相互“接触”,但没有相互重叠。示例 1:输入: [ [1,2], [2,3], [3,4], [1,3] ]输出: 1解释: 移除 [1,3] 后,剩下的区间没有重叠。链接:https://leetcode-cn.com/problems/non-overlapping-intervals二、思路区间调度问题使用贪心算法。贪心算法原创 2022-01-09 18:49:34 · 847 阅读 · 0 评论 -
路径总和(DFS、回溯、BFS)
一、题目给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果存在,返回 true ;否则,返回 false 。叶子节点 是指没有子节点的节点。链接:https://leetcode-cn.com/problems/path-sum二、答案DFS:对于树来说DFS即为先序遍历。class TreeNode { int val; TreeNode le原创 2022-01-09 18:41:57 · 112 阅读 · 0 评论 -
在 D 天内送达包裹的能力(二分法左边界)
一、题目传送带上的包裹必须在 days 天内从一个港口运送到另一个港口。传送带上的第 i 个包裹的重量为 weights[i]。每一天,我们都会按给出重量(weights)的顺序往传送带上装载包裹。我们装载的重量不会超过船的最大运载重量。返回能在 days 天内将传送带上的所有包裹送达的船的最低运载能力。示例 1:输入:weights = [1,2,3,4,5,6,7,8,9,10], days = 5输出:15解释:船舶最低载重 15 就能够在 5 天内送达所有包裹,如下所示:第 1 天原创 2022-01-03 22:48:47 · 323 阅读 · 0 评论 -
n皇后(回溯)
1.题目n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 ‘Q’ 和 ‘.’ 分别代表了皇后和空位。2.答案回溯解决棋盘问题import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Objects原创 2022-01-03 20:52:18 · 76 阅读 · 0 评论 -
接雨水(暴力、备忘录、双指针)
1、题目2、答案暴力:下标 ii处能接的雨水量等于下标 i两边的最大高度的最小值减去height[i]。public class Rain { /** * 暴力二重循环 * @param height * @return */ public int trap(int[] height) { int sum = 0; //下标是1 到 height.length - 1。0和 height.length - 1在边原创 2022-01-03 20:46:25 · 80 阅读 · 0 评论 -
排列硬币(左侧边界的二分法)
一、题目二、思路直接循环会超时,此时要考虑二分。二分要注意两个问题,一个是边界。一个就是溢出。此题下标定义long类型就不会溢出。还是要多刷题,总结经验。class Solution { public int arrangeCoins(int n) { long low = 1; long high = n; while (low <= high) { long mid = (high - low) / 2 +原创 2021-09-25 19:08:39 · 109 阅读 · 0 评论 -
猜数字大小(二分法)
一、题目二、代码这个题目比较难理解,总之要使用预定的接口。使用二分方法策略猜数字,注意边界。/** * Forward declaration of guess API. * @param num your guess * @return -1 if num is lower than the guess number * 1 if num is higher than the guess number * ..原创 2021-08-29 17:43:06 · 272 阅读 · 0 评论 -
验证回文字符串 Ⅱ(双指针)
一、题目二、代码双指针 。使用判断回文子串原始的方法,分别指向首尾字符。注意:i++、 j--不能单纯用于减一,因为会赋值。class Solution { public static boolean validPalindrome(String s) { int i = 0; int j = s.length() - 1; while(i < j){ if(s.charAt(i) == s.ch...原创 2021-08-29 12:24:37 · 189 阅读 · 0 评论 -
多数元素(分治)
一、题目二、代码本题可以用哈希表、排序去做,但是这次使用分治。分治即分而治之,把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。class Solution { public int majorityElement(int[] nums) { return majorityElementRec(nums, 0, nums.length - 1); } ...原创 2021-08-22 19:58:32 · 377 阅读 · 0 评论 -
长度为三且各字符不同的子字符串(滑动窗口)
一、题目二、代码滑动窗口。注意substring的用法,第二个参数是下标,而且不包括这个下标。class Solution { //定义一个长度为3的滑动窗口 public int countGoodSubstrings(String s) { int windowLen = 3; int len = s.length(); int goodNum = 0; for(int i = 0; i < le..原创 2021-08-22 18:05:12 · 194 阅读 · 0 评论 -
二维区域和检索 - 矩阵不可变(二维前缀和数组)
一、题目二、代码前缀和二维数组,列数要加1class NumMatrix { //二维前缀和数组 private int[][] preSum; public NumMatrix(int[][] matrix) { int m = matrix.length; int n = matrix[0].length; preSum = new int[m][n + 1]; for(int i = 0; i..原创 2021-08-21 19:07:58 · 81 阅读 · 0 评论 -
股票价格跨度(单调栈)
一、题目二、代码单调栈class StockSpanner { //定义单调栈单调递减存储估价stock Stack<Integer> stockStack = null; //定义天数栈 Stack<Integer> daysStack = null; public StockSpanner() { stockStack = new Stack<>(); daysStack =.原创 2021-08-21 16:51:10 · 135 阅读 · 0 评论 -
重复的DNA序列(滑动窗口 )
一、题目二、代码滑动窗口class Solution { //滑动窗口 + hashSet去重 public List<String> findRepeatedDnaSequences(String s) { int windowLen = 10; int len = s.length(); Set<String> DnaSet = new HashSet<>(); /...原创 2021-08-21 16:48:18 · 393 阅读 · 0 评论 -
区域和检索 - 数组不可变(前缀和)
一、题目二、代码前缀和class NumArray { //定义前缀数组 private int[] preSum; public NumArray(int[] nums) { int n = nums.length; preSum = new int[n]; preSum[0] = nums[0]; for(int i = 1; i < n; i++){ preSu..原创 2021-08-21 16:45:24 · 81 阅读 · 0 评论 -
计数质数(埃及筛)
一、题目二、代码暴力解法。从质数n的定义入手,遍历从2到n-1,如果取余为0则为合数。可以优化即不用遍历到n-1,而是到根号n。class Solution { public int countPrimes(int n) { int count = 0; for (int i = 2; i < n; i++) { if (isPrime(i)) { count++; .原创 2021-08-21 16:42:16 · 680 阅读 · 0 评论 -
颠倒二进制位
一、题目二、思路jdk自带函数public class Solution { // you need treat n as an unsigned value public int reverseBits(int n) { return Integer.reverse(n); }}位运算public class Solution { // you need treat n as an unsigned value ..原创 2021-08-14 18:08:14 · 72 阅读 · 0 评论 -
爬楼梯(记忆化搜索)
此题可用动态规划,暴力递归做。也可以优化暴力递归使用记忆化搜索class Solution { HashMap<Integer,Integer> stepsMap = new HashMap(); public int climbStairs(int n) { if(n == 1){ return 1; } if(n == 2){ return 2; } ..原创 2021-08-14 17:42:44 · 111 阅读 · 0 评论 -
课程表(拓扑排序)
一、题目二、思路拓扑排序判断此课程安排图是否是有向无环图。入度数组:课号 0 到 n - 1 作为索引,通过遍历先决条件表求出对应的初始入度。邻接表:用哈希表记录依赖关系其中key为课号,value为依赖这门课的后续课。最后如果入度数组中还存在不等于0的元素则存在环,不存在拓扑排序。...原创 2021-08-14 16:58:31 · 162 阅读 · 0 评论 -
区域和检索 - 数组可修改(线段树)
一、题目二、思路线段树的思想,参考B站的正月点灯笼UP主。class NumArray { private int[] tree; private int[] nums; private int n; public void buildTree(int node, int start, int end) { if (start == end) { tree[node] = nums[start]..原创 2021-07-29 19:25:09 · 71 阅读 · 0 评论 -
Nim 游戏(博弈论)
一、题目二、思路这是一道博弈论思想的题目。A和B两个人玩游戏,如果有小于4块的石头,A先取直接拿完就能获胜;如果4块的话A无论怎么拿,B都会把剩下的拿了,然后B取得胜利;当石头大于4块例如7块A拿走3块把剩下的四块留给B,B必然输。例如石头等于8块则经过A、B第一轮的挑选后,可以控制成4块,此时该A拿,A必输。class Solution { public boolean canWinNim(int n) { return (n % 4 != 0); ...原创 2021-07-28 16:26:13 · 149 阅读 · 0 评论 -
数组中的第K个最大元素(优先队列和快速排序变种)
一、题目给定整数数组nums和整数k,请返回数组中第k个最大的元素。请注意,你需要找的是数组排序后的第k个最大的元素,而不是第k个不同的元素。输入: [3,2,1,5,6,4] 和 k = 2输出: 5二、思路jdk自带的排序算法,比较容易想到class Solution { public int findKthLargest(int[] nums, int k) { int len = nums.length; Arra...原创 2021-07-24 14:38:33 · 563 阅读 · 1 评论 -
分发糖果
一、题目老师想给孩子们分发糖果,有 N个孩子站成了一条直线,老师会根据每个孩子的表现,预先给他们评分。你需要按照以下要求,帮助老师给这些孩子分发糖果:每个孩子至少分配到 1 个糖果。评分更高的孩子必须比他两侧的邻位孩子获得更多的糖果。那么这样下来,老师至少需要准备多少颗糖果呢?示例1:输入:[1,0,2]输出:5解释:你可以分别给这三个孩子分发 2、1、2 颗糖果。示例2:输入:[1,2,2]输出:4解释:你可以分别给这三个孩子分发 1、2、1 颗糖果。第三个孩...原创 2021-02-22 12:57:50 · 97 阅读 · 0 评论 -
最大数(自定义排序规则)
一、题目给定一组非负整数 nums,重新排列它们每个数字的顺序(每个数字不可拆分)使之组成一个最大的整数。注意:输出结果可能非常大,所以你需要返回一个字符串而不是整数。示例:输入:nums = [3,30,34,5,9]输出:"9534330"二、代码class Solution { //自定义排序规则 //一对整数 a 和 b ,如果a + b > b + a ,则a 应该排在 b前面 //例如 比较 3 和 30谁排在前面,则 330 >.原创 2021-02-19 14:13:46 · 547 阅读 · 0 评论 -
计数二进制子串
一、题目给定一个字符串s,计算具有相同数量 0 和 1 的非空(连续)子字符串的数量,并且这些子字符串中的所有 0 和所有 1 都是连续的。重复出现的子串要计算它们出现的次数。示例 :输入: "00110011"输出: 6解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。请注意,一些重复出现的子串要计算它们出现的次数。二、代码思路:先生成次数数组,再两两遍历数组,取出最小值,并累加。00110011..原创 2021-02-16 23:26:53 · 104 阅读 · 0 评论 -
最大连续1的个数
一、题目二、代码一次遍历数组class Solution { public int findMaxConsecutiveOnes(int[] nums) { int maxCount = 0;//最大次数 int count = 0;//当前次数 int len = nums.length; for(int i = 0; i < len; i++){ if(nums[i] == 1){原创 2021-02-15 16:13:22 · 103 阅读 · 0 评论 -
快乐数(快慢指针)
一、题目二、代码暴力法class Solution { //19 / 10 = 1...9 9 / 10 = 0....9 public List<Integer> getBits(int n){ int remainder = 0; List<Integer> bits = new LinkedList<>(); while(n != 0){ remain.原创 2021-02-10 17:08:20 · 83 阅读 · 0 评论 -
买卖股票的最佳时机(双指针)
一、题目二、代码暴力法class Solution { public int maxProfit(int[] prices) { int profit = 0; int len = prices.length; for(int start = 0; start < len; start++) for(int end = start + 1; end < len; end++){ .原创 2021-02-08 19:34:42 · 248 阅读 · 0 评论 -
最小路径和
一、题目二、代码动态规划。状态转移方程:dp(i,j)=grid(i,j)+min(dp(i+1,j),dp(i,j+1))class Solution { public int minPathSum(int[][] grid) { int m = grid.length; int n = grid[0].length; //设dp[i][j]为从左上角到(i,j)的最小路径 int[][] dp = ne.原创 2020-07-21 11:40:11 · 85 阅读 · 0 评论 -
滑动窗口解决最长连续1的个数
滑动窗口实际上是双指针的一类变形。class Solution { public int longestOnes(int[] A, int K) { int left = 0; int right = 0; int len = A.length; int count = 0; int result = 0; while(right < len){ if(A[rig...原创 2020-09-18 17:38:29 · 264 阅读 · 0 评论 -
双指针解决两个数组的交集
class Solution { public int[] intersection(int[] nums1, int[] nums2) { Set<Integer> set = new HashSet<>(); Arrays.sort(nums1); Arrays.sort(nums2); int i = 0; int j = 0; while(i < nums1.len.原创 2020-09-18 12:15:08 · 205 阅读 · 0 评论 -
广度优先遍历被围绕的区域
class Solution { private int m; private int n; private class Point{ int i; int j; Point(int i, int j){ this.i = i; this.j = j; } } public void bfs(int i_, int j_, char[][] board...原创 2020-09-11 23:14:37 · 119 阅读 · 0 评论