LeetCode刷题整理
力扣
ZZYSY~
这个作者很懒,什么都没留下…
展开
-
链表相交(Java)
思路:设A链表长度为a,B链表长度为b,两个链表的交集长度为c,那么从A链表头结点开始,走完自己一遍之后,再走B链表,走到相交结点,需要的步数为a + (b - c),同样,对于B链表,从头结点开始,走完自己一遍,再走A链表,走到相交结点,需要的步数为b + (a - c),可以发现,a + (b - c) = b + (a - c),所以,让他们同时开始走,如果有相交结点,总会相遇的,而相遇时共同指向的那个结点就是相交结点,如果没有相交结点,那他们就会把两个链表都走完,最终全是null,两种情况最后只.原创 2022-03-12 14:33:10 · 1264 阅读 · 0 评论 -
滑动窗口的平均值(Java)
思路:使用ArrayList来动态存储整数数据,添加起始位置start和终止位置end来定位滑动窗口。对于next方法,每次存储数据时终止位置要加1,而且要判断当前数据量是否大于滑动窗口的大小,如果大于滑动窗口的话,在定位滑动窗口时起始位置也要加1,这时我们就可以根据start和end来得到处在滑动窗口中的数据了,从而求得平均值代码:class MovingAverage { int size; int start; int end; List<Integer.原创 2022-02-06 22:14:33 · 1582 阅读 · 0 评论 -
二叉树的最大深度(Java)
思路:通过递归搜索每个结点的左右孩子,如果左子树或右子树不为空,深度就加1,然后和当前的最大深度比较,如果大就替换最大深度,直到遍历完整棵树代码:class Solution { int maxHigh = 0; public int maxDepth(TreeNode root) { if(root == null) return 0; getHigh(root,0); return maxHigh; } public.原创 2022-02-06 22:05:47 · 536 阅读 · 0 评论 -
计数二进制子串(Java)
思路:因为要求每个子串的0和1都是连续成组出现的,所以我们可以先分组,即计算每组的0或1的数量,例如0011100011,可以分组为2332,只有相邻的组才可以形成满足条件的子串,很容易发现,每两组形成的子串的数量是两组中小的那个数,依次遍历所有组就可以得到所有满足条件的子串了代码:class Solution { public int countBinarySubstrings(String s) { int n = s.length(); int num .原创 2022-02-03 19:59:43 · 382 阅读 · 0 评论 -
全排列(Java)
思路:回溯法,终止条件为List长度为数组长度,使用数组标记当前下标是否已经被使用,回溯时remove一次List并使标记数组在当前下标下的状态为未使用代码:class Solution { //用来存放大结果 List<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> permute(int[] nums) { //调.原创 2022-01-24 23:47:37 · 163 阅读 · 0 评论 -
螺旋矩阵(Java)
思路:①初始化:定义4个变量代表上下左右的边界,初始值依次为0,matrix.length,0,matrix[0].length,这里为了方便用up,down,left,right表示②遍历(for循环):向右:i=left,i<=right,存放matrix[up][i],遍历完毕后up++向下:i=up,i<=down,存放matrix[i][right],遍历完毕后right–向左:i=right,i>=left,存放matrix[down][i],遍历完毕后down–.原创 2022-01-24 23:36:54 · 289 阅读 · 0 评论 -
重新分配字符使所有字符串都相等(Java)
思路:如果可以通过执行n步使得每个字符串都相等说明了这个字符串数组中出现过的每个字母的次数都是数组长度的倍数,只有这样才能平均分配代码:class Solution { public boolean makeEqual(String[] words) { int[] arr = new int[123]; for(int i = 0;i < words.length;i++){ for(int j = 0;j < words.原创 2022-01-23 23:31:48 · 384 阅读 · 0 评论 -
三步问题(Java)
思路:该题类似爬楼梯问题,只不过爬楼梯是只能爬1阶和2阶,这个小孩还能爬3阶,而且题目中为了防止溢出还让结果%1000000007,所以状态转移方程为dp[i]=(dp[i-1]+dp[i-2]+dp[i-3])%1000000007。注意,因为结果比较大所以要使用long来存放数据,否则,你懂的代码:class Solution { public int waysToStep(int n) { long[] dp = new long[n + 1]; if(.原创 2022-01-23 23:14:00 · 174 阅读 · 0 评论 -
二叉搜索树的第k大节点(Java)
思路:如果了解二叉搜索树中序遍历应该知道中序遍历的结果是升序的顺序,由此我们可以使用中序遍历遍历这棵二叉搜索树,把结果放到一个数据结构中,然后再取出倒数第K个数即可代码:class Solution { public static Stack<Integer> s = new Stack<>(); public int kthLargest(TreeNode root, int k) { zhongxu(root); while(k !.原创 2022-01-23 22:08:26 · 315 阅读 · 0 评论 -
将每个元素替换为右侧最大元素(Java)
思路:从后往前遍历数组,记录当前最大值,一个一个将最大值赋值给当前下标处元素,注意要提前记录一下当前值用于后面比较代码:class Solution { public int[] replaceElements(int[] arr) { if(arr.length == 1) return new int[] {-1}; int max; int maxNum = -1; for (int i = arr.length - 1;.原创 2022-01-22 23:30:09 · 543 阅读 · 0 评论 -
复原IP地址(Java)
根据题目描述,我们可以得到以下几个信息要把字符串划分为四个段,不能多用不能少用每个段必须要在0~255这个范围内每个段都不能包含前导0要将所有的ip地址都找到分析:对于整个字符串,每个段都有三种情况,分别是1位,2位,3位,而如果我们决定了某个段要用几位字符串,又可以从这一情况出发延伸出下一段的三种情况,直到把我们的字符串分成四段并且每一位都用完为止,对此,我们可以采用回溯法得到各种情况,对不满足条件的情况舍弃,满足条件的放到ArrayList中。图解:可以看到,对于101023这个字.原创 2022-01-17 23:30:01 · 686 阅读 · 0 评论 -
判断链表是否有环(Java)
快慢指针,如果有环,两指针一定会相遇注意:①空链表和一个元素的链表直接返回false②如果没环,快指针一定会先到null,所以只需判断快指针是否为null③注意空指针异常,快指针的next也要判断是否为nullpublic class Solution { public boolean hasCycle(ListNode head) { if(head == null || head.next == null) return false; ListNode.原创 2022-01-12 21:08:56 · 1143 阅读 · 0 评论 -
有序数组的平方(Java)
暴力法:使用Math.pow函数平方或者直接nums[i]*nums[i],Arrays.sort函数排序,时间复杂度为O(n+nlogn)class Solution { public int[] sortedSquares(int[] nums) { for(int i = 0;i < nums.length;i++){ // nums[i] = nums[i]*nums[i]; nums[i] = (int)Math.pow.原创 2022-01-10 16:52:45 · 566 阅读 · 0 评论 -
买卖股票的最好时机(Java)
第一种想到的方法时暴力法,果不其然,超时了。。。class Solution { public int maxProfit(int[] prices) { int money = 0; int maxMoney = 0; for(int i = 0;i < prices.length - 1;i++){ for(int j = i + 1;j < prices.length;j++){ .原创 2022-01-10 16:07:23 · 277 阅读 · 0 评论 -
最小路径和(Java)
初始化:使用dp[i][j]表示从i,j坐标到右下角的最小路径状态转移方程:dp[i][j] = grid[i][j] + Math.min(dp[i + 1][j],dp[i][j + 1]);注意:①当i=high-1时,只能向右走②当j=width-1时,只能向下走③当i=high-1&&j=width-1时,dp[i][j]=grid[i][j]代码:class Solution {public int minPathSum(int[][] grid) { .原创 2022-01-09 16:15:22 · 321 阅读 · 0 评论 -
岛屿的最大面积(Java)
该题与岛屿数量这道题类似,思路也差不多,可去岛屿数量这篇文章中看看思路和代码。思路:该题的思路就是在岛屿生成函数createIsLands中添加area参数,每次生成一个小岛屿就加1,递归调用自身,直到生成一个大岛屿,返回area,这个area就是这个大岛屿的面积,然后与当前最大面积比较,哪个大哪个是最大面积,遍历完整个二维数组之后,就可以得到岛屿的最大面积了代码:class Solution { public int maxAreaOfIsland(int[][] grid) { .原创 2022-01-09 15:32:09 · 853 阅读 · 0 评论 -
打家劫舍(Java)
动态规划dp[i] = max(dp[i - 2] + nums[i],dp[i - 1])class Solution { public int rob(int[] nums) { if(nums.length == 1) return nums[0]; int dp[] = new int[nums.length]; dp[0] = nums[0]; dp[1] = Math.max(nums[0],nums[1]); .原创 2022-01-08 16:13:52 · 209 阅读 · 0 评论 -
岛屿数量(Java)
分析:把1当成陆地,0当成海,简单来说只要上下左右如果是1的话就可以看成一个陆地,从示例中也可以很清楚的看懂。思路:用一个和grid大小一样的整型二维数组arr来代表岛屿的生成过程,遍历grid,如果遇到grid[i][j]=‘1’&&arr[i][j]=0(前者代表这是块陆地,后者表示要在arr中生成这块陆地),进入岛屿生产函数createIsLands,createIsLands函数首先要在arr中生成岛屿即arr[i][j]=1,然后判断这块岛屿的上下左右是否满足之前那个条件,.原创 2022-01-08 15:48:50 · 1534 阅读 · 0 评论 -
跳跃游戏(Java)
从后往前遍历,如果a[i] = 0,就说明一定要跳过这个0,否则不可能到达最后,遍历i下标之前的下标j,如果找不到a[j] > i - j,就说明跳不过这个0,返回false。注意:①当数组长度为1时,直接renturn true②当数组长度大于1并且a[0]=0时,直接return false③从后往前遍历时,第一个遍历的元素为倒数第二个元素class Solution { public boolean canJump(int[] nums) { if(nums..原创 2022-01-08 14:54:07 · 2778 阅读 · 0 评论 -
和为s的连续正数序列(Java)
使用双指针,初始化的时候,指针i指向开头,指针j指向i的下一个,对i和j中间序列求和,如果小于target令j++,再次求序列的和,直到等于target就把这个序列放到list中,大于就break并让i++,进行下次循环。(有一个小细节,可让循环的结束条件是i <= target / 2,因为当i大于这个数之后的所有序列和是必定大于target,可以减少一些执行时间)我写的可能有些繁琐了,不过思路应该是对的class Solution { public int[][] findCont.原创 2021-10-14 16:01:43 · 111 阅读 · 0 评论 -
反转链表(Java)
背过就行????class Solution { public ListNode reverseList(ListNode head) { if(head == null){ return null; } ListNode L1 = null; ListNode L2 = null; while(head != null){ L1 = head.next;原创 2021-10-14 16:23:09 · 103 阅读 · 0 评论 -
最小栈(Java)
构造方法:new一个Stack类对象push:每次push两个元素,第一个表示当前元素,第二个表示栈中最小元素。如果栈为空,直接push两次val,如果不为空,比较一下当前栈的最小元素和val哪个小,小的作为第二次push的元素。pop:直接pop两次。假如栈顶元素为最小的,pop两次后最小元素就会变成上一次最小的,假如栈顶元素不为最小的,pop两次后最小元素也不会变。top:先把最小元素使用peek方法取出,然后pop,再使用peek方法取栈顶元素,最后将最小元素push进去,return栈顶元素.原创 2021-10-30 15:08:51 · 149 阅读 · 0 评论 -
排序数组中两个数字之和(Java)
首选想到的是穷举法,时间复杂度位O(n^2)class Solution { public int[] twoSum(int[] numbers, int target) { int index[] = new int[2]; for(int i = 0;i < numbers.length;i++){ for(int j = i + 1;j < numbers.length;j++){ if(n.原创 2021-10-14 15:06:32 · 168 阅读 · 0 评论 -
最大重复子字符串(Java)
问题分析:在做题的过程中,发现还是需要注意到很多细节的,比如遍历的时候不能对每个索引进行判断,这样就不是连续子串了。在这个问题的回复,我发现了一个十分牛的思路,直接上代码吧,一般人应该都能看懂,或许可以应对大部分连续子串类的问题。代码:class Solution { public int maxRepeating(String sequence, String word) { int count = 0; String str = word; .原创 2021-09-19 13:50:04 · 158 阅读 · 0 评论 -
子数组最大平均数(滑动窗口Java)
滑动窗口解题模板:1.初始化第一个滑动窗口,取得第一个滑动窗口2.遍历第一个滑动窗口之后的每个索引,每次滑动,加上新添加进来的,减去之前滑动窗口的第一个值(每次滑动进行判断,直到最后一个滑动窗口)代码:class Solution { public double findMaxAverage(int[] nums, int k) { double sum = 0,avg; for(int i = 0;i < k;i++){ su.原创 2021-09-18 14:23:32 · 124 阅读 · 0 评论 -
汉诺塔问题(Java)
思路:将A中的前n-1的圆盘放到B中,(此时A为源柱,B为目的柱)将A中最后一个圆盘放到C中,(此时A为源柱,C为目的柱)将B中的n-1个圆盘放到C中。(此时B为源柱,C为目的柱)分析:利用递归即可,用到java中list的add,remove,size方法等代码:class Solution { public void hanota(List<Integer> A, List<Integer> B, List<Integer> C) { .原创 2021-09-08 19:36:51 · 88 阅读 · 0 评论 -
二叉树的前中后序遍历(Java)
前序:根左右中序:左根右后序:左右根解题思路:先访问左子树,再访问根结点,最后访问右子树,对于访问左子树和右子树的时候,同样以这样的方式访问,需要使用递归的方法访问整棵树。首先定义存储访问顺序的List对象,因为使用递归的时候不能一直定义List对象,所以需要写一个inorder方法,对于inorder方法,首先以左子树为参数递归调用,再将根结点的值存储到List中,最后再以右子树为参数递归调用。注意:应判断根结点、左子树和右子树是否为null,否则会产生空指针异常。前序遍历和后序遍历于中序.原创 2021-08-26 20:34:49 · 93 阅读 · 0 评论 -
杨辉三角(Java)
问题描述给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。在「杨辉三角」中,每个数是它左上方和右上方的数的和。示例1:示例2:问题分析观察杨辉三角,可以轻松地看出来最外层两侧的都为1如果看成一个二维数组的话,当j = 0或i = j,dp[i][j] = 1剩余位置的规律为左上方和右上方的数的和如果看成一个二维数组的话,为dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];由此可得状态转移方程:dp[i][j] = dp原创 2021-08-02 20:48:40 · 203 阅读 · 0 评论 -
爬楼梯(Java)
题目描述假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?**注意:**给定 n 是一个正整数。示例1:示例2:题目分析1阶楼梯只能上一阶,一种方法。2阶楼梯可以两次上一阶,也可以一次上两阶,两种方法。所以当n<=2时,直接返回n种方法。上n阶台阶的方法总和=上n-1阶台阶的方法数+上n-2阶台阶的方法数(因为最后可以一次上一阶台阶,也可以一次上两阶台阶,两种情况)状态转移方程:f(n) = f(n - 1)原创 2021-08-02 19:39:05 · 130 阅读 · 0 评论