- 博客(23)
- 收藏
- 关注
原创 【二叉树 左右视图】可用BFS
leetcode199给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。右视图遇到一层就添加一个Int,若深度没变则更新res(index)class Solution { List<Integer> res = new ArrayList<>(); public List<Integer> rightSideView(TreeNode root) { if(root == null)
2021-02-18 17:12:35 150
原创 【二叉树 验证】
验证二叉搜索树BSTleetcode98中序遍历,如果有降序就不是class Solution { long preValue = Long.MIN_VALUE; public boolean isValidBST(TreeNode root) { if(root == null) return true; boolean isLeft = isValidBST(root.left); if(!isLeft)
2021-02-17 23:37:20 211
原创 【完全二叉树节点数量】
完全二叉树的左右子树至少有一个是满二叉树如果左子树的高度等于右子树高度+1, 那么右子树必然是一颗满二叉树如果左子树的高度等于右子树高度,那么左子树必然是一颗满二叉树100 28class Solution { public int countNodes(TreeNode root) { if(root == null) return 0; int leftH = getH(root.left); int rightH = ge
2021-02-17 23:23:57 221
原创 【二叉树 两节点最近公共祖先】
leetcode206这就是一个后序遍历的模型,每个父节点都会接收子节点的状态(是否含有p、q)并将这个状态往上传递,直到该结点满足祖先节点的条件。这样一想就豁然开朗了class Solution { public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { if(root == p || root == q || root == null) return root;
2021-02-15 23:27:24 202 1
原创 【二叉树 重建二叉树】
前序中序构建leetcode105根据中序遍历和前序遍历可以确定二叉树,具体过程为:根据前序序列第一个结点确定根结点根据根结点在中序序列中的位置分割出左右两个子序列对左子树和右子树分别递归使用同样的方法继续分解例如:前序序列{1,2,4,7,3,5,6,8} = pre中序序列{4,7,2,1,5,3,8,6} = in根据当前前序序列的第一个结点确定根结点,为 11 找到 1 在中序遍历序列中的位置,为 in[3]2 切割左右子树,则 in[3] 前面的为左子树, in[3] 后面的
2021-02-15 22:13:43 114
原创 【二叉树 遍历】
leetcode94普通遍历前序:根 左 右中序:左 根 右后序:左 右 根求节点public int getTreeSize(TreeNode root){ if(root == null) return 0; return 1 + getTreeSize(root.left) + getTreeSize(root.right); }递归实现class Solution { List<Integer> r
2021-02-15 00:13:19 123
原创 【链表 分隔链表】双指针
leetcode86给你一个链表和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前。你应当保留两个分区中每个节点的初始相对位置。输入:head = 1->4->3->2->5->2, x = 3输出:1->2->2->4->3->5class Solution { public ListNode partition(ListNode head, int x) {
2021-02-05 02:05:29 106
原创 【链表 重排链表】
leetcode143给定一个单链表 L:L0→L1→…→Ln-1→Ln ,将其重新排列后变为: L0→Ln→L1→Ln-1→L2→Ln-2→…给定链表 1->2->3->4, 重新排列为 1->4->2->3.给定链表 1->2->3->4->5, 重新排列为 1->5->2->4->3.找到中点将中点后的反转连接两链表class Solution { public void reorder
2021-02-05 01:25:22 207
原创 【链表 链表求和】
倒序leetcode输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { ListNode result = new ListNode(0); ListNode head = result;
2021-01-31 02:41:45 149
原创 【链表 合并有序链表】
合并两个有序链表将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。leetcode21class Solution { public ListNode mergeTwoLists(ListNode l1, ListNode l2) { ListNode result = new ListNode(-1); ListNode head = result; while(l1 != null
2021-01-31 01:19:17 74
原创 【约瑟夫环】动态规划
详解leetcode0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。class Solution { public int lastRemaining(int n, int m) { int last = 0;
2021-01-31 00:41:15 169
原创 【数组 合并有序数组】双指针
leetcode88给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nums2 的元素逆向双指针,可以防止覆盖时间 O(m+n)空间 O(1)class Solution { public void merge(int[] nums1, int m, int[]
2021-01-30 22:48:57 114
原创 【链表 奇偶链表】
给定一个单链表,把所有的奇数节点和偶数节点分别排在一起。请注意,这里的奇数节点和偶数节点指的是节点编号的奇偶性,而不是节点的值的奇偶性。leetcode328//画图理解class Solution { public ListNode oddEvenList(ListNode head) { if(head == null || head.next == null) return head; //奇数 ListNode odd =
2021-01-30 01:35:16 143
原创 【链表 相交链表】
leetcode60编写一个程序,找到两个单链表相交的起始节点如果两个链表没有交点,返回 null可假定整个链表结构中没有循环public class Solution { public ListNode getIntersectionNode(ListNode headA, ListNode headB) { ListNode a = headA; ListNode b = headB; while(a != b){
2021-01-29 23:52:45 105
原创 【链表 旋转链表】
leetcode61给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。输入: 1->2->3->4->5->NULL, k = 2输出: 4->5->1->2->3->NULL给 k 取模 k % = len(链表长度)fast 指向尾部(fast 指向 5)slow 指向反转部分的前一个结点(slow 指向 3)class Solution { public ListNode rota
2021-01-29 22:28:14 97
原创 【链表 删除排序链表中重复元素】
处理排序链表保证数字只出现一次leetcode83如果下一个点和当前点不同,则删除下一个点如果下一个点和当前点相同,则移动到下一个点class Solution { public ListNode deleteDuplicates(ListNode head) { ListNode curr = head; while(curr != null){ //下一个点不为空;下一个点等于当前点 if(curr.nex
2021-01-28 22:17:02 93
原创 【链表 移除链表指定元素】双指针
leetcode203删除链表中等于给定值 val 的所有节点slow fast 只是指针不存储值,更改的是next的指向。class Solution { public ListNode removeElements(ListNode head, int val) { ListNode result = new ListNode(0); result.next = head; ListNode slow = result; Li
2021-01-25 01:15:22 145
原创 【数组 删除排序数组中的重复项】双指针
leetcode26class Solution { public int removeDuplicates(int[] nums) { int len = 0; //表首不需要判断 for(int i = 1; i < nums.length; i++){ if(nums[len] != nums[i]){ len++; nums[len] = nums[
2021-01-24 01:40:30 129
原创 【数字 快乐数】双指针
快乐数leetcode202class Solution { public int getNext(int n){ int total = 0; while(n > 0){ int d = n % 10; n = n / 10; total += d * d; } return total; } public boolean isHap
2021-01-24 00:43:31 121
原创 【数组 重复元素】二分查找 双指针
存在重复元素1 判断存在leetcode(217)排序class Solution { public boolean containsDuplicate(int[] nums) { Arrays.sort(nums); for (int i = 0; i < nums.length - 1; ++i) { if (nums[i] == nums[i + 1]) { return true;
2021-01-23 23:29:55 321
原创 【链表 反转链表】 双指针
反转链表leetcode(206)双指针/** 时间O(n) 空间O(1) * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * } */class Solution { public ListNode reverseList(ListNode head) {
2021-01-19 21:39:42 268
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人