leetecode
沐雨金鳞
大行不顾细谨
展开
-
并查集解决1584连接所有点的最小费用
import java.util.*;class Solution{ private class UnionFind{ // 节点的祖先节点 private int []parent; // 初始化,自己是自己的祖先 public UnionFind(int n){ this.parent = new int[n]; for(int i=0; i<n; i++)...原创 2021-01-19 10:57:58 · 325 阅读 · 0 评论 -
并查集解决721账户合并
解决方法:因为要使用并查集,所以要建立每个邮箱的地址:<邮箱, 索引> 建立并查集 插入数据,对每个人下面的邮箱,和第一个邮箱做合并 建立root地址对应邮箱同属一个人的集合:<root, List> 组合结果代码量比较多:import java.util.*;class Solution { private class UnionFind{ // 节点的祖先节点 private int []paren..原创 2021-01-18 21:01:33 · 247 阅读 · 0 评论 -
指针法解决5243同积元组
第一次做:用的DFS ,超时了????class Solution { int res = 0; public void dfs(int[]nums, int n, int j1, int j2, boolean sign[]){ if(j1 != 0 && j1 == j2 && n == 4){ res+=1; return; }原创 2021-01-17 14:38:52 · 313 阅读 · 0 评论 -
并查集解决803打砖块
看到这道题我的思路:把二维数组转成一维 把相邻的索引对记录下来 遍历敲打的数组: 如果敲打的地方没砖头,直接continue 如果有砖头: 把对应索引置0,删除该索引的相邻索引对 把剩下的相邻的索引对建立并查集 建立map数组,查看每个砖头可达的集合中是否包含与屋顶相连的索引,可达说明砖头没掉,不可达说明砖头掉了,集合中的全部都不可达屋顶,全部掉落 我的思路代码如下,结果可想而知.....import java.util.*;class Solutio原创 2021-01-16 20:13:45 · 292 阅读 · 0 评论 -
线段树数组实现解决307区域和检索
线段树数组实现的逻辑比较复杂......借此记录一下吧????详见https://leetcode-cn.com/problems/range-sum-query-mutable/solution/xian-duan-shu-zu-shou-hui-tu-xiang-yi-qing-er-chu-/class NumArray { int[] tree; int n; public NumArray(int[] nums) { n = nums.le原创 2021-01-14 09:27:06 · 184 阅读 · 0 评论 -
线段树解决729我的日程安排表I
这个题主要是学习线段树的使用:class MyCalendar { // 线段树的根 private SegmentTreeNode root; /** * 线段树结构体 */ private static class SegmentTreeNode { int start;// 时间开始区间 int end;// 时间结束区间 SegmentTreeNode left;// 区间左.原创 2021-01-13 11:55:50 · 253 阅读 · 0 评论 -
并查集求婴儿名字
学过之前的并查集后,发现就很简单了,简单的改造一下并查集,并且按照并查集的三步走策略,就做出来了:class Solution { private class UnionFind{ Map<String, String> parent = new HashMap<>(); public UnionFind(int n, String[] names){ for(int i=0; i<n;原创 2021-01-12 10:58:33 · 389 阅读 · 0 评论 -
1722-并查集求执行交换操作后的最小汉明距离
并查集操作一般步骤: 并查集模版套上 构建映射关系<root节点,集合> 执行相关操作,得到题目结果 看到题目后,首先我的做法是:将allowedSwaps分成可以互相交换的集合,比如[[0,1],[2,3]],分成两个集合[0,1]和[2,3] 对每个集合对应的下表排序,因为一个集合中的下标是可以随便排列的,souce=[1,2,3,4]每个集合子集排序后是[1,2,3,4],target每个子集排序后是[1,2,4,5] 然后比较每个位置不同数字..原创 2021-01-12 10:58:20 · 260 阅读 · 0 评论 -
并查集
并查集的详细讲解:https://oi-wiki.org/ds/dsu/#_6下题的详细解释:https://leetcode-cn.com/problems/smallest-string-with-swaps/solution/1202-jiao-huan-zi-fu-chuan-zhong-de-yuan-aob7/并查集的模版: private class UnionFind{ // 节点的祖先节点 private int []parent; .原创 2021-01-11 21:14:57 · 152 阅读 · 0 评论 -
组合问题(1至4)
前三道组合问题都是很简单的用递归就能解决的但是第四道用回溯就超时了,当然可以用记忆化搜索的方式,但是我看了题解后,决定记录一下最简单的动态规划的思路class Solution { private List<List<Integer>> res = new LinkedList<>(); private void dfs(int n, int k, LinkedList<Integer> ls, boolean sign[], i原创 2021-01-11 21:15:54 · 269 阅读 · 0 评论 -
两个栈实现队列
写这道题的原因是两次做法,时间是差距很大的,主要是记住:当第二个栈空的时候,再一次性导入,没必要每次都插进去!第一次做法:class CQueue { Stack<Integer> stack; Stack<Integer> stack2; public CQueue() { stack = new Stack<Integer>(); stack2 = new Stack<Intege...原创 2021-01-11 21:16:19 · 217 阅读 · 0 评论 -
两、三、四数之和
两次遍历就不写了,这里写双指针做法:class Data implements Comparable{ int num; int index; Data(int num, int index){ this.num = num; this.index = index; } @Override public int compareTo(Object o) { if(this.num < ((Da...原创 2021-01-11 21:16:30 · 219 阅读 · 0 评论 -
1458. 两个子序列的最大点积
这道题并不难,记录这道题的原因是因为他提供了动态规划两个数组的基本思路:二维矩阵形式思考一个数组放一行,一个数组放一列,这是很普遍的思考方式class Solution { public int maxDotProduct(int[] nums1, int[] nums2) { // dp[i][j] int dp[][] = new int[nums1.length][nums2.length]; for(in.原创 2020-11-19 09:51:37 · 277 阅读 · 0 评论 -
42. 接雨水
自己写的第一种做法:每次计算每个高度之间的雨水量卒!class Solution { private int getdata(int []height, int i){ int res = 0; // despite begin and end for(int k=0; k<height.length; k++){ if(height[k] < i){ res+=1;原创 2020-11-18 09:40:27 · 181 阅读 · 0 评论 -
406. 根据身高重建队列
输入:[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]][4,4]因为4最小,并且是第一个,所以固定放在索引4的位置上[5,0]前面没有比他大的,查看索引是否被前面比他数小的占了[5,2]前面有两个,索引往后走,除了比他小的数占的索引,走到第三个占下就行[6,1]前面有1个,同理走 ......重点:确定每次最小数的位置!!!import jav...原创 2020-11-16 10:52:56 · 143 阅读 · 0 评论 -
647. 回文子串 -> 中心扩展法
class Solution { private int expand(String s, int index){ if(index == s.length()-1){ return 1; } // self int res = 1; if(s.charAt(index) == s.charAt(index+1)){ res += 1; ...原创 2020-11-15 12:06:35 · 116 阅读 · 0 评论 -
不同的二叉搜索树
递归做的,666????原创 2020-10-11 12:43:18 · 159 阅读 · 0 评论 -
合并二叉树
简单题 但是细品很有意思 递归的模版题啊!!!原创 2020-10-10 20:41:14 · 188 阅读 · 0 评论 -
搜索二维矩阵
这个题有一个很简单的解法:从左下角的18开始,如果target比18大,则向右走,如果当前值比target小,则向上走 如果到达边界还不找不到,则return false,否则就会找到return trueclass Solution { public boolean searchMatrix(int[][] matrix, int target) { if(matrix.length == 0){ return false; }..原创 2020-10-10 13:53:39 · 155 阅读 · 0 评论 -
前缀树 Trie
摘自:leetecode208 实现前缀树Trie (发音为 "try") 或前缀树是一种树数据结构,用于检索字符串数据集中的键。一、应用:1. 自动补全2. 拼写检查3. IP 路由 (最长前缀匹配)4. T9 (九宫格) 打字预测二、 为什么使用前缀树三、Trie 树的结点结构四、常用操作1、向 Trie 树中插入键2、在 Trie 树中查找键3、查找 Trie 树中的键前缀...原创 2020-10-07 18:46:08 · 240 阅读 · 0 评论 -
三数之和
一开始用的递归做的,然后,,,,,,超时了????好吧,看了提示,说是双指针,那就做一下????,晚上宿舍聚餐去喽!!!import java.util.*;class Solution{ List<List<Integer>> res = new LinkedList<>(); Set<LinkedList<Integer>> set = new HashSet<>(); public List原创 2020-09-30 10:53:55 · 115 阅读 · 0 评论 -
如何用java写一个堆排序
至于啥是堆排序,这里就不细讲了,大家从网上查就可以了。第一步:给定一个数组,看成完全二叉树的形式(初始的堆结构) 给定一个索引,我们能够实现交换该索引在完全二叉树的位置 创建第一个方法,heapify // 递归交换数组中某一结点的值 private void heapify(int tree[], int n, int i){ /* tree:待排序数组 n:数组个数 i:某个结点原创 2020-09-28 15:15:07 · 249 阅读 · 0 评论 -
非递归实现二叉树先序、中序和后序遍历
平时都写递归的,非递归的都忘光光了,学习一下????非递归实现二叉树先序、中序和后序遍历用递归方式实现二叉树先序、中序和后序遍历很简单。用递归方法解决的问题都能用非递归的方法实现。递归就是利用函数栈来保存信息,如果用自己申请的数据结构来代替函数栈,也可以实现相同的功能。用非递归的方式实现二叉树的先序遍历(LeetCode144):1、申请一个栈stack,然后将头节点压入stack中。2、从stack中弹出栈顶节点,打印,再将其右孩子节点(不为空的话)先压入stack中,最后将其左孩转载 2020-09-25 08:42:43 · 571 阅读 · 0 评论 -
归并排序(链表)
其实和数组的思路是完全一样的:????class ListNode{ ListNode(int val){ this.val = val; } int val; ListNode next;}class Solution{ // 取中间结点 private ListNode getMid(ListNode head){ if(head == null || head.next == null){原创 2020-09-22 20:24:39 · 240 阅读 · 0 评论 -
归并排序(数组)
前两天看了数组的归并排序代码,今天想想流程,自己写了下,发现了一个容易写错的点: // 赋值 for(int x = 0; x < index; x++){ nums[left+x] = temp[x]; }就是这一步,注意复值别错了????import java.util.Arrays;class Solution{ // 归并排序 public void gbpx(int nums[], i原创 2020-09-22 19:44:11 · 677 阅读 · 0 评论 -
5520. 拆分字符串使唯一子字符串的数目最大
不会,记录下来先????import java.util.HashSet;import java.util.Set;class Solution { int max = 0; Set<String> set = new HashSet<>(); public int maxUniqueSplit(String s) { dfs(0, 0, 1, s); return max; } private原创 2020-09-21 09:34:00 · 325 阅读 · 0 评论 -
538. 把二叉搜索树转换为累加树
虽说是个简单题,如果不好好做,还真做不出来....../** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { // 代表前面结点值的加和 private in原创 2020-09-21 09:18:36 · 164 阅读 · 0 评论 -
归并排序(数组)
思路:递归进去、排序小范围数据 递归出来、排序大范围数据import java.util.Arrays;public class MergeSort { public static void sort(int []arr){ int []temp = new int[arr.length];//在排序前,先建好一个长度等于原数组长度的临时数组,避免递归中频繁开辟空间 sort(arr,0,arr.length-1,temp); }..原创 2020-09-20 09:52:49 · 660 阅读 · 0 评论 -
79. 单词搜索
为什么记录这道题,虽然不难,但是需要注意几点:设置标志位sign,防止重复取元素 sign别忘了清空和重置class Solution{ private boolean dfs(int index, String word, String str, int i, int j, char[][] board, boolean sign[][]){ // 唯一一个返回true的,只要它返回true,那就会直接返回了,不会再遍历 if(str.equ...原创 2020-09-13 09:01:32 · 117 阅读 · 0 评论 -
95. 不同的二叉搜索树 II
对这种题我真的是无从下手啊????,加个????记录一下啊啊啊啊啊啊!!!!!!!!class TreeNode { int val; TreeNode left; TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { this.val = val;原创 2020-09-11 09:48:26 · 143 阅读 · 0 评论 -
96. 不同的二叉搜索树
真心不会。。。。。。class Solution { public int numTrees(int n) { int[] dp = new int[n+1]; dp[0] = 1; dp[1] = 1; for(int i = 2; i < n + 1; i++) for(int j = 1; j < i + 1; j++) dp[...原创 2020-09-11 09:18:59 · 133 阅读 · 0 评论 -
39. 组合总和
这道题很简单,为什么要写这道题呢?因为一开始我没写index,导致我不知道怎么对res中的重复出现的list去重,加上index之后,自动就达到了去重的效果!public class Solution { List<List<Integer>> res = new LinkedList<>(); private void dfs(int[] candidates, int target, int sum, LinkedList&l原创 2020-09-09 08:32:47 · 145 阅读 · 0 评论 -
1291. 顺次数
怎么说呢,这种题已经挡不住我了????import java.util.LinkedList;import java.util.List;class Solution { List<Integer> res = new LinkedList<>(); private void dfs(String s, int len, boolean sign[], int low, int high, int index){ if(s.原创 2020-09-08 09:39:56 · 193 阅读 · 1 评论 -
1219. 黄金矿工
之前写过一个类似的,这种回溯的其实并不用对sum进行设置:class Solution { int ml = 0; private void dfs(int[][] grid, int i, int j, boolean sign[][], int sum){ ml = Math.max(ml, sum); // 如果出界 if(i < 0 || j < 0 || i == grid.length || j ==..原创 2020-09-08 09:07:13 · 103 阅读 · 0 评论 -
1011. 在 D 天内送达包裹的能力
中等题,看起来不简单,怎么想动态规划也想不出来,然后想了想用基本方法去做:先把前D个物品放进前D天里 然后遍历之后的物品,如果比前面的前D个物品最大值大,则遍历前面D个物品的每相邻两个值的加和,取最小的,重置D数组最后,发现不对....看了答案,怎么说呢,就是一个二分搜索,看起来简单的一批,可是自己是绝对不会写出来这样的代码的.....思路问题????class Solution { public int shipWithinDays(int[] weights, int D)原创 2020-09-06 10:04:59 · 191 阅读 · 0 评论 -
剑指 Offer 48. 最长不含重复字符的子字符串
import java.util.HashMap;import java.util.Map;class Solution { public int lengthOfLongestSubstring(String s) { int res = 0; int len = 0; int idx = 0; // 某个字符 + 出现位置 Map<Character, Integer> map = ne...原创 2020-09-05 09:53:00 · 173 阅读 · 0 评论 -
357. 计算各个位数不同的数字个数
为什么记录这个呢?因为自己想了个很爽的方法????:class Solution { int res = 0; private void dfs(int n, int[]nums, boolean[]sign, String s){ if(s.length() == n){ res++; return; } for(int i=0; i<10; i++){原创 2020-09-04 16:43:46 · 178 阅读 · 0 评论 -
257. 二叉树的所有路径
简单题,做的心态很崩,不知道开始出现了什么错误,一直bug...................................怕不是一跃回到解放前了????import java.util.LinkedList;import java.util.List;class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; }}class Solution {原创 2020-09-04 09:00:03 · 189 阅读 · 0 评论 -
5500. 乘积为正数的最长子数组长度
看起来很简单,做起来很捉急,唉,记录下来以后看 ????import java.util.LinkedList;import java.util.List;class Solution{ public int getMaxLen(int[] nums) { int pre = -1; List<Integer> ls = new LinkedList<>(); int res = 0; for(原创 2020-08-30 15:01:18 · 272 阅读 · 0 评论 -
417. 太平洋大西洋水流问题
开始的思路:遍历每个点,进行递归搜索,然后记录下能够到达太平洋和大西洋的点,从别的点再次遍历到能达到的点时,直接返回(因为遍历到的点能够到大西洋和太平洋,所以该点也能到,就不用递归了)然后,超时!!!其实有个小技巧,就是直接从四个边界的点开始搜索,凡是从上边界和左边界能搜索到的,都是能达到太平洋的,凡是从下边界和右边界能搜索到的,都是能到达大西洋的,然后两个记录的数组进行对比,直接就能得出来能到达大西洋和太平洋的点代码:class Solution{ List<Li..原创 2020-08-29 09:16:17 · 345 阅读 · 0 评论