diff --git "a/Week_01/id_20/LeetCode_21_\351\200\222\345\275\222\345\256\236\347\216\260" "b/Week_01/id_20/LeetCode_21_\351\200\222\345\275\222\345\256\236\347\216\260" new file mode 100644 index 00000000..c3533358 --- /dev/null +++ "b/Week_01/id_20/LeetCode_21_\351\200\222\345\275\222\345\256\236\347\216\260" @@ -0,0 +1,36 @@ +/** + * 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 + * + * 示例: + * + * 输入:1->2->4, 1->3->4 + * 输出:1->1->2->3->4->4 + * + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if(l1 == null) { + return l2; + } + if(l2 == null) { + return l1; + } + ListNode head = null; + + if(l1.val < l2.val) { + head = l1; + head.next = mergeTwoLists(l1.next,l2); + } else { + head = l2; + head.next = mergeTwoLists(l1,l2.next); + } + return head; + + } +} diff --git "a/Week_01/id_20/LeetCode_21_\351\223\276\350\241\250\345\256\236\347\216\260" "b/Week_01/id_20/LeetCode_21_\351\223\276\350\241\250\345\256\236\347\216\260" new file mode 100644 index 00000000..6a520dcb --- /dev/null +++ "b/Week_01/id_20/LeetCode_21_\351\223\276\350\241\250\345\256\236\347\216\260" @@ -0,0 +1,59 @@ +/** + * 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 + * + * 示例: + * + * 输入:1->2->4, 1->3->4 + * 输出:1->1->2->3->4->4 + * + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if(l1 == null) { + return l2; + } + if(l2 == null) { + return l1; + } + ListNode head = null; + //用于扫描l1 + ListNode p1 = l1; + //用于扫描l2 + ListNode p2 = l2; + if(l1.val < l2.val) { + head = l1; + p1 = l1.next; + } else { + head = l2; + p2 = l2.next; + } + ListNode p = head;//p指向合并列表的最新节点 + while(p1 !=null && p2 != null) { + //比较插入2个链表中元素的大小 + if(p1.val < p2.val) { + //p1插入p后面 + p.next = p1; + p1 = p1.next; + } else { + //p2插入p后面 + p.next = p2; + p2 = p2.next; + } + p = p.next; + } + + if(p1 != null) { + p.next = p1; + } else if(p2 != null){ + p.next = p2; + } + return head; + + } +} diff --git a/Week_01/id_20/LeetCode_24_020.java b/Week_01/id_20/LeetCode_24_020.java new file mode 100644 index 00000000..208ba3bc --- /dev/null +++ b/Week_01/id_20/LeetCode_24_020.java @@ -0,0 +1,35 @@ +/** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +class Solution { + public ListNode swapPairs(ListNode head) { + ListNode dummy = new ListNode(0); + dummy.next = head; + ListNode p = dummy; + ListNode h = head; + + while (h != null) { + if (h != null && h.next != null) { + ListNode tmp = h.next; + //p指向两个节点中的第二个节点 + p.next = tmp; + //交换位置 + h.next = h.next.next; + tmp.next = h; + + //继续遍历 + p = p.next.next; + h = h.next; + } else { + p.next = h; + h = h.next; + } + } + return dummy.next; + } +} diff --git "a/Week_01/id_20/LeetCode_441_\344\272\214\345\210\206\346\270\220\350\277\233" "b/Week_01/id_20/LeetCode_441_\344\272\214\345\210\206\346\270\220\350\277\233" new file mode 100644 index 00000000..bde2108c --- /dev/null +++ "b/Week_01/id_20/LeetCode_441_\344\272\214\345\210\206\346\270\220\350\277\233" @@ -0,0 +1,19 @@ +class Solution { + public int arrangeCoins(int n) { + if(n == 1){ + return 1; + } + + int start = 0, end = n; + while(start + 1 < end){ + int mid = (end + start)>>1; + if((long)mid*(mid+1) <= (long)2*n){ + start = mid; + } + else{ + end = mid; + } + } + return start; + } +} diff --git "a/Week_01/id_20/LeetCode_441_\346\225\260\345\255\246\345\205\254\345\274\217" "b/Week_01/id_20/LeetCode_441_\346\225\260\345\255\246\345\205\254\345\274\217" new file mode 100644 index 00000000..73a7906d --- /dev/null +++ "b/Week_01/id_20/LeetCode_441_\346\225\260\345\255\246\345\205\254\345\274\217" @@ -0,0 +1,35 @@ +/** + * 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 + * + * 给定一个数字 n,找出可形成完整阶梯行的总行数。 + * + * n 是一个非负整数,并且在32位有符号整型的范围内。 + * + * 示例 1: + * + * n = 5 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ + * + * 因为第三行不完整,所以返回2. + * 示例 2: + * + * n = 8 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ ¤ + * ¤ ¤ + * + * 因为第四行不完整,所以返回3. +**/ +class Solution { + public int arrangeCoins(int n) { + double k = -0.5d + Math.sqrt(0.25d+2*(double)n); + return (int)Math.floor(k); + } +} diff --git "a/Week_01/id_20/LeetCode_441_\347\256\200\345\215\225\345\256\236\347\216\260" "b/Week_01/id_20/LeetCode_441_\347\256\200\345\215\225\345\256\236\347\216\260" new file mode 100644 index 00000000..3e9b5fcc --- /dev/null +++ "b/Week_01/id_20/LeetCode_441_\347\256\200\345\215\225\345\256\236\347\216\260" @@ -0,0 +1,44 @@ +/** + * 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 + * + * 给定一个数字 n,找出可形成完整阶梯行的总行数。 + * + * n 是一个非负整数,并且在32位有符号整型的范围内。 + * + * 示例 1: + * + * n = 5 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ + * + * 因为第三行不完整,所以返回2. + * 示例 2: + * + * n = 8 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ ¤ + * ¤ ¤ + * + * 因为第四行不完整,所以返回3. +**/ + class Solution { + public int arrangeCoins(int n) { + int sum = 0; + int k = 0; + if(n == 0) + return 0; + if(n == 1) + return 1; + while(sum - n < 0){ + k++; + sum +=k; + } + return k-1; + } +} diff --git a/Week_01/id_20/LeetCode_81_020.java b/Week_01/id_20/LeetCode_81_020.java new file mode 100644 index 00000000..fb5a5f0c --- /dev/null +++ b/Week_01/id_20/LeetCode_81_020.java @@ -0,0 +1,29 @@ +class Solution { + public boolean search(int[] nums, int target) { + int low = 0, high = nums.length - 1; + while (low <= high) { + int mid = low + (high - low) / 2; + if (nums[mid] == target) { + return true; + } + if (nums[mid] > nums[low]) { + if (target >= nums[low] && target <= nums[mid]) { + high = mid - 1; + } else { + low = mid + 1; + } + } else if (nums[mid] < nums[high]) { + if (target >= nums[mid] && target <= nums[high]) { + low = mid + 1; + } else { + high = mid - 1; + } + } else if (nums[low] == nums[mid]) { + low++; + } else { + high--; + } + } + return false; + } +} diff --git "a/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\345\210\227\350\241\250\357\274\210\346\231\256\351\200\232\351\223\276\350\241\250\346\223\215\344\275\234\357\274\211" "b/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\345\210\227\350\241\250\357\274\210\346\231\256\351\200\232\351\223\276\350\241\250\346\223\215\344\275\234\357\274\211" new file mode 100644 index 00000000..6a520dcb --- /dev/null +++ "b/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\345\210\227\350\241\250\357\274\210\346\231\256\351\200\232\351\223\276\350\241\250\346\223\215\344\275\234\357\274\211" @@ -0,0 +1,59 @@ +/** + * 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 + * + * 示例: + * + * 输入:1->2->4, 1->3->4 + * 输出:1->1->2->3->4->4 + * + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if(l1 == null) { + return l2; + } + if(l2 == null) { + return l1; + } + ListNode head = null; + //用于扫描l1 + ListNode p1 = l1; + //用于扫描l2 + ListNode p2 = l2; + if(l1.val < l2.val) { + head = l1; + p1 = l1.next; + } else { + head = l2; + p2 = l2.next; + } + ListNode p = head;//p指向合并列表的最新节点 + while(p1 !=null && p2 != null) { + //比较插入2个链表中元素的大小 + if(p1.val < p2.val) { + //p1插入p后面 + p.next = p1; + p1 = p1.next; + } else { + //p2插入p后面 + p.next = p2; + p2 = p2.next; + } + p = p.next; + } + + if(p1 != null) { + p.next = p1; + } else if(p2 != null){ + p.next = p2; + } + return head; + + } +} diff --git "a/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250\357\274\210\351\200\222\345\275\222\345\256\236\347\216\260\357\274\211" "b/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250\357\274\210\351\200\222\345\275\222\345\256\236\347\216\260\357\274\211" new file mode 100644 index 00000000..c3533358 --- /dev/null +++ "b/Week_01/\345\220\210\345\271\2662\344\270\252\346\234\211\345\272\217\351\223\276\350\241\250\357\274\210\351\200\222\345\275\222\345\256\236\347\216\260\357\274\211" @@ -0,0 +1,36 @@ +/** + * 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 + * + * 示例: + * + * 输入:1->2->4, 1->3->4 + * 输出:1->1->2->3->4->4 + * + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { val = x; } + * } + */ +class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if(l1 == null) { + return l2; + } + if(l2 == null) { + return l1; + } + ListNode head = null; + + if(l1.val < l2.val) { + head = l1; + head.next = mergeTwoLists(l1.next,l2); + } else { + head = l2; + head.next = mergeTwoLists(l1,l2.next); + } + return head; + + } +} diff --git "a/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201" "b/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201" new file mode 100644 index 00000000..3e9b5fcc --- /dev/null +++ "b/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201" @@ -0,0 +1,44 @@ +/** + * 你总共有 n 枚硬币,你需要将它们摆成一个阶梯形状,第 k 行就必须正好有 k 枚硬币。 + * + * 给定一个数字 n,找出可形成完整阶梯行的总行数。 + * + * n 是一个非负整数,并且在32位有符号整型的范围内。 + * + * 示例 1: + * + * n = 5 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ + * + * 因为第三行不完整,所以返回2. + * 示例 2: + * + * n = 8 + * + * 硬币可排列成以下几行: + * ¤ + * ¤ ¤ + * ¤ ¤ ¤ + * ¤ ¤ + * + * 因为第四行不完整,所以返回3. +**/ + class Solution { + public int arrangeCoins(int n) { + int sum = 0; + int k = 0; + if(n == 0) + return 0; + if(n == 1) + return 1; + while(sum - n < 0){ + k++; + sum +=k; + } + return k-1; + } +} diff --git "a/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201\357\274\210\351\207\207\347\224\250\344\272\214\345\210\206\346\270\220\350\277\233\346\226\271\345\274\217\350\247\243\345\206\263\357\274\211" "b/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201\357\274\210\351\207\207\347\224\250\344\272\214\345\210\206\346\270\220\350\277\233\346\226\271\345\274\217\350\247\243\345\206\263\357\274\211" new file mode 100644 index 00000000..bde2108c --- /dev/null +++ "b/Week_01/\346\216\222\345\210\227\347\241\254\345\270\201\357\274\210\351\207\207\347\224\250\344\272\214\345\210\206\346\270\220\350\277\233\346\226\271\345\274\217\350\247\243\345\206\263\357\274\211" @@ -0,0 +1,19 @@ +class Solution { + public int arrangeCoins(int n) { + if(n == 1){ + return 1; + } + + int start = 0, end = n; + while(start + 1 < end){ + int mid = (end + start)>>1; + if((long)mid*(mid+1) <= (long)2*n){ + start = mid; + } + else{ + end = mid; + } + } + return start; + } +} diff --git a/Week_02/id_20/LeetCode_671_020.java b/Week_02/id_20/LeetCode_671_020.java new file mode 100644 index 00000000..78cac849 --- /dev/null +++ b/Week_02/id_20/LeetCode_671_020.java @@ -0,0 +1,31 @@ +/** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ +class Solution { + public int findSecondMinimumValue(TreeNode root) { + Set set = new HashSet<>(); + inOrder(root, set); + List list = new ArrayList<>(); + list.addAll(set); + if (list.size() == 1) { + return -1; + } else { + Collections.sort(list); + return list.get(1); + } + } + + private void inOrder(TreeNode root, Set set) { + if (root != null) { + inOrder(root.left, set); + set.add(root.val); + inOrder(root.right,set); + } + } +} diff --git a/Week_02/id_20/LeetCode_692_020.java b/Week_02/id_20/LeetCode_692_020.java new file mode 100644 index 00000000..7bcc83d0 --- /dev/null +++ b/Week_02/id_20/LeetCode_692_020.java @@ -0,0 +1,27 @@ +class Solution { + public List topKFrequent(String[] words, int k) { + + Map map = new HashMap<>(); + for (String word : words) { + map.put(word, map.getOrDefault(word, 0) + 1); + } + + PriorityQueue> priorityQueue = new PriorityQueue<>( + new Comparator>() { + @Override + public int compare(Map.Entry o1, Map.Entry o2) { + if (o1.getValue().equals(o2.getValue())) { + return o1.getKey().compareTo(o2.getKey()); + } + return o2.getValue() - o1.getValue(); + } + }); + + priorityQueue.addAll(map.entrySet()); + List ret = new ArrayList<>(k); + for(int i=0; i