![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Lintcode
阿飞算法
这个作者很懒,什么都没留下…
展开
-
1031 · 图可以被二分么?
1031 · 图可以被二分么? public boolean isBipartite(int[][] graph) { int V = graph.length; Queue<Integer> q = new LinkedList<>(); int[] colors = new int[V]; for (int i = 0; i < V; i++) {原创 2021-08-09 11:15:07 · 66 阅读 · 0 评论 -
293 · 隧道的深度
293 · 隧道的深度public int FindDepth(int[][] matrix) { int m = matrix.length, n = matrix[0].length; int lo = 0, hi = m - 1; while (lo <= hi) { int mid = lo + hi >> 1; int count = 0; for (int i = 0; i < n; i++) {原创 2021-08-05 22:38:50 · 77 阅读 · 0 评论 -
1371 · 链表组件
1371 · 链表组件public int numComponents(ListNode head, int[] G) { Set<Integer> set = new HashSet<>(); for (int x : G) set.add(x); int res = 0; while (head != null) { if (set.contains(head.val) && (head.next == null原创 2021-08-04 23:20:46 · 108 阅读 · 0 评论 -
1476 · 山形数组的顶峰坐标
1476 · 山形数组的顶峰坐标public int peakIndexInMountainArray(int[] A) { int n = A.length - 1, lo = 0, hi = n - 1; while (lo < hi) { int mid = lo + hi >> 1; if (A[mid] < A[mid + 1]) lo = mid + 1; else hi = mid; }原创 2021-08-03 09:45:32 · 105 阅读 · 0 评论 -
1272 · 有序矩阵中的第K小元素
1272 · 有序矩阵中的第K小元素int n;public int kthSmallest(int[][] matrix, int k) { this.n = matrix.length; int lo = matrix[0][0], hi = matrix[n - 1][n - 1]; while (lo < hi) { int mid = lo + hi >> 1; int count = check(matrix, mi原创 2021-08-02 10:53:52 · 62 阅读 · 0 评论 -
58 · 四数之和
58 · 四数之和public List<List<Integer>> fourSum(int[] nums, int target) { List<List<Integer>> res = new ArrayList<>(); Arrays.sort(nums); int n = nums.length; for (int i = 0; i < n - 3; i++) { if (i >原创 2021-07-31 07:07:38 · 74 阅读 · 0 评论 -
891 · 有效回文 II
891 · 有效回文 II左右各去掉一个判断public boolean validPalindrome(String s) { int n = s.length(), l = 0, r = n - 1; while (l < r) { if (s.charAt(l) != s.charAt(r)) { return check(s, l + 1, r) || check(s, l, r - 1); } l原创 2021-07-30 16:54:30 · 88 阅读 · 0 评论 -
415 · 有效回文串
415 · 有效回文串注意数组下标越界:转大小写利用位运算:位运算操作常见技巧public boolean isPalindrome(String s) { int n = s.length(), l = 0, r = n - 1; while (l < r) { while (l < r && !(Character.isLetter(s.charAt(l)) || Character.isDigit(s.charAt(l)))) l+原创 2021-07-30 16:45:05 · 62 阅读 · 0 评论 -
928 · 最多有两个不同字符的最长子串
928 · 最多有两个不同字符的最长子串方法1 public int lengthOfLongestSubstringTwoDistinct(String s) { int i = 0, j = 0; int[] dict = new int[256]; int cnt = 0; int res = 0; for (; i < s.length(); i++) {原创 2021-07-22 18:03:07 · 106 阅读 · 0 评论 -
309 · 交叉数组
309 · 交叉数组 public int[] interleavedArray(int[] A, int[] B) { int m = A.length, n= B.length; int i = 0, j = 0; int[] res = new int[m+n]; int idx = 0; while(i<m){ res[idx++] = A[i++]; res原创 2021-07-22 17:38:21 · 65 阅读 · 0 评论 -
547 · 两数组的交集
547 · 两数组的交集public int[] intersection(int[] nums1, int[] nums2) { Arrays.sort(nums1); Arrays.sort(nums2); List<Integer> resList = new ArrayList<>(); int i = 0, j = 0; while (i < nums1.length && j < nums2.lengt原创 2021-07-22 10:03:18 · 49 阅读 · 0 评论 -
868 · 子数组的最大平均值
868 · 子数组的最大平均值public double findMaxAverage(int[] nums, int k) { int i = 0, j = 0; int sum = 0; double res = 0.0; while (j < nums.length) { while (j - i + 1 <= k) { sum += nums[j++]; } res = Math.m原创 2021-07-22 09:47:09 · 87 阅读 · 0 评论 -
174 · 删除链表中倒数第n个节点
174 · 删除链表中倒数第n个节点public ListNode removeNthFromEnd(ListNode head, int n) { ListNode dummy = new ListNode(-1); dummy.next = head; ListNode fast = head; ListNode slow = head; ListNode prev = dummy; for (int i = 0; i < n; i++) fast原创 2021-07-21 09:54:28 · 61 阅读 · 0 评论 -
1824 · 最频繁出现的子串
1824 · 最频繁出现的子串public int getMaxOccurrences(String s, int minLength, int maxLength, int maxUnique) { int[] arr = new int[26]; int j = 0; int unique_char = 0; Map<String, Integer> map = new HashMap<>(); for (int i = 0; i <原创 2021-07-20 09:17:58 · 144 阅读 · 0 评论 -
521 · 去除重复元素
521 · 去除重复元素使用set标记元素是否出现过,当出现不一样的值的时候,i,j两个指针开始错位 public int deduplication(int[] nums) { Set<Integer> set = new HashSet<>(); int i = 0, j = 0; while (j < nums.length) { while (!原创 2021-07-16 09:41:04 · 74 阅读 · 0 评论 -
475 · 二叉树的最大路径和 II
475 · 二叉树的最大路径和 II方法1:DFSpublic int maxPathSum2(TreeNode root) { if(root == null) return 0; int res = dfs(root); return Math.max(res,root.val);}private int dfs(TreeNode root) { if (root == null) return 0; int l = dfs(root.left);原创 2021-07-15 08:30:29 · 111 阅读 · 0 评论 -
68 · 二叉树的后序遍历
68 · 二叉树的后序遍历方法1:DFSList<Integer> res = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) { dfs(root); return res;}private void dfs(TreeNode root) { if(root ==null) return; dfs(root.left);原创 2021-07-14 14:19:35 · 50 阅读 · 0 评论 -
68 · 二叉树的后序遍历
68 · 二叉树的后序遍历方法1:DFSList<Integer> res = new ArrayList<>();public List<Integer> postorderTraversal(TreeNode root) { dfs(root); return res;}private void dfs(TreeNode root) { if(root ==null) return; dfs(root.left);原创 2021-07-14 08:35:14 · 64 阅读 · 0 评论 -
472 · 二叉树的路径和 III
472 · 二叉树的路径和 III先中序遍历获取每一个节点做dfs,以每个节点做为起点开始做回溯方法1:DFSList<List<Integer>> res = new ArrayList<>(); public List<List<Integer>> binaryTreePathSum3(ParentTreeNode root, int target) { if (root == null)原创 2021-07-13 09:09:26 · 85 阅读 · 0 评论 -
760 ·二叉树的右视图
760 · 二叉树的右视图方法1:BFSpublic List<Integer> rightSideView(TreeNode root) { List<Integer> res = new ArrayList<>(); if(root == null) return res; Queue<TreeNode> q = new LinkedList<>(); q.offer(root); while (!q原创 2021-07-12 18:48:11 · 60 阅读 · 0 评论 -
1108 · 寻找重复的子树
1108 · 寻找重复的子树方法1:DFS/** * 将一棵二叉树的所有结点作为根节点进行序列化,记录该前序序列化字符串出现的次数。 * 1、如果出现的次数大于1,那么就说明该序列重复出现。 * 2、如果等于1,说明在这之前遇到过一次节点。 * 最后统计完重复的后,返回结果;如果是空结点的话,返回一个任意非空字符串。 */List<TreeNode> res = new ArrayList<>();Map<String, Integer> map = n原创 2021-07-11 10:39:26 · 83 阅读 · 0 评论 -
1197 · 寻找树中最左下结点的值
1197 · 寻找树中最左下结点的值方法1:BFSpublic int findBottomLeftValue(TreeNode root) { Queue<TreeNode> q = new LinkedList<>(); int res = 0; q.offer(root); while (!q.isEmpty()) { int size = q.size(); for (int i = 0; i < si原创 2021-07-10 07:21:53 · 123 阅读 · 0 评论 -
242 · 将二叉树按照层级转化为链表
242 · 将二叉树按照层级转化为链表方法1:BFS层序遍历 public List<ListNode> binaryTreeToLists(TreeNode root) { List<ListNode> res = new ArrayList<>(); if (root == null) return res; Queue<TreeNode> q = new Linke原创 2021-07-09 09:53:18 · 71 阅读 · 0 评论 -
597 · 具有最大平均数的子树
597 · 具有最大平均数的子树方法1:DFS /** * 步骤如下: * * 1.对于一个根结点root,递归的遍历左右子树,返回左右子树的权值和与节点数目,从而得到根结点root以及所有子孙节点作为子树的权值sum和与节点数目num。 * sum = left_sum + right_sum + root.val * num = left_num + right_num + 1 * 2原创 2021-07-08 08:49:22 · 171 阅读 · 0 评论 -
246 · 二叉树的路径和 II
246 · 二叉树的路径和 II方法1:DFS从sub的末尾开始往前搜 List<List<Integer>> res = new ArrayList<>(); int target; public List<List<Integer>> binaryTreePathSum2(TreeNode root, int target) { // write your cod原创 2021-07-07 18:10:35 · 138 阅读 · 0 评论 -
915 · BST的中序前驱节点
915 · BST的中序前驱节点方法1:DFSTreeNode prev;TreeNode p;//中序遍历:首先遍历左子树,然后访问根节点,最后遍历右子树(左->根->右)public TreeNode inorderPredecessor(TreeNode root, TreeNode p) { this.p = p; dfs(root); return prev;}private void dfs(TreeNode root) { if原创 2021-07-06 09:52:49 · 330 阅读 · 0 评论 -
97 · 二叉树的最大深度
97 · 二叉树的最大深度方法1:DFS public int maxDepth(TreeNode root) { // write your code here return root==null?0:Math.max(maxDepth(root.left),maxDepth(root.right))+1; }原创 2021-07-05 10:09:50 · 60 阅读 · 0 评论 -
11.二叉查找树中搜索区间
11 · 二叉查找树中搜索区间方法1:DFSList<Integer> res = new ArrayList<>();public List<Integer> searchRange(TreeNode root, int k1, int k2) { dfs(root, k1, k2); return res;}private void dfs(TreeNode root, int k1, int k2) { if (root ==原创 2021-07-04 17:00:53 · 127 阅读 · 0 评论 -
1181 · 二叉树的直径
1181 · 二叉树的直径方法1:DFS //1.经过根节点,左右子树的最大深度相加 //2.不经过根节点,找出根节点的左子树或者根节点的右子树作为根节点的最长路径 int maxv = 0; public int diameterOfBinaryTree(TreeNode root) { // write your code here dfs(root); return原创 2021-07-03 20:40:33 · 63 阅读 · 0 评论 -
1195 · 找出树中每行的最大值
1195 · 找出树中每行的最大值方法1:BFS+层序遍历public List<Integer> largestValues(TreeNode root) { // write your code here Queue<TreeNode> q = new LinkedList<>(); q.offer(root); List<Integer> res = new ArrayList<>(); while原创 2021-07-02 09:23:20 · 62 阅读 · 0 评论 -
164 · 不同的二叉查找树 II
164 · 不同的二叉查找树 II方法1:DFS按[start...root−1][start...root-1][start...root−1] 与[root+1...end][root+1...end][root+1...end]递归建树 public List<TreeNode> generateTrees(int n) { return helper(1, n); } private List<Tre原创 2021-07-01 18:28:42 · 62 阅读 · 0 评论