diff --git a/code/lc144.java b/code/lc144.java index dae25c583d0fd140bec5e30f9958db445643f058..d7e5407639f5cc53b0dd05ce0c63842886c395c9 100644 --- a/code/lc144.java +++ b/code/lc144.java @@ -5,7 +5,7 @@ package code; * 难度:Medium * 分类:Stack, Tree * 思路:左节点依次入栈 - * Tips:和lc94中序,lc145后序一起看 + * Tips:和lc94中序,lc145后序一起看, lc102 */ import java.util.ArrayList; import java.util.List; diff --git a/code/lc145.java b/code/lc145.java index ac1f7c8587c0beb0452fd759c7342570637d09c0..63650213b3d655cf7ea05bbaef54a05bbc53ab84 100644 --- a/code/lc145.java +++ b/code/lc145.java @@ -35,4 +35,5 @@ public class lc145 { Collections.reverse(res); //反转链表 return res; } + } diff --git a/code/lc199.java b/code/lc199.java new file mode 100644 index 0000000000000000000000000000000000000000..2e9c3435c7265953ce9fa62b642aa5ebb41e4efa --- /dev/null +++ b/code/lc199.java @@ -0,0 +1,59 @@ +package code; +/* + * 199. Binary Tree Right Side View + * 题意:二叉树的右视图 + * 难度:Medium + * 分类:Tree, Depth-first Search, Breadth-first Search + * 思路:1.记录当前递归最大深度,每次把第一次出现深度的节点值输出即可 + * 2.层次遍历 + * Tips: + */ +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +public class lc199 { + public class TreeNode { + int val; + TreeNode left; + TreeNode right; + TreeNode(int x) { + val = x; + } + } + + int max_depth = 0; + List res = new ArrayList(); + public List rightSideView(TreeNode root) { + dfs(root, 1); + return res; + } + + public void dfs(TreeNode root, int depth){ + if(root==null) return; //别忘了null + if(depth>max_depth) { + max_depth = depth; + res.add(root.val); + } + dfs(root.right, depth+1); + dfs(root.left, depth+1); + } + + public List rightSideView2(TreeNode root) { + List res = new ArrayList(); + Queue qu = new LinkedList(); //是一个队列,用LinkedList + if(root!=null) qu.add(root); + while(!qu.isEmpty()){ + int size = qu.size(); + while(size>0){ + TreeNode tn = qu.remove(); + if(size==1) res.add(tn.val); //==1的时候添加 + if(tn.left!=null) qu.add(tn.left); + if(tn.right!=null) qu.add(tn.right); + size--; + } + } + return res; + } +} diff --git a/code/lc206.java b/code/lc206.java index e8794e44fb2b25ff59266c5e4fb02b6c42e2e721..341aa8dfad87303b2acc4d861e7017a373e53fd8 100644 --- a/code/lc206.java +++ b/code/lc206.java @@ -15,24 +15,24 @@ public class lc206 { } public ListNode reverseList(ListNode head) { - ListNode newHead = null; //头节点变成尾节点,最后要指向null - while (head != null) { + ListNode pre = null; //头结点变尾节点,指向null + while(head!=null){ ListNode next = head.next; - head.next = newHead; - newHead = head; + head.next = pre; + pre = head; head = next; } - return newHead; + return pre; } public ListNode reverseList2(ListNode head) { //递归 return reverseListInt(head, null); } - private ListNode reverseListInt(ListNode head, ListNode newHead) { + private ListNode reverseListInt(ListNode head, ListNode pre) { if (head == null) - return newHead; + return pre; ListNode next = head.next; - head.next = newHead; + head.next = pre; return reverseListInt(next, head); //尾递归,操作已经完成,最后返回最后结果罢了 } } diff --git a/code/lc493.java b/code/lc493.java new file mode 100644 index 0000000000000000000000000000000000000000..20eabbe3eb3d52059583de3d88baebde7e9c8110 --- /dev/null +++ b/code/lc493.java @@ -0,0 +1,82 @@ +package code; + +import java.util.Arrays; + +/* + * 493. Reverse Pairs + * 题意:逆序对 + * 难度:Hard + * 分类: + * 思路:归并排序的思路 或者 树相关的数据结构 + * 排序前先count + * 负数怎么解决? 不用考虑,因为排序前先count + * Tips: + */ +public class lc493 { + public static void main(String[] args) { + reversePairs(new int[]{1,3,2,3,1}); + System.out.println(res); + } + + static int res = 0; + public static int reversePairs(int[] nums) { + mergeSort(nums, 0, nums.length-1); + return res; + } + + public static void mergeSort(int[] nums, int left, int right){ + if(leftright||nums[pos1]<=(double)nums[pos2]*2) { + pos1++; + res+=count; + } + else{ + pos2++; + count++; + } + } + + Arrays.sort(nums, left, right + 1); + +// int[] nums_copy = nums.clone(); //耗时,大样例过不了 +// pos1 = left; //注意pos1, pos2重新赋值 +// pos2 = mid+1; +// int cur = left; +// while( pos1<=mid && pos2<=right ){ +// if(nums_copy[pos1]<=nums_copy[pos2]){ +// nums[cur] = nums_copy[pos1]; +// pos1++; +// cur++; +// } else { +// nums[cur] = nums_copy[pos2]; +// pos2++; +// cur++; +// } +// } +// while(pos1<=mid){ +// nums[cur] = nums_copy[pos1]; +// cur++; +// pos1++; +// } +// while(pos2<=right){ +// nums[cur] = nums_copy[pos2]; +// cur++; +// pos2++; +// } + } + + +} diff --git a/code/lc94.java b/code/lc94.java index 84270eda41e31d962c6d0ae159af7dc674b7a5f2..1f93c8191c4a68c7f9a53656708aad0a34f75f63 100644 --- a/code/lc94.java +++ b/code/lc94.java @@ -34,4 +34,16 @@ public class lc94 { } return res; } + + List res = new ArrayList(); + public List inorderTraversal2(TreeNode root) { //递归 + helper(root); + return res; + } + public void helper(TreeNode root){ + if(root==null) return; + helper(root.left); + res.add(root.val); + helper(root.right); + } }