力扣刷题
爱学习的小菜鸡
每天进步一点点!
展开
-
剑指 Offer II 017. 含有所有字符的最短字符串
剑指 Offer II 017. 含有所有字符的最短字符串题目描述:思路(滑动窗口):因为题目只是由英文字母组成,所以可以用一个一维数组来存储s和t中的元素。把字符串 t 的每个字符存入数组,值表示该字母在整个字符串中出现的次数; 遍历字符串s,用滑动窗口的思想,保持窗口左侧不动,只将窗口右侧向右移动,移动窗口的同时在数组中减去窗口内出现相应字母的次数,使用一个变量contains来记录匹配的字母个数,如果遍历到某一窗口时,contains的值等于字符串t 的长度,则表示窗口内已经包含了.原创 2021-12-09 11:05:41 · 295 阅读 · 0 评论 -
力扣刷题--剑指offer34 二叉树中和为某一值的路径
剑指 Offer 34. 二叉树中和为某一值的路径思路:使用回溯class Solution { private List<List<Integer>> res; // 二叉树中和为某一值的路径 public List<List<Integer>> pathSum(TreeNode root, int sum) { res = new ArrayList<>(); back.原创 2021-10-25 19:35:12 · 116 阅读 · 0 评论 -
力扣刷题---502. IPO(大顶堆)
502. IPO解题思路:将capital数组和profits数组融合成为一个结构体Node,先按照capital进行从小到大排序,如果capital大小一致则按照profits从大到小进行排序。创建一个大顶堆,按照profits进行排序,通过一个while循环不停将Node加入到大顶堆中去,每次取最大的元素进行相加,最后得到结果。代码:class Solution { private class Node{ int x; int y;原创 2021-09-08 15:02:52 · 206 阅读 · 0 评论 -
力扣刷题(回溯)--784. 字母大小写全排列
784. 字母大小写全排列思路:使用回溯,用一个StringBuffer来存储每一位元素,对于每个字母,先考虑放它的大写形式,再考虑放它的另一种小写形式。代码:class Solution { List<String> res = new ArrayList<String>(); public List<String> letterCasePermutation(String s) { StringBuffer sb =原创 2021-08-17 09:59:24 · 144 阅读 · 0 评论 -
力扣刷题(DFS)--695. 岛屿的最大面积+733. 图像渲染+576. 出界的路径数
695. 岛屿的最大面积算法分析:深度优先遍历为了确保每个土地访问不超过一次,我们每次经过一块土地时,将这块土地的值置为0。这样我们就不会多次访问同一土地。代码:class Solution { public int maxAreaOfIsland(int[][] grid) { int max = 0; for(int i=0;i<grid.length;i++){ for(int j=0;j<gr...原创 2021-08-17 09:45:59 · 250 阅读 · 0 评论 -
力扣刷题--1964. 找出到每个位置为止最长的有效障碍赛跑路线
1964. 找出到每个位置为止最长的有效障碍赛跑路线这一题与最长上升子序列非常相似(300. 最长递增子序列)但是如果纯用dp时间复杂度为O(n2),会超时//动态规划,时间复杂度为O(n2),超时class Solution { public int[] longestObstacleCourseAtEachPosition(int[] obstacles) { int len = obstacles.length; int[] ...原创 2021-08-10 21:40:55 · 148 阅读 · 0 评论 -
力扣刷题--合并区间(List的操作)
56. 合并区间算法不难,主要是int[][]的长度未知,我们需要先通过List存储,然后最后转为二维数组。思路:先讲intervals数组按照第一个元素进行排序,然后对其进行遍历,如果后一个的左边界小于前一个的右边界并且后一个的右边界大于前一个的右边界(例如[1,3]和[2,6])则将第一个的右边界更新为后一个的右边界,依次遍历直至没有交集为止,再将其存入list当中。代码解析:class Solution { public int[][] merge(int[][] in.原创 2021-08-10 16:21:13 · 185 阅读 · 0 评论 -
力扣刷题--557. 反转字符串中的单词 III
557. 反转字符串中的单词 III题目很简单,就是想对于java字符串操作进行总结解法一:class Solution { public String reverseWords(String s) { //String转换为Char[]数组 char[] cs = s.toCharArray(); int lo = 0, hi = 0; for(int i=0;i<cs.length;i++){原创 2021-08-09 14:55:14 · 84 阅读 · 0 评论 -
力扣刷题--313. 超级丑数(优先队列和Set)
313. 超级丑数题目描述:使用最小堆保存超级丑数,并使用Set来剔除重复元素代码解析:class Solution { public int nthSuperUglyNumber(int n, int[] primes) { Set<Long> seen = new HashSet<Long>(); PriorityQueue<Long> heap = new PriorityQueue<Long&..原创 2021-08-09 14:22:50 · 226 阅读 · 0 评论 -
Leetcode刷题记录---每日一题(2021.7.25)
题目描述如下:代码思路:通过一个Map集合将元素的前后元素都找出来,然后通过出现次数先找出第一个元素(第一个元素和最后一个元素只出现了一次),然后依次寻找后面的元素。代码如下:class Solution { public int[] restoreArray(int[][] adjacentPairs) { Map<Integer, List<Integer>> map = new HashMap<>(); ..原创 2021-07-25 13:53:11 · 129 阅读 · 0 评论 -
1850. 邻位交换的最小次数
1850. 邻位交换的最小次数给你一个表示大整数的字符串num,和一个整数k。如果某个整数是num中各位数字的一个排列且它的值大于num,则称这个整数为妙数。可能存在很多妙数,但是只需要关注值最小的那些。例如,num = "5489355142": 第 1 个最小妙数是"5489355214" 第 2 个最小妙数是"5489355241" 第 3 个最小妙数是"5489355412" 第 4 个最小妙数是"5489355421" 返回要...原创 2021-05-14 16:04:49 · 394 阅读 · 0 评论 -
1849. 将字符串拆分为递减的连续值
1849. 将字符串拆分为递减的连续值给你一个仅由数字组成的字符串s。请你判断能否将s拆分成两个或者多个非空子字符串,使子字符串的数值按降序排列,且每两个相邻子字符串的数值之差等于1。例如,字符串s = "0090089"可以拆分成["0090", "089"],数值为[90,89]。这些数值满足按降序排列,且相邻值相差1,这种拆分方法可行。 另一个例子中,字符串s = "001"可以拆分成["0", "01"]、["00", "1"]或...转载 2021-05-13 11:29:30 · 236 阅读 · 0 评论 -
15. 三数之和
15. 三数之和给你一个包含n个整数的数组nums,判断nums中是否存在三个元素a,b,c ,使得a + b + c =0 ?请你找出所有和为0且不重复的三元组。注意:答案中不可以包含重复的三元组。主要是要学会剪枝题目思路:1.将数组排序2.定义三个指针,i,j,k。遍历i,那么这个问题就可以转化为在i之后的数组中寻找nums[j]+nums[k]=-nums[i]这个问题,也就将三数之和问题转变为二数之和(可以使用双指针)代码如下:class S...原创 2021-05-13 11:09:30 · 444 阅读 · 0 评论 -
496. 下一个更大元素I (单调栈)
496. 下一个更大元素 I题目描述:给你两个 没有重复元素 的数组 nums1 和 nums2 ,其中nums1 是 nums2 的子集。请你找出 nums1 中每个元素在 nums2 中的下一个比其大的值。nums1 中数字 x 的下一个更大元素是指 x 在 nums2 中对应位置的右边的第一个比 x 大的元素。如果不存在,对应位置输出 -1 。示例:输入: nums1 = [4,1,2], nums2 = [1,3,4,2].输出: [-1,3,-1]解释:对于 num原创 2021-05-10 15:42:02 · 165 阅读 · 0 评论 -
2021/4/11 刷题记录+周赛记录
今天周赛就A了前面两个简单题,卡在第三题了,真是想复杂了;今日一题没想到用堆做。。。。菜呀第三题5728. 最少侧跳次数代码:dp[i][j]表示到达第i处第j跑道的最少跳跃次数class Solution { public int minSideJumps(int[] obstacles) { int len = obstacles.length; int[][] dp = new int[len][3]; for(int ..原创 2021-04-11 21:08:48 · 105 阅读 · 0 评论 -
动态规划小结
题目:115. 不同的子序列解决思路:动态规划dp方程表示的含义:s[i] 和t[j] 索引的元素子序列数量状态方程状态方程分析:当s[i] == t[j] 时 dp[i][j] = dp[i-1][j-1] + dp[i-1][j];当s[i] != t[j] 时 dp[i][j] = dp[i-1][j]先看s[i] == t[j] 时,以s = "rara" t = "ra" 为例,当i = 3, j = 1时,s[i] == t[j]。此时分为2种情况...原创 2021-04-10 11:13:39 · 85 阅读 · 0 评论 -
编辑距离(Leetcode72. 编辑距离)
题目描述:解法:动态规划(dp[i][j] : 存储 s1[0..i-1] 和 s2[0..j-1] 的最小编辑距离)class Solution { //dp[i][j] : 存储 s1[0..i-1] 和 s2[0..j-1] 的最小编辑距离 public int minDistance(String word1, String word2){ int len1 = word1.length(), len2 = word2.length(); .原创 2021-03-29 22:23:03 · 61 阅读 · 0 评论 -
力扣刷题----跳跃游戏(贪心算法)
题目描述:给定一个非负整数数组,你最初位于数组的第一个位置。数组中的每个元素代表你在该位置可以跳跃的最大长度。你的目标是使用最少的跳跃次数到达数组的最后一个位置。示例:输入: [2,3,1,1,4]输出: 2解释: 跳到最后一个位置的最小跳跃数是 2。从下标为 0 跳到下标为 1 的位置,跳1步,然后跳3步到达数组的最后一个位置。说明:假设你总是可以到达数组的最后一个位置。思路:正向查找可到达的最大位置我们维护当前能够到达的最大下标位置,记为边界end。我们从左...原创 2020-10-22 15:58:43 · 169 阅读 · 0 评论 -
力扣刷题----螺旋矩阵
题目描述:给定一个包含m x n个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素。示例1:输入:[[ 1, 2, 3 ],[ 4, 5, 6 ],[ 7, 8, 9 ]]输出: [1,2,3,6,9,8,7,4,5]示例2:输入:[ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12]]输出: [1,2,3,4,8,12,11,10,9,5,6,7]思路:1、首先设定上下左右边...原创 2020-10-17 00:10:50 · 201 阅读 · 0 评论 -
力扣刷题----组合总和(39、40) 回溯+递归算法
一、组合总和(可重复选取)给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集不能包含重复的组合。示例1:输入:candidates = [2,3,6,7], target = 7,所求解集为:[[7],[2,2,3]]示例2:输入:candidates = [2,3,5...原创 2020-10-15 11:50:19 · 379 阅读 · 1 评论 -
力扣刷题------串联所有单词的子串
题目:给定一个字符串s和一些长度相同的单词words。找出 s 中恰好可以由words 中所有单词串联形成的子串的起始位置。注意子串要与words 中的单词完全匹配,中间不能有其他字符,但不需要考虑words中单词串联的顺序。示例 1:输入: s = "barfoothefoobarman", words = ["foo","bar"]输出:[0,9]解释:从索引 0 和 9 开始的子串分别是 "barfoo" 和 "foobar" 。输出的顺序不重要, [9,0] ...原创 2020-10-06 14:54:06 · 189 阅读 · 0 评论 -
力扣刷题------3sums问题
题目描述:给你一个包含 n 个整数的数组nums,判断nums中是否存在三个元素 a,b,c ,使得a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。注意:答案中不可以包含重复的三元组。示例:给定数组 nums = [-1, 0, 1, 2, -1, -4],满足要求的三元组集合为:[[-1, 0, 1],[-1, -1, 2] ]思路:首先对数组进行排序,排序后固定一个数 target,再使用左右指针指向 target 后面的两端,数字分别为 nums[l] ...原创 2020-09-20 09:12:57 · 225 阅读 · 0 评论 -
力扣刷题-----正则表达式匹配(动态规划)
给你一个字符串s和一个字符规律p,请你来实现一个支持 '.'和'*'的正则表达式匹配。'.' 匹配任意单个字符'*' 匹配零个或多个前面的那一个元素所谓匹配,是要涵盖整个字符串s的,而不是部分字符串。说明:示例 1:示例 2:示例3:示例 4:示例 5:动态规划解法:题目中的匹配是一个「逐步匹配」的过程:我们每次从字符串 p 中取出一个字符或者「字符 + 星号」的组合,并在 s中进行匹配。对于 p中一个字符而言,它只能在 s中匹...原创 2020-09-13 23:50:26 · 713 阅读 · 0 评论 -
力扣刷题-----Z 字形变换
将一个给定字符串根据给定的行数,以从上往下、从左到右进行Z 字形排列。比如输入字符串为 "LEETCODEISHIRING"行数为 3 时,排列如下:之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"LCIRETOESIIGEDHN"。请你实现这个将字符串进行指定行数变换的函数:string convert(string s, int numRows);示例1:输入: s = "LEETCODEISHIRING", numRows = 3输出: "LCIRET...原创 2020-09-13 09:11:03 · 156 阅读 · 0 评论 -
力扣刷题-----寻找两个有序数组的中位数
题目:给定两个大小为 m 和 n 的有序数组 nums1 和 nums2。请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。你可以假设 nums1 和 nums2 不会同时为空。示例 1:nums1 = [1, 3]nums2 = [2]则中位数是 2.0示例 2:nums1 = [1, 2]nums2 = [3, 4]则中位数是 (2 + 3)/2 = 2.5算法:二分查找最关键的步骤是找到分割线,中位数只与分割线两侧的元素原创 2020-08-12 16:08:23 · 220 阅读 · 0 评论 -
力扣刷题----无重复字符的最长子串(c++)
题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。示例1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。示例 3:输入: "pwwkew"输出: 3解释: 因为无重复字符的最长子串是"wke",所以其长度为 3。请注意,你的答案必须是 子串 的长度,"pwke"是一个子序列,不是子...原创 2020-08-10 22:40:21 · 254 阅读 · 0 评论