From 17c3833ac613d0659629c6b578ad4169b258323f Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 30 Mar 2021 17:52:56 +0800 Subject: [PATCH 01/45] 2021-03-30 --- week01/ContainerWithMostWater.java | 78 ++++++++++++++++++++++ week01/MoveZeroes.java | 32 +++++++++ week01/ReverseLinkedList.java | 43 ++++++++++++ week01/ThreeSum.java | 92 ++++++++++++++++++++++++++ week01/TwoSum.java | 67 +++++++++++++++++++ week01/TwoSumIiInputArrayIsSorted.java | 70 ++++++++++++++++++++ 6 files changed, 382 insertions(+) create mode 100644 week01/ContainerWithMostWater.java create mode 100644 week01/MoveZeroes.java create mode 100644 week01/ReverseLinkedList.java create mode 100644 week01/ThreeSum.java create mode 100644 week01/TwoSum.java create mode 100644 week01/TwoSumIiInputArrayIsSorted.java diff --git a/week01/ContainerWithMostWater.java b/week01/ContainerWithMostWater.java new file mode 100644 index 0000000..1fdedf7 --- /dev/null +++ b/week01/ContainerWithMostWater.java @@ -0,0 +1,78 @@ +package week01; + +//给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, +//ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 +// +// 说明:你不能倾斜容器。 +// +// +// +// 示例 1: +// +// +// +// +//输入:[1,8,6,2,5,4,8,3,7] +//输出:49 +//解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。 +// +// 示例 2: +// +// +//输入:height = [1,1] +//输出:1 +// +// +// 示例 3: +// +// +//输入:height = [4,3,2,1,4] +//输出:16 +// +// +// 示例 4: +// +// +//输入:height = [1,2,1] +//输出:2 +// +// +// +// +// 提示: +// +// +// n = height.length +// 2 <= n <= 3 * 104 +// 0 <= height[i] <= 3 * 104 +// +// Related Topics 数组 双指针 +// 👍 2315 👎 0 +public class ContainerWithMostWater{ + public static void main(String[] args) { + Solution solution = new ContainerWithMostWater().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int maxArea(int[] height) { + int left = 0; + int right = height.length-1; + int res = 0; + // 面积取决于短板。①因此即使长板往内移动时遇到更长的板,矩形的面积也不会改变;遇到更短的板时,面积会变小。②因此想要面积变大,只能让短板往内移动(因为移动方向固定了),当然也有可能让面积变得更小,但只有这样才存在让面积变大的可能性 + while(leftheight[right]){ + right--; + }else{ //如果两个板长度相等,必须两个都移动,才有可能使得面积变大 + left++; + right--; + } + } + return res; + } + } +//leetcode submit region end(Prohibit modification and deletion) +} diff --git a/week01/MoveZeroes.java b/week01/MoveZeroes.java new file mode 100644 index 0000000..4e07f26 --- /dev/null +++ b/week01/MoveZeroes.java @@ -0,0 +1,32 @@ +package week01; +public class MoveZeroes{ + public static void main(String[] args) { + Solution solution = new MoveZeroes().new Solution(); + solution.moveZeroes(new int[]{2,1}); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public void moveZeroes(int[] nums) { + int i=0; + // find first number that equals 0 + while(i=nums.length) return; + for(int j=i+1;j2->3->4->5->NULL +//输出: 5->4->3->2->1->NULL +// +// 进阶: +//你可以迭代或递归地反转链表。你能否用两种方法解决这道题? +// Related Topics 链表 +// 👍 1638 👎 0 + +public class ReverseLinkedList{ + public static void main(String[] args) { + Solution solution = new ReverseLinkedList().new Solution(); + } +//leetcode submit region begin(Prohibit modification and deletion) + + //Definition for singly-linked list. + public class ListNode { + int val; + ListNode next; + ListNode() {} + ListNode(int val) { this.val = val; } + ListNode(int val, ListNode next) { this.val = val; this.next = next; } + } + class Solution { + public ListNode reverseList(ListNode head) { + ListNode prev = null; + ListNode cur = head; + while(cur!=null){ + ListNode temp = cur.next; + cur.next = prev; + prev = cur; + cur = temp; + } + return prev; + } + } +//leetcode submit region end(Prohibit modification and deletion) +} diff --git a/week01/ThreeSum.java b/week01/ThreeSum.java new file mode 100644 index 0000000..8a24eb6 --- /dev/null +++ b/week01/ThreeSum.java @@ -0,0 +1,92 @@ +package week01; + +//给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重 +//复的三元组。 +// +// 注意:答案中不可以包含重复的三元组。 +// +// +// +// 示例 1: +// +// +//输入:nums = [-1,0,1,2,-1,-4] +//输出:[[-1,-1,2],[-1,0,1]] +// +// +// 示例 2: +// +// +//输入:nums = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:nums = [0] +//输出:[] +// +// +// +// +// 提示: +// +// +// 0 <= nums.length <= 3000 +// -105 <= nums[i] <= 105 +// +// Related Topics 数组 双指针 +// 👍 3170 👎 0 + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class ThreeSum{ + public static void main(String[] args) { + Solution solution = new ThreeSum().new Solution(); + solution.threeSum(new int[]{1,-1,-1,0}); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public List> threeSum(int[] nums) { + List> res = new ArrayList<>(); + Arrays.sort(nums); + //nums.length-3,nums.length-2,nums.length-1 + for(int i=0;i<=nums.length-3;i++){ + if(i>=1&&nums[i]==nums[i-1]){ + continue; + } + int left = i+1; + int right = nums.length -1; + int target = -nums[i]; + while(left cur = new ArrayList<>(); + cur.add(nums[i]); + cur.add(nums[left]); + cur.add(nums[right]); + res.add(cur); + left++; + right--; + while(left<=nums.length-1&&nums[left]==nums[left-1]){ + left++; + } + while(right>=0&&nums[right]==nums[right+1]){ + right--; + } + }else if (curSum map = new HashMap<>(); + for(int i=0;i Date: Tue, 30 Mar 2021 17:59:53 +0800 Subject: [PATCH 02/45] 2021-03-30 --- week01/{ => array}/ContainerWithMostWater.java | 2 +- week01/{ => array}/MoveZeroes.java | 2 +- week01/{ => array}/ReverseLinkedList.java | 2 +- week01/{ => array}/ThreeSum.java | 2 +- week01/{ => array}/TwoSum.java | 2 +- week01/{ => array}/TwoSumIiInputArrayIsSorted.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) rename week01/{ => array}/ContainerWithMostWater.java (99%) rename week01/{ => array}/MoveZeroes.java (97%) rename week01/{ => array}/ReverseLinkedList.java (98%) rename week01/{ => array}/ThreeSum.java (99%) rename week01/{ => array}/TwoSum.java (98%) rename week01/{ => array}/TwoSumIiInputArrayIsSorted.java (98%) diff --git a/week01/ContainerWithMostWater.java b/week01/array/ContainerWithMostWater.java similarity index 99% rename from week01/ContainerWithMostWater.java rename to week01/array/ContainerWithMostWater.java index 1fdedf7..5d23648 100644 --- a/week01/ContainerWithMostWater.java +++ b/week01/array/ContainerWithMostWater.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; //给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, //ai) 和 (i, 0) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 diff --git a/week01/MoveZeroes.java b/week01/array/MoveZeroes.java similarity index 97% rename from week01/MoveZeroes.java rename to week01/array/MoveZeroes.java index 4e07f26..a91cb71 100644 --- a/week01/MoveZeroes.java +++ b/week01/array/MoveZeroes.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; public class MoveZeroes{ public static void main(String[] args) { Solution solution = new MoveZeroes().new Solution(); diff --git a/week01/ReverseLinkedList.java b/week01/array/ReverseLinkedList.java similarity index 98% rename from week01/ReverseLinkedList.java rename to week01/array/ReverseLinkedList.java index 0b1b4ec..03e60fb 100644 --- a/week01/ReverseLinkedList.java +++ b/week01/array/ReverseLinkedList.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; //反转一个单链表。 // diff --git a/week01/ThreeSum.java b/week01/array/ThreeSum.java similarity index 99% rename from week01/ThreeSum.java rename to week01/array/ThreeSum.java index 8a24eb6..4c625ba 100644 --- a/week01/ThreeSum.java +++ b/week01/array/ThreeSum.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; //给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重 //复的三元组。 diff --git a/week01/TwoSum.java b/week01/array/TwoSum.java similarity index 98% rename from week01/TwoSum.java rename to week01/array/TwoSum.java index 85438fc..7365d84 100644 --- a/week01/TwoSum.java +++ b/week01/array/TwoSum.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; //给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。 // diff --git a/week01/TwoSumIiInputArrayIsSorted.java b/week01/array/TwoSumIiInputArrayIsSorted.java similarity index 98% rename from week01/TwoSumIiInputArrayIsSorted.java rename to week01/array/TwoSumIiInputArrayIsSorted.java index b29c7cb..32ed7a7 100644 --- a/week01/TwoSumIiInputArrayIsSorted.java +++ b/week01/array/TwoSumIiInputArrayIsSorted.java @@ -1,4 +1,4 @@ -package week01; +package week01.array; //给定一个已按照 升序排列 的整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。 // From ace8bc366ec0e889b4492693970a18b9dbb82410 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 30 Mar 2021 18:17:16 +0800 Subject: [PATCH 03/45] 2021-03-30 --- week01/linkedlist/LinkedListCycle.java | 86 +++++++++++++++++++ week01/linkedlist/ListNode.java | 10 +++ .../ReverseLinkedList.java | 11 +-- 3 files changed, 98 insertions(+), 9 deletions(-) create mode 100644 week01/linkedlist/LinkedListCycle.java create mode 100644 week01/linkedlist/ListNode.java rename week01/{array => linkedlist}/ReverseLinkedList.java (75%) diff --git a/week01/linkedlist/LinkedListCycle.java b/week01/linkedlist/LinkedListCycle.java new file mode 100644 index 0000000..fd8feed --- /dev/null +++ b/week01/linkedlist/LinkedListCycle.java @@ -0,0 +1,86 @@ +package week01.linkedlist; + +//给定一个链表,判断链表中是否有环。 +// +// 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的 +//位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。 +// +// 如果链表中存在环,则返回 true 。 否则,返回 false 。 +// +// +// +// 进阶: +// +// 你能用 O(1)(即,常量)内存解决此问题吗? +// +// +// +// 示例 1: +// +// +// +// 输入:head = [3,2,0,-4], pos = 1 +//输出:true +//解释:链表中有一个环,其尾部连接到第二个节点。 +// +// +// 示例 2: +// +// +// +// 输入:head = [1,2], pos = 0 +//输出:true +//解释:链表中有一个环,其尾部连接到第一个节点。 +// +// +// 示例 3: +// +// +// +// 输入:head = [1], pos = -1 +//输出:false +//解释:链表中没有环。 +// +// +// +// +// 提示: +// +// +// 链表中节点的数目范围是 [0, 104] +// -105 <= Node.val <= 105 +// pos 为 -1 或者链表中的一个 有效索引 。 +// +// Related Topics 链表 双指针 +// 👍 1009 👎 0 + +public class LinkedListCycle{ + public static void main(String[] args) { + Solution solution = new LinkedListCycle().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for singly-linked list. + * class ListNode { + * int val; + * ListNode next; + * ListNode(int x) { + * val = x; + * next = null; + * } + * } + */ + public class Solution { + public boolean hasCycle(ListNode head) { + ListNode slow = head; + ListNode fast = head; + while(fast!=null && fast.next!= null){ + slow = slow.next; + fast = fast.next.next; + if(slow == fast) return true; + } + return false; + } + } +//leetcode submit region end(Prohibit modification and deletion) +} diff --git a/week01/linkedlist/ListNode.java b/week01/linkedlist/ListNode.java new file mode 100644 index 0000000..54b1ac5 --- /dev/null +++ b/week01/linkedlist/ListNode.java @@ -0,0 +1,10 @@ +package week01.linkedlist; + +//Definition for singly-linked list. +public class ListNode { + int val; + ListNode next; + ListNode() {} + ListNode(int val) { this.val = val; } + ListNode(int val, ListNode next) { this.val = val; this.next = next; } +} diff --git a/week01/array/ReverseLinkedList.java b/week01/linkedlist/ReverseLinkedList.java similarity index 75% rename from week01/array/ReverseLinkedList.java rename to week01/linkedlist/ReverseLinkedList.java index 03e60fb..2292a1d 100644 --- a/week01/array/ReverseLinkedList.java +++ b/week01/linkedlist/ReverseLinkedList.java @@ -1,4 +1,4 @@ -package week01.array; +package week01.linkedlist; //反转一个单链表。 // @@ -18,14 +18,7 @@ public static void main(String[] args) { } //leetcode submit region begin(Prohibit modification and deletion) - //Definition for singly-linked list. - public class ListNode { - int val; - ListNode next; - ListNode() {} - ListNode(int val) { this.val = val; } - ListNode(int val, ListNode next) { this.val = val; this.next = next; } - } + class Solution { public ListNode reverseList(ListNode head) { ListNode prev = null; From f67889588bed05e5a24022618a5f6f74998e0474 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 30 Mar 2021 22:55:01 +0800 Subject: [PATCH 04/45] 2021-03-30 --- week01/linkedlist/ReverseNodesInKGroup.java | 107 ++++++++++++++++++++ week01/linkedlist/SwapNodesInPairs.java | 88 ++++++++++++++++ 2 files changed, 195 insertions(+) create mode 100644 week01/linkedlist/ReverseNodesInKGroup.java create mode 100644 week01/linkedlist/SwapNodesInPairs.java diff --git a/week01/linkedlist/ReverseNodesInKGroup.java b/week01/linkedlist/ReverseNodesInKGroup.java new file mode 100644 index 0000000..cfde5bf --- /dev/null +++ b/week01/linkedlist/ReverseNodesInKGroup.java @@ -0,0 +1,107 @@ +package week01.linkedlist; + +//给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。 +// +// k 是一个正整数,它的值小于或等于链表的长度。 +// +// 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。 +// +// 进阶: +// +// +// 你可以设计一个只使用常数额外空间的算法来解决此问题吗? +// 你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 +// +// +// +// +// 示例 1: +// +// +//输入:head = [1,2,3,4,5], k = 2 +//输出:[2,1,4,3,5] +// +// +// 示例 2: +// +// +//输入:head = [1,2,3,4,5], k = 3 +//输出:[3,2,1,4,5] +// +// +// 示例 3: +// +// +//输入:head = [1,2,3,4,5], k = 1 +//输出:[1,2,3,4,5] +// +// +// 示例 4: +// +// +//输入:head = [1], k = 1 +//输出:[1] +// +// +// +// +// +// 提示: +// +// +// 列表中节点的数量在范围 sz 内 +// 1 <= sz <= 5000 +// 0 <= Node.val <= 1000 +// 1 <= k <= sz +// +// Related Topics 链表 +// 👍 1008 👎 0 + +public class ReverseNodesInKGroup{ + public static void main(String[] args) { + Solution solution = new ReverseNodesInKGroup().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public ListNode reverseKGroup(ListNode head, int k) { + ListNode dummy = new ListNode(0, head); + head = dummy; + while(head!=null) { + head = reverse(head, k); + } + return dummy.next; + } + + // head -> n1 -> ... -> nk -> nk+1 + // head -> nk -> ... -> n1 -> nk+1 + private ListNode reverse(ListNode head, int k){ + ListNode nk = head; + // find kth node + for(int i=1;i<=k;i++){ + nk = nk.next; + if(nk==null) return null; + } + // get (k+1)th node + ListNode nkplus = nk.next; + + // reverse n1 -> ... -> nk + ListNode prev = head; + ListNode cur = head.next; + // head <- n1 <- n2 ... <- nk nk+1 + while(cur!=nkplus){ + ListNode temp = cur.next; + cur.next = prev; + prev = cur; + cur = temp; + } + // reconnect + // head -> nk ->nk-1 -> ... -> n1 -> nk+1 + ListNode n1 = head.next; + head.next = prev; + n1.next = cur; + return n1; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/week01/linkedlist/SwapNodesInPairs.java b/week01/linkedlist/SwapNodesInPairs.java new file mode 100644 index 0000000..e19c7d9 --- /dev/null +++ b/week01/linkedlist/SwapNodesInPairs.java @@ -0,0 +1,88 @@ +package week01.linkedlist; + +//给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 +// +// 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 +// +// +// +// 示例 1: +// +// +//输入:head = [1,2,3,4] +//输出:[2,1,4,3] +// +// +// 示例 2: +// +// +//输入:head = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:head = [1] +//输出:[1] +// +// +// +// +// 提示: +// +// +// 链表中节点的数目在范围 [0, 100] 内 +// 0 <= Node.val <= 100 +// +// +// +// +// 进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。) +// Related Topics 递归 链表 +// 👍 869 👎 0 + +public class SwapNodesInPairs{ + public static void main(String[] args) { + Solution solution = new SwapNodesInPairs().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + // 递归的方法 + public ListNode swapPairs(ListNode head) { + //递归的终止条件 + //链表为空,或者链表只有一个节点 + if(head==null||head.next==null) return head; + // n1 -> n2 -> n3 + // n2 -> n1 -> n3 + // 原始链表的第二个节点变成新的链表的头节点 + ListNode newHead = head.next; + // 表示将其余节点进行两两交换 + // 交换后的新的头节点为 head 的下一个节点 + head.next = swapPairs(newHead.next); + // 原始链表的头节点变成新的链表的第二个节点 + newHead.next = head; + return newHead; + } + + //迭代的方法 + public ListNode swapPairs2(ListNode head){ + // temp -> n1 -> n2 -> n3 + // temp -> n2 -> n1 -> n3 + ListNode dummy = new ListNode(0, head); + ListNode temp = dummy; + while(temp.next!=null && temp.next.next!=null){ + ListNode n1 = temp.next; + ListNode n2 = n1.next; + ListNode n3 = n2.next; + temp.next = n2; + n2.next = n1; + n1.next = n3; + temp = n1; + } + return dummy.next; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From aa59e898c7f1aa5cad331177972288c8eb5bfd42 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 30 Mar 2021 23:16:08 +0800 Subject: [PATCH 05/45] 2021-03-30 --- week01/linkedlist/ReverseNodesInKGroup.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/week01/linkedlist/ReverseNodesInKGroup.java b/week01/linkedlist/ReverseNodesInKGroup.java index cfde5bf..3772322 100644 --- a/week01/linkedlist/ReverseNodesInKGroup.java +++ b/week01/linkedlist/ReverseNodesInKGroup.java @@ -76,7 +76,7 @@ public ListNode reverseKGroup(ListNode head, int k) { // head -> nk -> ... -> n1 -> nk+1 private ListNode reverse(ListNode head, int k){ ListNode nk = head; - // find kth node + // 如果不足k个 for(int i=1;i<=k;i++){ nk = nk.next; if(nk==null) return null; @@ -97,8 +97,8 @@ private ListNode reverse(ListNode head, int k){ // reconnect // head -> nk ->nk-1 -> ... -> n1 -> nk+1 ListNode n1 = head.next; - head.next = prev; - n1.next = cur; + head.next = nk; + n1.next = nkplus; return n1; } } From 5adc7caf2763ec2984f3779fdc492e93912b6cb0 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 31 Mar 2021 08:36:16 +0800 Subject: [PATCH 06/45] 2021-03-31 --- week01/array/PlusOne.java | 70 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 week01/array/PlusOne.java diff --git a/week01/array/PlusOne.java b/week01/array/PlusOne.java new file mode 100644 index 0000000..24912f2 --- /dev/null +++ b/week01/array/PlusOne.java @@ -0,0 +1,70 @@ +package week01.array; + +//给定一个由 整数 组成的 非空 数组所表示的非负整数,在该数的基础上加一。 +// +// 最高位数字存放在数组的首位, 数组中每个元素只存储单个数字。 +// +// 你可以假设除了整数 0 之外,这个整数不会以零开头。 +// +// +// +// 示例 1: +// +// +//输入:digits = [1,2,3] +//输出:[1,2,4] +//解释:输入数组表示数字 123。 +// +// +// 示例 2: +// +// +//输入:digits = [4,3,2,1] +//输出:[4,3,2,2] +//解释:输入数组表示数字 4321。 +// +// +// 示例 3: +// +// +//输入:digits = [0] +//输出:[1] +// +// +// +// +// 提示: +// +// +// 1 <= digits.length <= 100 +// 0 <= digits[i] <= 9 +// +// Related Topics 数组 +// 👍 654 👎 0 + +//[66]加一 +//https://leetcode-cn.com/problems/plus-one/ +public class PlusOne{ + public static void main(String[] args) { + Solution solution = new PlusOne().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int[] plusOne(int[] digits) { + for(int i=digits.length-1;i>=0;i--){ + digits[i] += 1; + digits[i] = digits[i]%10; + if(digits[i]!=0){ + //没有进位,返回 + return digits; + } + } + //最后仍然有进位 99 +1->100 + digits = new int[digits.length+1]; + digits[0] = 1; + return digits; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 29c1a74314cde6f052eb24cfa9c322c976ca78f9 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 31 Mar 2021 12:53:40 +0800 Subject: [PATCH 07/45] 2021-03-31 --- week01/array/MergeSortedArray.java | 86 ++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 week01/array/MergeSortedArray.java diff --git a/week01/array/MergeSortedArray.java b/week01/array/MergeSortedArray.java new file mode 100644 index 0000000..67b806c --- /dev/null +++ b/week01/array/MergeSortedArray.java @@ -0,0 +1,86 @@ +package week01.array; + +//给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。 +// +// 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 的空间大小等于 m + n,这样它就有足够的空间保存来自 nu +//ms2 的元素。 +// +// +// +// 示例 1: +// +// +//输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 +//输出:[1,2,2,3,5,6] +// +// +// 示例 2: +// +// +//输入:nums1 = [1], m = 1, nums2 = [], n = 0 +//输出:[1] +// +// +// +// +// 提示: +// +// +// nums1.length == m + n +// nums2.length == n +// 0 <= m, n <= 200 +// 1 <= m + n <= 200 +// -109 <= nums1[i], nums2[i] <= 109 +// +// Related Topics 数组 双指针 +// 👍 816 👎 0 + +//[66]合并两个有序数组 +// https://leetcode-cn.com/problems/plus-one/ +public class MergeSortedArray{ + public static void main(String[] args) { + Solution solution = new MergeSortedArray().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + // 时间复杂度:O(m+n) 空间复杂度:O(m+n) + // 或者可以将 nums1拷贝,空间复杂度为 O(m) + public void merge(int[] nums1, int m, int[] nums2, int n) { + int[] merged = new int[m+n]; + int ind1 = 0; + int ind2 = 0; + int ind = 0; + while(ind1 < m && ind2 < n){ + if (nums1[ind1] <= nums2[ind2]){ + merged[ind++] = nums1[ind1++]; + } else { + merged[ind++] = nums2[ind2++]; + } + } + while(ind1 < m){ + merged[ind++] = nums1[ind1++]; + } + while(ind2 < n){ + merged[ind++] = nums2[ind2++]; + } + System.arraycopy(merged,0,nums1,0,m+n); + } + } + + //双指针,从后往前 + public void merge2(int[] nums1, int m, int[] nums2, int n){ + int ind1 = m-1; + int ind2 = n-1; + int ind = m+n-1; + while(ind1>=0 && ind2>=0){ + if(nums1[ind1] >= nums2[ind2]){ + nums1[ind--] = nums1[ind1--]; + } else { + nums1[ind--] = nums2[ind2--]; + } + } + while(ind2>=0){ + nums1[ind--] = nums2[ind2--]; + } + } +} From b3bca4ddb76c87f81a6f93d4ce0c01cee8e6fe84 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 31 Mar 2021 23:03:41 +0800 Subject: [PATCH 08/45] add five --- week01/five-01.xlsx | Bin 0 -> 13030 bytes week01/linkedlist/MergeTwoSortedLists.java | 78 +++++++++++++++++++++ 2 files changed, 78 insertions(+) create mode 100644 week01/five-01.xlsx create mode 100644 week01/linkedlist/MergeTwoSortedLists.java diff --git a/week01/five-01.xlsx b/week01/five-01.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bbdf7ae2179bf59d3550d9249719199539c9f6fe GIT binary patch literal 13030 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 Cam0lH literal 0 HcmV?d00001 diff --git a/week01/linkedlist/MergeTwoSortedLists.java b/week01/linkedlist/MergeTwoSortedLists.java new file mode 100644 index 0000000..050bd7f --- /dev/null +++ b/week01/linkedlist/MergeTwoSortedLists.java @@ -0,0 +1,78 @@ +package week01.linkedlist; + +//将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 +// +// +// +// 示例 1: +// +// +//输入:l1 = [1,2,4], l2 = [1,3,4] +//输出:[1,1,2,3,4,4] +// +// +// 示例 2: +// +// +//输入:l1 = [], l2 = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:l1 = [], l2 = [0] +//输出:[0] +// +// +// +// +// 提示: +// +// +// 两个链表的节点数目范围是 [0, 50] +// -100 <= Node.val <= 100 +// l1 和 l2 均按 非递减顺序 排列 +// +// Related Topics 递归 链表 +// 👍 1632 👎 0 + +//【21】合并两个有序链表 +// https://leetcode-cn.com/problems/merge-two-sorted-lists/ +public class MergeTwoSortedLists{ + public static void main(String[] args) { + Solution solution = new MergeTwoSortedLists().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for singly-linked list. + * public class ListNode { + * int val; + * ListNode next; + * ListNode() {} + * ListNode(int val) { this.val = val; } + * ListNode(int val, ListNode next) { this.val = val; this.next = next; } + * } + */ + class Solution { + public ListNode mergeTwoLists(ListNode l1, ListNode l2) { + ListNode dummy = new ListNode(0); + ListNode head = dummy; + while(l1!=null&&l2!=null){ + if(l1.val <= l2.val){ + head.next = l1; + l1 = l1.next; + } else{ + head.next = l2; + l2 = l2.next; + } + head = head.next; + } + if(l1!=null) head.next = l1; + if(l2!=null) head.next = l2; + return dummy.next; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From cf9e54911d007eb3bd34d9bd39a9aff4e2adb380 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 31 Mar 2021 23:15:23 +0800 Subject: [PATCH 09/45] 2021-03-31 --- week01/array/RotateArray.java | 79 +++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 week01/array/RotateArray.java diff --git a/week01/array/RotateArray.java b/week01/array/RotateArray.java new file mode 100644 index 0000000..a6790cc --- /dev/null +++ b/week01/array/RotateArray.java @@ -0,0 +1,79 @@ +package week01.array; + +//给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。 +// +// +// +// 进阶: +// +// +// 尽可能想出更多的解决方案,至少有三种不同的方法可以解决这个问题。 +// 你可以使用空间复杂度为 O(1) 的 原地 算法解决这个问题吗? +// +// +// +// +// 示例 1: +// +// +//输入: nums = [1,2,3,4,5,6,7], k = 3 +//输出: [5,6,7,1,2,3,4] +//解释: +//向右旋转 1 步: [7,1,2,3,4,5,6] +//向右旋转 2 步: [6,7,1,2,3,4,5] +//向右旋转 3 步: [5,6,7,1,2,3,4] +// +// +// 示例 2: +// +// +//输入:nums = [-1,-100,3,99], k = 2 +//输出:[3,99,-1,-100] +//解释: +//向右旋转 1 步: [99,-1,-100,3] +//向右旋转 2 步: [3,99,-1,-100] +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 2 * 104 +// -231 <= nums[i] <= 231 - 1 +// 0 <= k <= 105 +// +// +// +// +// Related Topics 数组 +// 👍 929 👎 0 + +public class RotateArray{ + public static void main(String[] args) { + Solution solution = new RotateArray().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public void rotate(int[] nums, int k) { + // k取余不要忘记 + k = k%nums.length; + reverse(nums, 0, nums.length-1); + reverse(nums, 0, k-1); + reverse(nums, k, nums.length-1); + } + + public void reverse(int[] nums, int start, int end){ + int left = start; + int right = end; + while(left Date: Thu, 1 Apr 2021 07:54:07 +0800 Subject: [PATCH 10/45] 2021-03-31 --- .../RemoveDuplicatesFromSortedArray.java | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 week01/array/RemoveDuplicatesFromSortedArray.java diff --git a/week01/array/RemoveDuplicatesFromSortedArray.java b/week01/array/RemoveDuplicatesFromSortedArray.java new file mode 100644 index 0000000..792fa4d --- /dev/null +++ b/week01/array/RemoveDuplicatesFromSortedArray.java @@ -0,0 +1,103 @@ +package week01.array; + +//给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。 +// +// 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 +// +// +// +// 说明: +// +// 为什么返回数值是整数,但输出的答案是数组呢? +// +// 请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。 +// +// 你可以想象内部操作如下: +// +// +//// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 +//int len = removeDuplicates(nums); +// +//// 在函数里修改输入数组对于调用者是可见的。 +//// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 +//for (int i = 0; i < len; i++) { +//    print(nums[i]); +//} +// +// +// +// 示例 1: +// +// +//输入:nums = [1,1,2] +//输出:2, nums = [1,2] +//解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。 +// +// +// 示例 2: +// +// +//输入:nums = [0,0,1,1,1,2,2,3,3,4] +//输出:5, nums = [0,1,2,3,4] +//解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。 +// +// +// +// +// 提示: +// +// +// 0 <= nums.length <= 3 * 104 +// -104 <= nums[i] <= 104 +// nums 已按升序排列 +// +// +// +// Related Topics 数组 双指针 +// 👍 1913 👎 0 +//【26】删除有序数组中的重复项 +// https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/ +public class RemoveDuplicatesFromSortedArray{ + public static void main(String[] args) { + Solution solution = new RemoveDuplicatesFromSortedArray().new Solution(); + int[] nums = new int[]{0,0,1,1,1,2,2,3,3,4}; + int res = solution.removeDuplicates(nums); + System.out.println(res); + for (int num:nums){ + System.out.println(num); + } + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int removeDuplicates(int[] nums) { + int i = 0; + int j = 0; + while(j Date: Thu, 1 Apr 2021 08:20:28 +0800 Subject: [PATCH 11/45] 2021-04-01 --- week01/stack/ValidParentheses.java | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 week01/stack/ValidParentheses.java diff --git a/week01/stack/ValidParentheses.java b/week01/stack/ValidParentheses.java new file mode 100644 index 0000000..ab53041 --- /dev/null +++ b/week01/stack/ValidParentheses.java @@ -0,0 +1,89 @@ +package week01.stack; + +import java.util.HashMap; +import java.util.Map; +import java.util.Stack; + +//给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 +// +// 有效字符串需满足: +// +// +// 左括号必须用相同类型的右括号闭合。 +// 左括号必须以正确的顺序闭合。 +// +// +// +// +// 示例 1: +// +// +//输入:s = "()" +//输出:true +// +// +// 示例 2: +// +// +//输入:s = "()[]{}" +//输出:true +// +// +// 示例 3: +// +// +//输入:s = "(]" +//输出:false +// +// +// 示例 4: +// +// +//输入:s = "([)]" +//输出:false +// +// +// 示例 5: +// +// +//输入:s = "{[]}" +//输出:true +// +// +// +// 提示: +// +// +// 1 <= s.length <= 104 +// s 仅由括号 '()[]{}' 组成 +// +// Related Topics 栈 字符串 +// 👍 2291 👎 0 +// [20]有效的括号 +public class ValidParentheses{ + public static void main(String[] args) { + Solution solution = new ValidParentheses().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public boolean isValid(String s) { + Map map = new HashMap<>(); + Stack stack = new Stack<>(); + map.put(']','['); + map.put('}','{'); + map.put(')','('); + for (char c : s.toCharArray()){ + if(!map.containsKey(c)){ + stack.push(c); + }else{ + if(stack.isEmpty() || stack.pop()!=map.get(c)){ + return false; + } + } + } + return stack.isEmpty(); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From cac070426ad44719429eeaf14c5f77451d2efcc2 Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 1 Apr 2021 18:57:12 +0800 Subject: [PATCH 12/45] 2021-04-01 --- week01/stack/MinStackSolution.java | 98 ++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) create mode 100644 week01/stack/MinStackSolution.java diff --git a/week01/stack/MinStackSolution.java b/week01/stack/MinStackSolution.java new file mode 100644 index 0000000..6ddae44 --- /dev/null +++ b/week01/stack/MinStackSolution.java @@ -0,0 +1,98 @@ +package week01.stack; + +//设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 +// +// +// push(x) —— 将元素 x 推入栈中。 +// pop() —— 删除栈顶的元素。 +// top() —— 获取栈顶元素。 +// getMin() —— 检索栈中的最小元素。 +// +// +// +// +// 示例: +// +// 输入: +//["MinStack","push","push","push","getMin","pop","top","getMin"] +//[[],[-2],[0],[-3],[],[],[],[]] +// +//输出: +//[null,null,null,null,-3,null,0,-2] +// +//解释: +//MinStack minStack = new MinStack(); +//minStack.push(-2); +//minStack.push(0); +//minStack.push(-3); +//minStack.getMin(); --> 返回 -3. +//minStack.pop(); +//minStack.top(); --> 返回 0. +//minStack.getMin(); --> 返回 -2. +// +// +// +// +// 提示: +// +// +// pop、top 和 getMin 操作总是在 非空栈 上调用。 +// +// Related Topics 栈 设计 +// 👍 857 👎 0 + +import java.util.ArrayList; +import java.util.List; +import java.util.Stack; + +//辅助栈 min_stack: 用于存储栈中的最小值 +//保持栈顶 +public class MinStackSolution{ + public static void main(String[] args) { + + } + //leetcode submit region begin(Prohibit modification and deletion) + class MinStack { + Stack stack; + Stack min_stack; + + /** initialize your data structure here. */ + public MinStack() { + stack = new Stack<>(); + min_stack = new Stack<>(); + } + + public void push(int val) { + stack.push(val); + if(min_stack.isEmpty() || val<=min_stack.peek()){ + min_stack.push(val); + } + } + + public void pop() { + int e = stack.pop(); + if(!min_stack.isEmpty()&&min_stack.peek()==e){ + min_stack.pop(); + } + } + + public int top() { + return stack.peek(); + } + + public int getMin() { + return min_stack.peek(); + } + } + +/** + * Your MinStack object will be instantiated and called as such: + * MinStack obj = new MinStack(); + * obj.push(val); + * obj.pop(); + * int param_3 = obj.top(); + * int param_4 = obj.getMin(); + */ +//leetcode submit region end(Prohibit modification and deletion) + +} From b8e2d9b2eae32de475ccfb41a0cc04dbb9c9e7ed Mon Sep 17 00:00:00 2001 From: luxindi Date: Fri, 2 Apr 2021 08:34:18 +0800 Subject: [PATCH 13/45] 2021-04-02 --- week01/stack/LargestRectangleInHistogram.java | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 week01/stack/LargestRectangleInHistogram.java diff --git a/week01/stack/LargestRectangleInHistogram.java b/week01/stack/LargestRectangleInHistogram.java new file mode 100644 index 0000000..f5e2596 --- /dev/null +++ b/week01/stack/LargestRectangleInHistogram.java @@ -0,0 +1,69 @@ +package week01.stack; + +//给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。 +// +// 求在该柱状图中,能够勾勒出来的矩形的最大面积。 +// +// +// +// +// +// 以上是柱状图的示例,其中每个柱子的宽度为 1,给定的高度为 [2,1,5,6,2,3]。 +// +// +// +// +// +// 图中阴影部分为所能勾勒出的最大矩形面积,其面积为 10 个单位。 +// +// +// +// 示例: +// +// 输入: [2,1,5,6,2,3] +//输出: 10 +// Related Topics 栈 数组 +// 👍 1283 👎 0 + +//[84]柱状图中最大的面积 +//reference:https://leetcode-cn.com/problems/largest-rectangle-in-histogram/solution/84-by-ikaruga/ +//思路 +// 对于每一个高度,得到它向左向右的边界,求该高度下的最大矩形面积 +// 单调递增栈: +// 每次出栈时,入栈元素是出栈元素向右第一个比他小的元素; +//出栈后,新的栈顶元素是出栈元素向左第一个比他小的元素 +//每次弹出时,计算弹出位置的柱形图面积 +import java.util.Deque; +import java.util.LinkedList; + +public class LargestRectangleInHistogram{ + public static void main(String[] args) { + Solution solution = new LargestRectangleInHistogram().new Solution(); + solution.largestRectangleArea(new int[]{2,1,5,6,2,3}); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int largestRectangleArea(int[] heights) { + Deque stack = new LinkedList<>(); + int[] newH = new int[heights.length+2]; + int res = 0; + //newH最后一位是0,为了让所有元素都弹出 + //newH第一位也是0 + System.arraycopy(heights, 0, newH,1, heights.length); + for (int i=0;i=1) System.out.println(newH[stack.peekFirst()]); + while (!stack.isEmpty() && newH[i] < newH[stack.peekFirst()]) { + int top = stack.pollFirst(); // 出栈元素 + int right = i - 1; // 入栈元素:右边界 + int left = stack.peekFirst() + 1; //新的栈顶元素,左边界 + res = Math.max(newH[top] * (right - left + 1), res); + } + stack.push(i); + } + return res; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 2ba4b1df5c6fec6bf189ca5b9709121fac14d8e7 Mon Sep 17 00:00:00 2001 From: luxindi Date: Sat, 3 Apr 2021 10:58:09 +0800 Subject: [PATCH 14/45] 2021-04-03 --- week01/stack/LargestRectangleInHistogram.java | 1 + 1 file changed, 1 insertion(+) diff --git a/week01/stack/LargestRectangleInHistogram.java b/week01/stack/LargestRectangleInHistogram.java index f5e2596..5eac9d6 100644 --- a/week01/stack/LargestRectangleInHistogram.java +++ b/week01/stack/LargestRectangleInHistogram.java @@ -53,6 +53,7 @@ public int largestRectangleArea(int[] heights) { for (int i=0;i=1) System.out.println(newH[stack.peekFirst()]); + // 注意是新的元素小于栈顶元素的时候,需要弹出栈顶元素,计算面积 while (!stack.isEmpty() && newH[i] < newH[stack.peekFirst()]) { int top = stack.pollFirst(); // 出栈元素 int right = i - 1; // 入栈元素:右边界 From a8b728fd9c6368c95de1841f63321a32051cef50 Mon Sep 17 00:00:00 2001 From: luxindi Date: Sun, 4 Apr 2021 09:33:11 +0800 Subject: [PATCH 15/45] 2021-04-04 --- week01/queue/SlidingWindowMaximum.java | 95 ++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 week01/queue/SlidingWindowMaximum.java diff --git a/week01/queue/SlidingWindowMaximum.java b/week01/queue/SlidingWindowMaximum.java new file mode 100644 index 0000000..186122b --- /dev/null +++ b/week01/queue/SlidingWindowMaximum.java @@ -0,0 +1,95 @@ +package week01.queue; + +import java.util.Deque; +import java.util.LinkedList; +//给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位 +//。 +// +// 返回滑动窗口中的最大值。 +// +// +// +// 示例 1: +// +// +//输入:nums = [1,3,-1,-3,5,3,6,7], k = 3 +//输出:[3,3,5,5,6,7] +//解释: +//滑动窗口的位置 最大值 +//--------------- ----- +//[1 3 -1] -3 5 3 6 7 3 +// 1 [3 -1 -3] 5 3 6 7 3 +// 1 3 [-1 -3 5] 3 6 7 5 +// 1 3 -1 [-3 5 3] 6 7 5 +// 1 3 -1 -3 [5 3 6] 7 6 +// 1 3 -1 -3 5 [3 6 7] 7 +// +// +// 示例 2: +// +// +//输入:nums = [1], k = 1 +//输出:[1] +// +// +// 示例 3: +// +// +//输入:nums = [1,-1], k = 1 +//输出:[1,-1] +// +// +// 示例 4: +// +// +//输入:nums = [9,11], k = 2 +//输出:[11] +// +// +// 示例 5: +// +// +//输入:nums = [4,-2], k = 2 +//输出:[4] +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 105 +// -104 <= nums[i] <= 104 +// 1 <= k <= nums.length +// +// Related Topics 堆 Sliding Window +// 👍 933 👎 0 + +//reference:https://leetcode-cn.com/problems/sliding-window-maximum/solution/zhe-hui-yi-miao-dong-bu-liao-liao-de-hua-7fy5/ +public class SlidingWindowMaximum { + public int[] maxSlidingWindow(int[] nums, int k) { + Deque deque = new LinkedList<>(); + int[] res = new int[nums.length-k+1]; + // 初始化一个单调递减栈 + for(int j=0;jdeque.peekLast()){ + deque.pollLast(); + } + deque.offerLast(nums[j]); + } + res[0] = deque.peekFirst(); + // nums.length-k ,nums.length-2 ,nums.length-1 + for(int i=1;i<=nums.length-k;i++){ + //单调递减栈 + if(!deque.isEmpty() && deque.peekFirst()==nums[i-1]){ + deque.pollFirst(); + } + // nums[i+k-1] + while(!deque.isEmpty()&&nums[i+k-1]>deque.peekLast()){ + deque.pollLast(); + } + deque.offerLast(nums[i+k-1]); + res[i] = deque.peekFirst(); + } + return res; + } +} From 5db1f2e185681906719f3cbe41d3c9033f3d7fca Mon Sep 17 00:00:00 2001 From: luxindi Date: Sun, 4 Apr 2021 10:10:42 +0800 Subject: [PATCH 16/45] 2021-04-04 --- week01/stack/TrappingRainWater.java | 67 +++++++++++++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 week01/stack/TrappingRainWater.java diff --git a/week01/stack/TrappingRainWater.java b/week01/stack/TrappingRainWater.java new file mode 100644 index 0000000..8c32424 --- /dev/null +++ b/week01/stack/TrappingRainWater.java @@ -0,0 +1,67 @@ +package week01.stack; + +//给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 +// +// +// +// 示例 1: +// +// +// +// +//输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] +//输出:6 +//解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 +// +// +// 示例 2: +// +// +//输入:height = [4,2,0,3,2,5] +//输出:9 +// +// +// +// +// 提示: +// +// +// n == height.length +// 0 <= n <= 3 * 104 +// 0 <= height[i] <= 105 +// +// Related Topics 栈 数组 双指针 动态规划 +// 👍 2201 👎 0 + +import java.util.Stack; + +public class TrappingRainWater{ + public static void main(String[] args) { + Solution solution = new TrappingRainWater().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int trap(int[] height) { + Stack stack = new Stack<>(); + //单调递减栈 + int res = 0; + for(int i=0;i height[stack.peek()]){ + int topidx = stack.pop(); + //没有找到左边界 + if(stack.isEmpty()) break; + //新的栈顶 + int left = stack.peek(); //向左找第一个比他高的位置 + int right = i; //向右找第一个比他高的位置 + int h = Math.min(height[right], height[left]) - height[topidx]; + res += h * (right-left-1); + } + stack.push(i); + } + return res; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 6011c95779415126de391aecd12b16a7037b617f Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 6 Apr 2021 07:40:28 +0800 Subject: [PATCH 17/45] 2021-04-06 --- week01/stack/TrappingRainWater.java | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/week01/stack/TrappingRainWater.java b/week01/stack/TrappingRainWater.java index 8c32424..40fa2a4 100644 --- a/week01/stack/TrappingRainWater.java +++ b/week01/stack/TrappingRainWater.java @@ -61,6 +61,26 @@ public int trap(int[] height) { } return res; } + + public int trap2(int[] height) { + int[] maxLeft = new int[height.length]; + int[] maxRight = new int[height.length]; + // i左边最高的高度 + for(int i=1;i=0;i--){ + maxRight[i] = Math.max(height[i+1],maxRight[i+1]); + } + int res = 0; + for(int i=0;iheight[i]&&maxRight[i]>height[i]){ + res += Math.min(maxLeft[i],maxRight[i])-height[i]; + } + } + return res; + } } //leetcode submit region end(Prohibit modification and deletion) From ae2a576e591465307475f0d4a8d7f49822f77dcb Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 6 Apr 2021 07:52:26 +0800 Subject: [PATCH 18/45] 2021-04-06 --- week01/stack/TrappingRainWater.java | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/week01/stack/TrappingRainWater.java b/week01/stack/TrappingRainWater.java index 40fa2a4..13fb1b0 100644 --- a/week01/stack/TrappingRainWater.java +++ b/week01/stack/TrappingRainWater.java @@ -81,6 +81,28 @@ public int trap2(int[] height) { } return res; } + + public int trap3(int[] height) { + //双指针 + if(height.length<=2) return 0; + int res = 0; + int left = 1; + int right = height.length-2; + int maxLeft = height[0]; //记录左指针左边的最大值 + int maxRight = height[height.length-1]; //记录右指针右边的最大值 + while(left<=right){ + if(maxLeft Date: Tue, 6 Apr 2021 08:21:52 +0800 Subject: [PATCH 19/45] 2021-04-06 --- week02/map/ValidAnagram.java | 74 ++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 week02/map/ValidAnagram.java diff --git a/week02/map/ValidAnagram.java b/week02/map/ValidAnagram.java new file mode 100644 index 0000000..607bf6f --- /dev/null +++ b/week02/map/ValidAnagram.java @@ -0,0 +1,74 @@ +package week02.map; + +//给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。 +// +// 示例 1: +// +// 输入: s = "anagram", t = "nagaram" +//输出: true +// +// +// 示例 2: +// +// 输入: s = "rat", t = "car" +//输出: false +// +// 说明: +//你可以假设字符串只包含小写字母。 +// +// 进阶: +//如果输入字符串包含 unicode 字符怎么办?你能否调整你的解法来应对这种情况? +// Related Topics 排序 哈希表 +// 👍 366 👎 0 + +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; + +public class ValidAnagram{ + public static void main(String[] args) { + Solution solution = new ValidAnagram().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public boolean isAnagram(String s, String t) { + if (s.length()!=t.length()) return false; + Map map = new HashMap<>(); + for(char c : s.toCharArray()){ + map.put(c, map.getOrDefault(c,0)+1); + } + for(char c : t.toCharArray()){ + int cnt = map.getOrDefault(c,0) - 1; + if(cnt<0) return false; + map.put(c, cnt); + } + return true; + } + + public boolean isAnagram2(String s, String t) { + if(s.length()!=t.length()) return false; + int[] table = new int[26]; + for(char c : s.toCharArray()){ + table[c-'a'] ++; + } + for(char c : t.toCharArray()){ + table[c-'a'] --; + if(table[c-'a']<0) return false; + } + return true; + } + + //排序 + public boolean isAnagram3(String s, String t) { + if (s.length()!=t.length()) return false; + char[] schar = s.toCharArray(); + char[] tchar = t.toCharArray(); + Arrays.sort(schar); + Arrays.sort(tchar); + return Arrays.equals(schar, tchar); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From b331316a6783cb9118f1045434790704484c32c7 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 6 Apr 2021 15:08:55 +0800 Subject: [PATCH 20/45] 2021-04-06 --- week02/map/GroupAnagrams.java | 51 +++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 week02/map/GroupAnagrams.java diff --git a/week02/map/GroupAnagrams.java b/week02/map/GroupAnagrams.java new file mode 100644 index 0000000..0cc366b --- /dev/null +++ b/week02/map/GroupAnagrams.java @@ -0,0 +1,51 @@ +package week02.map; + +//给定一个字符串数组,将字母异位词组合在一起。字母异位词指字母相同,但排列不同的字符串。 +// +// 示例: +// +// 输入: ["eat", "tea", "tan", "ate", "nat", "bat"] +//输出: +//[ +// ["ate","eat","tea"], +// ["nat","tan"], +// ["bat"] +//] +// +// 说明: +// +// +// 所有输入均为小写字母。 +// 不考虑答案输出的顺序。 +// +// Related Topics 哈希表 字符串 +// 👍 705 👎 0 + +import java.util.*; + +public class GroupAnagrams{ + public static void main(String[] args) { + + Solution solution = new GroupAnagrams().new Solution(); + solution.groupAnagrams(new String[]{}); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public List> groupAnagrams(String[] strs) { + Map> map = new HashMap<>(); + for(String str : strs){ + char[] chararr = str.toCharArray(); + Arrays.sort(chararr); + StringBuilder sb = new StringBuilder(); + String keyStr = sb.append(chararr).toString(); + if(!map.containsKey(keyStr)){ + map.put(keyStr, new ArrayList<>()); + } + map.get(keyStr).add(str); + } + + return new ArrayList<>(map.values()); + } + } +//leetcode submit region end(Prohibit modification and deletion) +} From d58f45770b38447bc1d35f959d4cda6fc79a6f80 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 6 Apr 2021 18:45:57 +0800 Subject: [PATCH 21/45] 2021-04-06 --- week02/UglyNumberIi.java | 54 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 week02/UglyNumberIi.java diff --git a/week02/UglyNumberIi.java b/week02/UglyNumberIi.java new file mode 100644 index 0000000..676f7f3 --- /dev/null +++ b/week02/UglyNumberIi.java @@ -0,0 +1,54 @@ +package week02; + +//编写一个程序,找出第 n 个丑数。 +// +// 丑数就是质因数只包含 2, 3, 5 的正整数。 +// +// 示例: +// +// 输入: n = 10 +//输出: 12 +//解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 是前 10 个丑数。 +// +// 说明: +// +// +// 1 是丑数。 +// n 不超过1690。 +// +// Related Topics 堆 数学 动态规划 +// 👍 500 👎 0 + +//reference: https://leetcode-cn.com/problems/chou-shu-lcof/solution/chou-shu-ii-qing-xi-de-tui-dao-si-lu-by-mrsate/ +//相当于合并三个有序数组 +// dp[0]*2,dp[1]*2 +// dp[0]*3,dp[1]*3 +// dp[0]*5,dp[1]*5 +public class UglyNumberIi{ + public static void main(String[] args) { + Solution solution = new UglyNumberIi().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int nthUglyNumber(int n) { + int[] dp = new int[n]; + dp[0] = 1; + int a = 0; + int b = 0; + int c = 0; + for(int i=1;i Date: Tue, 6 Apr 2021 20:41:34 +0800 Subject: [PATCH 22/45] 2021-04-06 --- week01/queue/SlidingWindowMaximum.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/week01/queue/SlidingWindowMaximum.java b/week01/queue/SlidingWindowMaximum.java index 186122b..22b99ac 100644 --- a/week01/queue/SlidingWindowMaximum.java +++ b/week01/queue/SlidingWindowMaximum.java @@ -68,8 +68,10 @@ public class SlidingWindowMaximum { public int[] maxSlidingWindow(int[] nums, int k) { Deque deque = new LinkedList<>(); + //注意res的长度 int[] res = new int[nums.length-k+1]; // 初始化一个单调递减栈 + //从队尾依次弹出 for(int j=0;jdeque.peekLast()){ deque.pollLast(); From d4968bf08622cc3ba70c9a1c68a09ba03bf88bf8 Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 6 Apr 2021 22:23:52 +0800 Subject: [PATCH 23/45] 2021-04-06 --- week01/queue/GetLeastKNumbers.java | 99 ++++++++++++++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 week01/queue/GetLeastKNumbers.java diff --git a/week01/queue/GetLeastKNumbers.java b/week01/queue/GetLeastKNumbers.java new file mode 100644 index 0000000..d1f74ae --- /dev/null +++ b/week01/queue/GetLeastKNumbers.java @@ -0,0 +1,99 @@ +package week01.queue; + +//输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 +// +// +// +// 示例 1: +// +// 输入:arr = [3,2,1], k = 2 +//输出:[1,2] 或者 [2,1] +// +// +// 示例 2: +// +// 输入:arr = [0,1,2,1], k = 1 +//输出:[0] +// +// +// +// 限制: +// +// +// 0 <= k <= arr.length <= 10000 +// 0 <= arr[i] <= 10000 +// +// Related Topics 堆 分治算法 +// 👍 221 👎 0 + +import java.util.PriorityQueue; +import java.util.Random; + +public class GetLeastKNumbers { + public static void main(String[] args) { + Solution solution = new GetLeastKNumbers().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + //时间复杂度:O(nlog(k)) 每次插入删除O(logk) + //空间复杂度: O(k) + Random random = new Random(); + public int[] getLeastNumbers(int[] arr, int k) { + PriorityQueue minHeap = new PriorityQueue<>(k, (a,b)->a-b); + for(int num: arr){ + minHeap.add(num); + } + int[] res = new int[k]; + for(int i=0;ik-1){ + right = ind-1; + } else{ + left = ind+1; + } + } + } + + public int partition(int[] nums, int left, int right){ + if(left=pivot (j,right] + int j = left; + for(int i=left+1;i<=right;i++){ + if(nums[i] Date: Wed, 7 Apr 2021 07:10:29 +0800 Subject: [PATCH 24/45] 2021-04-07 --- week02/tree/BinaryTreeInorderTraversal.java | 82 +++++++++++++++++++ .../tree/BinaryTreeLevelOrderTraversal.java | 64 +++++++++++++++ week02/tree/TreeNode.java | 17 ++++ 3 files changed, 163 insertions(+) create mode 100644 week02/tree/BinaryTreeInorderTraversal.java create mode 100644 week02/tree/BinaryTreeLevelOrderTraversal.java create mode 100644 week02/tree/TreeNode.java diff --git a/week02/tree/BinaryTreeInorderTraversal.java b/week02/tree/BinaryTreeInorderTraversal.java new file mode 100644 index 0000000..1d69bbf --- /dev/null +++ b/week02/tree/BinaryTreeInorderTraversal.java @@ -0,0 +1,82 @@ +package week02.tree; + +//给定一个二叉树的根节点 root ,返回它的 中序 遍历。 +// +// +// +// 示例 1: +// +// +//输入:root = [1,null,2,3] +//输出:[1,3,2] +// +// +// 示例 2: +// +// +//输入:root = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:root = [1] +//输出:[1] +// +// +// 示例 4: +// +// +//输入:root = [1,2] +//输出:[2,1] +// +// +// 示例 5: +// +// +//输入:root = [1,null,2] +//输出:[1,2] +// +// +// +// +// 提示: +// +// +// 树中节点数目在范围 [0, 100] 内 +// -100 <= Node.val <= 100 +// +// +// +// +// 进阶: 递归算法很简单,你可以通过迭代算法完成吗? +// Related Topics 栈 树 哈希表 +// 👍 905 👎 0 + + +import java.util.ArrayList; +import java.util.List; + +public class BinaryTreeInorderTraversal{ + public static void main(String[] args) { + Solution solution = new BinaryTreeInorderTraversal().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + + class Solution { + public List inorderTraversal(TreeNode root) { + List res = new ArrayList<>(); + helper(root, res); + return res; + } + public void helper(TreeNode node, List path){ + if(node == null) return; + helper(node.left,path); + path.add(node.val); + helper(node.right,path); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/week02/tree/BinaryTreeLevelOrderTraversal.java b/week02/tree/BinaryTreeLevelOrderTraversal.java new file mode 100644 index 0000000..d1548d1 --- /dev/null +++ b/week02/tree/BinaryTreeLevelOrderTraversal.java @@ -0,0 +1,64 @@ +package week02.tree; + +//给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。 +// +// +// +// 示例: +//二叉树:[3,9,20,null,null,15,7], +// +// +// 3 +// / \ +// 9 20 +// / \ +// 15 7 +// +// +// 返回其层序遍历结果: +// +// +//[ +// [3], +// [9,20], +// [15,7] +//] +// +// Related Topics 树 广度优先搜索 +// 👍 831 👎 0 + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; + +public class BinaryTreeLevelOrderTraversal{ + public static void main(String[] args) { + Solution solution = new BinaryTreeLevelOrderTraversal().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + + class Solution { + public List> levelOrder(TreeNode root) { + List> res = new ArrayList<>(); + if (root == null) return res; + Queue queue = new LinkedList<>(); + queue.offer(root); + while(!queue.isEmpty()){ + int size = queue.size(); + List cur = new ArrayList<>(); + for(int i=0;i Date: Wed, 7 Apr 2021 13:06:27 +0800 Subject: [PATCH 25/45] 2021-04-07 --- week02/map/TopKFrequentElements.java | 78 ++++++++++++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 week02/map/TopKFrequentElements.java diff --git a/week02/map/TopKFrequentElements.java b/week02/map/TopKFrequentElements.java new file mode 100644 index 0000000..5ec16e0 --- /dev/null +++ b/week02/map/TopKFrequentElements.java @@ -0,0 +1,78 @@ +package week02.map; + +//给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 +// +// +// +// 示例 1: +// +// 输入: nums = [1,1,1,2,2,3], k = 2 +//输出: [1,2] +// +// +// 示例 2: +// +// 输入: nums = [1], k = 1 +//输出: [1] +// +// +// +// 提示: +// +// +// 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 +// 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 +// 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 +// 你可以按任意顺序返回答案。 +// +// Related Topics 堆 哈希表 +// 👍 713 👎 0 + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class TopKFrequentElements{ + public static void main(String[] args) { + Solution solution = new TopKFrequentElements().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int[] topKFrequent(int[] nums, int k) { + //首先对于nums中数字计数 + Map freq = getFreq(nums); + //注意List数组的构造 + int n = nums.length; + //数字出现的最大的次数<=n + List[] counter = new List[n+1]; + for(Map.Entry entry: freq.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + if(counter[cnt]==null){ + counter[cnt] = new ArrayList<>(); + } + counter[cnt].add(num); + } + int j = 0; + int[] res = new int[k]; + for(int i=n;i>=1&&j getFreq(int[] nums){ + Map map = new HashMap<>(); + for(int num : nums){ + map.put(num, map.getOrDefault(num,0)+1); + } + return map; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 1614eb73a41d8275e7bd717b20804960c32a82b1 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 7 Apr 2021 20:52:30 +0800 Subject: [PATCH 26/45] 2021-04-07 --- week02/map/TopKFrequentElements.java | 62 ++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/week02/map/TopKFrequentElements.java b/week02/map/TopKFrequentElements.java index 5ec16e0..f7ae550 100644 --- a/week02/map/TopKFrequentElements.java +++ b/week02/map/TopKFrequentElements.java @@ -28,10 +28,7 @@ // Related Topics 堆 哈希表 // 👍 713 👎 0 -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; public class TopKFrequentElements{ public static void main(String[] args) { @@ -39,6 +36,7 @@ public static void main(String[] args) { } //leetcode submit region begin(Prohibit modification and deletion) class Solution { + //hashMap public int[] topKFrequent(int[] nums, int k) { //首先对于nums中数字计数 Map freq = getFreq(nums); @@ -72,6 +70,62 @@ public Map getFreq(int[] nums){ } return map; } + + // minheap + public int[] topKFrequent2(int[] nums, int k) { + Map occur = getFreq(nums); + //注意heap的构造 + PriorityQueue minHeap = new PriorityQueue<>( + new Comparator() { + @Override + public int compare(int[] o1, int[] o2) { + return o1[1] - o2[1]; + } + } + ); + for(Map.Entry entry : occur.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + //注意是小于k + if(minHeap.size() occur = getFreq(nums); + //注意heap的构造 + PriorityQueue maxHeap = new PriorityQueue<>(k, + new Comparator() { + @Override + public int compare(int[] o1, int[] o2) { + return o2[1] -o1[1]; + } + } + ); + for(Map.Entry entry : occur.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + maxHeap.offer(new int[]{num,cnt}); + } + int[] res = new int[k]; + for(int i=0;i Date: Wed, 7 Apr 2021 21:12:42 +0800 Subject: [PATCH 27/45] 2021-04-07 --- week01/{queue => heap}/GetLeastKNumbers.java | 2 +- week01/heap/TopKFrequentElements.java | 132 +++++++++++++++++++ 2 files changed, 133 insertions(+), 1 deletion(-) rename week01/{queue => heap}/GetLeastKNumbers.java (99%) create mode 100644 week01/heap/TopKFrequentElements.java diff --git a/week01/queue/GetLeastKNumbers.java b/week01/heap/GetLeastKNumbers.java similarity index 99% rename from week01/queue/GetLeastKNumbers.java rename to week01/heap/GetLeastKNumbers.java index d1f74ae..d6c6c53 100644 --- a/week01/queue/GetLeastKNumbers.java +++ b/week01/heap/GetLeastKNumbers.java @@ -1,4 +1,4 @@ -package week01.queue; +package week01.heap; //输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。 // diff --git a/week01/heap/TopKFrequentElements.java b/week01/heap/TopKFrequentElements.java new file mode 100644 index 0000000..e5e32dd --- /dev/null +++ b/week01/heap/TopKFrequentElements.java @@ -0,0 +1,132 @@ +package week01.heap; + +//给定一个非空的整数数组,返回其中出现频率前 k 高的元素。 +// +// +// +// 示例 1: +// +// 输入: nums = [1,1,1,2,2,3], k = 2 +//输出: [1,2] +// +// +// 示例 2: +// +// 输入: nums = [1], k = 1 +//输出: [1] +// +// +// +// 提示: +// +// +// 你可以假设给定的 k 总是合理的,且 1 ≤ k ≤ 数组中不相同的元素的个数。 +// 你的算法的时间复杂度必须优于 O(n log n) , n 是数组的大小。 +// 题目数据保证答案唯一,换句话说,数组中前 k 个高频元素的集合是唯一的。 +// 你可以按任意顺序返回答案。 +// +// Related Topics 堆 哈希表 +// 👍 713 👎 0 + +import java.util.*; + +public class TopKFrequentElements { + public static void main(String[] args) { + Solution solution = new TopKFrequentElements().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + //hashMap + public int[] topKFrequent(int[] nums, int k) { + //首先对于nums中数字计数 + Map freq = getFreq(nums); + //注意List数组的构造 + int n = nums.length; + //数字出现的最大的次数<=n + List[] counter = new List[n+1]; + for(Map.Entry entry: freq.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + if(counter[cnt]==null){ + counter[cnt] = new ArrayList<>(); + } + counter[cnt].add(num); + } + int j = 0; + int[] res = new int[k]; + for(int i=n;i>=1&&j getFreq(int[] nums){ + Map map = new HashMap<>(); + for(int num : nums){ + map.put(num, map.getOrDefault(num,0)+1); + } + return map; + } + + // minheap + public int[] topKFrequent2(int[] nums, int k) { + Map occur = getFreq(nums); + //注意heap的构造 + PriorityQueue minHeap = new PriorityQueue<>( + new Comparator() { + @Override + public int compare(int[] o1, int[] o2) { + return o1[1] - o2[1]; + } + } + ); + for(Map.Entry entry : occur.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + //注意是小于k + if(minHeap.size() occur = getFreq(nums); + //注意heap的构造 + PriorityQueue maxHeap = new PriorityQueue<>(k, + new Comparator() { + @Override + public int compare(int[] o1, int[] o2) { + return o2[1] -o1[1]; + } + } + ); + for(Map.Entry entry : occur.entrySet()){ + int num = entry.getKey(); + int cnt = entry.getValue(); + maxHeap.offer(new int[]{num,cnt}); + } + int[] res = new int[k]; + for(int i=0;i Date: Wed, 7 Apr 2021 22:24:15 +0800 Subject: [PATCH 28/45] 2021-04-07 --- week02/dfs/GenerateParentheses.java | 65 +++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 week02/dfs/GenerateParentheses.java diff --git a/week02/dfs/GenerateParentheses.java b/week02/dfs/GenerateParentheses.java new file mode 100644 index 0000000..6eabbdb --- /dev/null +++ b/week02/dfs/GenerateParentheses.java @@ -0,0 +1,65 @@ +package week02.dfs; + +//数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 +// +// +// +// 示例 1: +// +// +//输入:n = 3 +//输出:["((()))","(()())","(())()","()(())","()()()"] +// +// +// 示例 2: +// +// +//输入:n = 1 +//输出:["()"] +// +// +// +// +// 提示: +// +// +// 1 <= n <= 8 +// +// Related Topics 字符串 回溯算法 +// 👍 1703 👎 0 + +import java.util.ArrayList; +import java.util.List; + +public class GenerateParentheses{ + public static void main(String[] args) { + Solution solution = new GenerateParentheses().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public List generateParenthesis(int n) { + List res = new ArrayList<>(); + dfs(0,0, n ,"",res); + return res; + } + + // left:已经用了几个左括号 + // right: 已经用了几个右括号 + public void dfs(int left, int right, int n, String curStr, List res){ + if(left==n&&right==n){ + res.add(curStr); + return; + } + //右括号数比左括号数多,剪枝 + if(left Date: Wed, 7 Apr 2021 23:04:02 +0800 Subject: [PATCH 29/45] 2021-04-07 --- week02/tree/InvertBinaryTree.java | 63 +++++++++++++++++ week02/tree/ValidateBinarySearchTree.java | 86 +++++++++++++++++++++++ 2 files changed, 149 insertions(+) create mode 100644 week02/tree/InvertBinaryTree.java create mode 100644 week02/tree/ValidateBinarySearchTree.java diff --git a/week02/tree/InvertBinaryTree.java b/week02/tree/InvertBinaryTree.java new file mode 100644 index 0000000..ac1559c --- /dev/null +++ b/week02/tree/InvertBinaryTree.java @@ -0,0 +1,63 @@ +package week02.tree; + +//翻转一棵二叉树。 +// +// 示例: +// +// 输入: +// +// 4 +// / \ +// 2 7 +// / \ / \ +//1 3 6 9 +// +// 输出: +// +// 4 +// / \ +// 7 2 +// / \ / \ +//9 6 3 1 +// +// 备注: +//这个问题是受到 Max Howell 的 原问题 启发的 : +// +// 谷歌:我们90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。 +// Related Topics 树 +// 👍 812 👎 0 + +public class InvertBinaryTree{ + public static void main(String[] args) { + Solution solution = new InvertBinaryTree().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for a binary tree node. + * public 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; + * this.left = left; + * this.right = right; + * } + * } + */ + class Solution { + //时间复杂度:O(N) + public TreeNode invertTree(TreeNode root) { + if(root == null) return root; + TreeNode left = invertTree(root.left); + TreeNode right = invertTree(root.right); + root.left = right; + root.right = left; + return root; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/week02/tree/ValidateBinarySearchTree.java b/week02/tree/ValidateBinarySearchTree.java new file mode 100644 index 0000000..b52d8b9 --- /dev/null +++ b/week02/tree/ValidateBinarySearchTree.java @@ -0,0 +1,86 @@ +package week02.tree; + +//给定一个二叉树,判断其是否是一个有效的二叉搜索树。 +// +// 假设一个二叉搜索树具有如下特征: +// +// +// 节点的左子树只包含小于当前节点的数。 +// 节点的右子树只包含大于当前节点的数。 +// 所有左子树和右子树自身必须也是二叉搜索树。 +// +// +// 示例 1: +// +// 输入: +// 2 +// / \ +// 1 3 +//输出: true +// +// +// 示例 2: +// +// 输入: +// 5 +// / \ +// 1 4 +//  / \ +//  3 6 +//输出: false +//解释: 输入为: [5,1,4,null,null,3,6]。 +//  根节点的值为 5 ,但是其右子节点值为 4 。 +// +// Related Topics 树 深度优先搜索 递归 +// 👍 1003 👎 0 + +public class ValidateBinarySearchTree{ + public static void main(String[] args) { + Solution solution = new ValidateBinarySearchTree().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for a binary tree node. + * public 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; + * this.left = left; + * this.right = right; + * } + * } + */ + class Solution { + class ResultType{ + //注意是long,否则会溢出 + long minVal; + long maxVal; + boolean valid; + ResultType(long minVal, long maxVal, boolean valid){ + this.minVal = minVal; + this.maxVal = maxVal; + this.valid = valid; + } + } + public boolean isValidBST(TreeNode root) { + ResultType result = helper(root); + return result.valid; + } + + public ResultType helper(TreeNode node){ + if(node==null) return new ResultType(Long.MAX_VALUE, Long.MIN_VALUE,true); + ResultType left = helper(node.left); + ResultType right = helper(node.right); + long minVal = Math.min(Math.min(left.minVal,right.minVal),node.val); + long maxVal = Math.max(Math.max(left.maxVal,right.maxVal),node.val); + boolean valid = left.valid && right.valid && left.maxVal < node.val && right.minVal > node.val; + return new ResultType(minVal, maxVal, valid); + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 672520cc34a8532de3ceb994465f287a2ff80e49 Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 8 Apr 2021 08:52:54 +0800 Subject: [PATCH 30/45] 2021-04-08 --- .../SerializeAndDeserializeBinaryTree.java | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 week02/tree/SerializeAndDeserializeBinaryTree.java diff --git a/week02/tree/SerializeAndDeserializeBinaryTree.java b/week02/tree/SerializeAndDeserializeBinaryTree.java new file mode 100644 index 0000000..ca3f461 --- /dev/null +++ b/week02/tree/SerializeAndDeserializeBinaryTree.java @@ -0,0 +1,131 @@ +package week02.tree; + +//序列化是将一个数据结构或者对象转换为连续的比特位的操作,进而可以将转换后的数据存储在一个文件或者内存中,同时也可以通过网络传输到另一个计算机环境,采取相反方 +//式重构得到原数据。 +// +// 请设计一个算法来实现二叉树的序列化与反序列化。这里不限定你的序列 / 反序列化算法执行逻辑,你只需要保证一个二叉树可以被序列化为一个字符串并且将这个字符串 +//反序列化为原始的树结构。 +// +// 提示: 输入输出格式与 LeetCode 目前使用的方式一致,详情请参阅 LeetCode 序列化二叉树的格式。你并非必须采取这种方式,你也可以采用其他的 +//方法解决这个问题。 +// +// +// +// 示例 1: +// +// +//输入:root = [1,2,3,null,null,4,5] +//输出:[1,2,3,null,null,4,5] +// +// +// 示例 2: +// +// +//输入:root = [] +//输出:[] +// +// +// 示例 3: +// +// +//输入:root = [1] +//输出:[1] +// +// +// 示例 4: +// +// +//输入:root = [1,2] +//输出:[1,2] +// +// +// +// +// 提示: +// +// +// 树中结点数在范围 [0, 104] 内 +// -1000 <= Node.val <= 1000 +// +// Related Topics 树 设计 +// 👍 537 👎 0 + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; + +public class SerializeAndDeserializeBinaryTree{ + public static void main(String[] args) { + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ + public class Codec { + + // Encodes a tree to a single string. + public String serialize(TreeNode root) { + if(root == null) return "{}"; + List queue = new LinkedList<>(); + queue.add(root); + //把所有的节点按照层次遍历塞到队列里 + for(int i=0;i queue = new ArrayList<>(); + queue.add(root); + boolean left = true; + int index = 0; + for(int i=1;i Date: Tue, 13 Apr 2021 07:27:31 +0800 Subject: [PATCH 31/45] 2021-04-13 --- week02/dfs/Combinations.java | 55 ++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 week02/dfs/Combinations.java diff --git a/week02/dfs/Combinations.java b/week02/dfs/Combinations.java new file mode 100644 index 0000000..ed52c79 --- /dev/null +++ b/week02/dfs/Combinations.java @@ -0,0 +1,55 @@ +package week02.dfs; + +//给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。 +// +// 示例: +// +// 输入: n = 4, k = 2 +//输出: +//[ +// [2,4], +// [3,4], +// [2,3], +// [1,2], +// [1,3], +// [1,4], +//] +// Related Topics 回溯算法 +// 👍 550 👎 0 + +import java.util.ArrayList; +import java.util.List; + + +public class Combinations{ + public static void main(String[] args) { + Solution solution = new Combinations().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> results = new ArrayList<>(); + int n; + public List> combine(int n, int k) { + this.n = n; + dfs(1,k,new ArrayList<>()); + return results; + } + public void dfs(int begin, int k, List path){ + if(path.size()==k){ + //注意要new一个新的,否则结果为空 + results.add(new ArrayList<>(path)); + return; + } + for(int i=begin;i<=this.n;i++){ + //这里是剪枝 pathsize+可以选择的最多的数的个数 Date: Tue, 13 Apr 2021 23:14:35 +0800 Subject: [PATCH 32/45] 2021-04-13 --- .../dfs/LetterCombinationsOfAPhoneNumber.java | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 week02/dfs/LetterCombinationsOfAPhoneNumber.java diff --git a/week02/dfs/LetterCombinationsOfAPhoneNumber.java b/week02/dfs/LetterCombinationsOfAPhoneNumber.java new file mode 100644 index 0000000..e98f242 --- /dev/null +++ b/week02/dfs/LetterCombinationsOfAPhoneNumber.java @@ -0,0 +1,89 @@ +package week02.dfs; + +//给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 +// +// 给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。 +// +// +// +// +// +// 示例 1: +// +// +//输入:digits = "23" +//输出:["ad","ae","af","bd","be","bf","cd","ce","cf"] +// +// +// 示例 2: +// +// +//输入:digits = "" +//输出:[] +// +// +// 示例 3: +// +// +//输入:digits = "2" +//输出:["a","b","c"] +// +// +// +// +// 提示: +// +// +// 0 <= digits.length <= 4 +// digits[i] 是范围 ['2', '9'] 的一个数字。 +// +// Related Topics 深度优先搜索 递归 字符串 回溯算法 +// 👍 1248 👎 0 + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class LetterCombinationsOfAPhoneNumber{ + public static void main(String[] args) { + Solution solution = new LetterCombinationsOfAPhoneNumber().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public Map map = new HashMap(){ + { + put('2', "abc"); + put('3', "def"); + put('4', "ghi"); + put('5', "jkl"); + put('6', "mno"); + put('7', "pqrs"); + put('8', "tuv"); + put('9', "wxyz"); + } + }; + List results = new ArrayList<>(); + StringBuilder sb = new StringBuilder(); + public List letterCombinations(String digits) { + //注意输入为"", 直接返回,而不是返回 [""] + if (digits == null || digits.length() == 0) return results; + dfs(digits, 0); + return results; + } + public void dfs(String digits, int index){ + if(index == digits.length()){ + results.add(sb.toString()); + return; + } + char alpha = digits.charAt(index); + for (char c: map.get(alpha).toCharArray()){ + sb.append(c); + dfs(digits, index+1); + sb.deleteCharAt(sb.length()-1); + } + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From d48dd87793404f6116a70c886ceecf15df6b2ea9 Mon Sep 17 00:00:00 2001 From: luxindi Date: Wed, 14 Apr 2021 08:36:49 +0800 Subject: [PATCH 33/45] 2021-04-14 --- week02/dfs/Permutations.java | 84 ++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 week02/dfs/Permutations.java diff --git a/week02/dfs/Permutations.java b/week02/dfs/Permutations.java new file mode 100644 index 0000000..065fd13 --- /dev/null +++ b/week02/dfs/Permutations.java @@ -0,0 +1,84 @@ +package week02.dfs; + +//给定一个 没有重复 数字的序列,返回其所有可能的全排列。 +// +// 示例: +// +// 输入: [1,2,3] +//输出: +//[ +// [1,2,3], +// [1,3,2], +// [2,1,3], +// [2,3,1], +// [3,1,2], +// [3,2,1] +//] +// Related Topics 回溯算法 +// 👍 1290 👎 0 + +import java.util.ArrayList; +import java.util.List; + +//[46]全排列 +public class Permutations{ + public static void main(String[] args) { + Solution solution = new Permutations().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> results = new ArrayList<>(); + public List> permute(int[] nums) { + if(nums==null || nums.length==0) return results; + int[] flags = new int[nums.length]; + dfs(nums, flags, new ArrayList<>()); + return results; + } + + //每个位置都是从剩下没有被挑选过的元素中挑选一个,所以用一个flags标记元素是否已经被选择过 + public void dfs(int[] nums, int[] flags, List path){ + if(path.size()==nums.length){ + results.add(new ArrayList<>(path)); + return; + } + for(int i=0;i> results = new ArrayList<>(); + public List> permute(int[] nums) { + dfs(0,nums,new ArrayList<>()); + return results; + } + + // begin, 在选path第几个位置的数 + public void dfs(int begin, int[] nums, List path){ + if(path.size()==nums.length){ + results.add(new ArrayList<>(path)); + return; + } + for(int i=begin;i Date: Thu, 15 Apr 2021 06:04:14 +0800 Subject: [PATCH 34/45] 2021-04-15 --- week02/dfs/PermutationsIi.java | 76 ++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 week02/dfs/PermutationsIi.java diff --git a/week02/dfs/PermutationsIi.java b/week02/dfs/PermutationsIi.java new file mode 100644 index 0000000..3e1d8db --- /dev/null +++ b/week02/dfs/PermutationsIi.java @@ -0,0 +1,76 @@ +package week02.dfs; + +//给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。 +// +// +// +// 示例 1: +// +// +//输入:nums = [1,1,2] +//输出: +//[[1,1,2], +// [1,2,1], +// [2,1,1]] +// +// +// 示例 2: +// +// +//输入:nums = [1,2,3] +//输出:[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]] +// +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 8 +// -10 <= nums[i] <= 10 +// +// Related Topics 回溯算法 +// 👍 670 👎 0 + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class PermutationsIi{ + public static void main(String[] args) { + Solution solution = new PermutationsIi().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> results = new ArrayList<>(); + public List> permuteUnique(int[] nums) { + //排序 + Arrays.sort(nums); + dfs(nums, new ArrayList<>(), new int[nums.length]); + return results; + } + public void dfs(int[] nums, List path, int[] flags){ + if(path.size() == nums.length){ + results.add(new ArrayList<>(path)); + return; + } + int i = 0; + while (i Date: Thu, 15 Apr 2021 21:52:42 +0800 Subject: [PATCH 35/45] 2021-04-15 --- ...ryTreeFromPreorderAndInorderTraversal.java | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 week02/tree/ConstructBinaryTreeFromPreorderAndInorderTraversal.java diff --git a/week02/tree/ConstructBinaryTreeFromPreorderAndInorderTraversal.java b/week02/tree/ConstructBinaryTreeFromPreorderAndInorderTraversal.java new file mode 100644 index 0000000..b4c1006 --- /dev/null +++ b/week02/tree/ConstructBinaryTreeFromPreorderAndInorderTraversal.java @@ -0,0 +1,75 @@ +package week02.tree; + +//根据一棵树的前序遍历与中序遍历构造二叉树。 +// +// 注意: +//你可以假设树中没有重复的元素。 +// +// 例如,给出 +// +// 前序遍历 preorder = [3,9,20,15,7] +//中序遍历 inorder = [9,3,15,20,7] +// +// 返回如下的二叉树: +// +// 3 +// / \ +// 9 20 +// / \ +// 15 7 +// Related Topics 树 深度优先搜索 数组 +// 👍 987 👎 0 + +import java.util.HashMap; +import java.util.Map; + +public class ConstructBinaryTreeFromPreorderAndInorderTraversal{ + public static void main(String[] args) { + Solution solution = new ConstructBinaryTreeFromPreorderAndInorderTraversal().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for a binary tree node. + * public 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; + * this.left = left; + * this.right = right; + * } + * } + */ + class Solution { + int[] preorder; + int[] inorder; + int preidx = 0; + Map idxMap; + public TreeNode buildTree(int[] preorder, int[] inorder) { + this.preorder = preorder; + this.inorder = inorder; + // 注意因为树中没有重复的数字 + idxMap = new HashMap<>(); + for(int i=0;iright) return null; + int rootval = this.preorder[this.preidx]; + TreeNode root = new TreeNode(rootval); + int rootidx = this.idxMap.get(rootval); + this.preidx ++; + root.left = helper(left,rootidx-1); + root.right = helper(rootidx+1,right); + return root; + } + } +//leetcode submit region end(Prohibit modification and deletion) +} From 562662218634d65c80b73567726dff0f43359d1d Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 15 Apr 2021 22:37:02 +0800 Subject: [PATCH 36/45] 2021-04-15 --- .../LowestCommonAncestorOfABinaryTree.java | 80 +++++++++++++++++++ week02/tree/TreeNode.java | 4 +- 2 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 week02/recursion/LowestCommonAncestorOfABinaryTree.java diff --git a/week02/recursion/LowestCommonAncestorOfABinaryTree.java b/week02/recursion/LowestCommonAncestorOfABinaryTree.java new file mode 100644 index 0000000..3229fdc --- /dev/null +++ b/week02/recursion/LowestCommonAncestorOfABinaryTree.java @@ -0,0 +1,80 @@ +package week02.recursion; + + +//给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 +// +// 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大( +//一个节点也可以是它自己的祖先)。” +// +// +// +// 示例 1: +// +// +//输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1 +//输出:3 +//解释:节点 5 和节点 1 的最近公共祖先是节点 3 。 +// +// +// 示例 2: +// +// +//输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 4 +//输出:5 +//解释:节点 5 和节点 4 的最近公共祖先是节点 5 。因为根据定义最近公共祖先节点可以为节点本身。 +// +// +// 示例 3: +// +// +//输入:root = [1,2], p = 1, q = 2 +//输出:1 +// +// +// +// +// 提示: +// +// +// 树中节点数目在范围 [2, 105] 内。 +// -109 <= Node.val <= 109 +// 所有 Node.val 互不相同 。 +// p != q +// p 和 q 均存在于给定的二叉树中。 +// +// Related Topics 树 +// 👍 1079 👎 0 + +import week02.tree.TreeNode; +public class LowestCommonAncestorOfABinaryTree{ + public static void main(String[] args) { + Solution solution = new LowestCommonAncestorOfABinaryTree().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + /** + * Definition for a binary tree node. + * public class TreeNode { + * int val; + * TreeNode left; + * TreeNode right; + * TreeNode(int x) { val = x; } + * } + */ + class Solution { + public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + // 如果p,q都不在root下,返回null + // 如果拼p,q都在root下,返回最近公共祖先 + // 如果p,q只有一个在root下,返回p或者q + if(root == null) return null; + if(p==root||q==root) return root; + TreeNode left = lowestCommonAncestor(root.left,p,q); + TreeNode right = lowestCommonAncestor(root.right,p,q); + if(left==null && right!=null) return right; + if(left!=null && right == null) return left; + if(left!=null && right !=null) return root; + return null; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/week02/tree/TreeNode.java b/week02/tree/TreeNode.java index 7779d30..db31ab7 100644 --- a/week02/tree/TreeNode.java +++ b/week02/tree/TreeNode.java @@ -5,8 +5,8 @@ * */ public class TreeNode { int val; - TreeNode left; - TreeNode right; + public TreeNode left; + public TreeNode right; TreeNode() {} TreeNode(int val) { this.val = val; } TreeNode(int val, TreeNode left, TreeNode right) { From f90384b1fc724b859cd5a981993782e0ead48a4a Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 15 Apr 2021 23:18:28 +0800 Subject: [PATCH 37/45] 2021-04-15 --- week01/array/MajorityElement.java | 59 +++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 week01/array/MajorityElement.java diff --git a/week01/array/MajorityElement.java b/week01/array/MajorityElement.java new file mode 100644 index 0000000..7a169f6 --- /dev/null +++ b/week01/array/MajorityElement.java @@ -0,0 +1,59 @@ +package week01.array; + +//给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 +// +// 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 +// +// +// +// 示例 1: +// +// +//输入:[3,2,3] +//输出:3 +// +// 示例 2: +// +// +//输入:[2,2,1,1,1,2,2] +//输出:2 +// +// +// +// +// 进阶: +// +// +// 尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。 +// +// Related Topics 位运算 数组 分治算法 +// 👍 956 👎 0 + +import java.util.HashMap; +import java.util.Map; + +public class MajorityElement{ + public static void main(String[] args) { + Solution solution = new MajorityElement().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + //不同的元素抵消,最多的元素一定留到最后 + public int majorityElement(int[] nums) { + int majority = 0; + int votes = 0; + for(int i=0;i Date: Fri, 16 Apr 2021 09:50:19 +0800 Subject: [PATCH 38/45] 2021-04-16 --- week01/five-01.xlsx | Bin 13030 -> 20717 bytes week02/dfs/Subsets.java | 86 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 week02/dfs/Subsets.java diff --git a/week01/five-01.xlsx b/week01/five-01.xlsx index bbdf7ae2179bf59d3550d9249719199539c9f6fe..a0de148249034ef2222d9f3182b60816039b24c5 100644 GIT binary patch delta 16660 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�L=`C~IOMD-QlYTkF5c)+GNTWBWq}_zL4NEjf3$!Ng7k4WD*NZ@{{UU<93%h$ delta 8990 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 Ozcu5p#(Zr5wEiC+Bc{aw diff --git a/week02/dfs/Subsets.java b/week02/dfs/Subsets.java new file mode 100644 index 0000000..263e1a5 --- /dev/null +++ b/week02/dfs/Subsets.java @@ -0,0 +1,86 @@ +package week02.dfs; + +//给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 +// +// 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 +// +// +// +// 示例 1: +// +// +//输入:nums = [1,2,3] +//输出:[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]] +// +// +// 示例 2: +// +// +//输入:nums = [0] +//输出:[[],[0]] +// +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 10 +// -10 <= nums[i] <= 10 +// nums 中的所有元素 互不相同 +// +// Related Topics 位运算 数组 回溯算法 +// 👍 1137 👎 0 + +import sun.jvm.hotspot.runtime.aarch64.AARCH64CurrentFrameGuess; + +import java.util.ArrayList; +import java.util.List; + +public class Subsets{ + public static void main(String[] args) { + Solution solution = new Subsets().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> results = new ArrayList<>(); + public List> subsets(int[] nums) { + dfs(nums,0,new ArrayList<>()); + return results; + } + + public void dfs(int[] nums, int begin, List path){ + if(begin==nums.length){ + results.add(new ArrayList<>(path)); + return; + } + //每个元素都有加或者不加两种选择 + dfs(nums,begin+1,path); + + path.add(nums[begin]); + dfs(nums,begin+1,path); + path.remove(path.size()-1); + } + } +//leetcode submit region end(Prohibit modification and deletion) +class Solution2 { + List> results = new ArrayList<>(); + public List> subsets(int[] nums) { + dfs(nums,0,new ArrayList<>()); + return results; + } + + public void dfs(int[] nums, int begin, List path){ + //不选择这个元素,直接加到results里 + results.add(new ArrayList<>(path)); + //选择这个元素,接下来dfs + for(int i=begin;i Date: Fri, 16 Apr 2021 09:56:04 +0800 Subject: [PATCH 39/45] 2021-04-16 --- week02/dfs/SubsetsIi.java | 66 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 week02/dfs/SubsetsIi.java diff --git a/week02/dfs/SubsetsIi.java b/week02/dfs/SubsetsIi.java new file mode 100644 index 0000000..2573fac --- /dev/null +++ b/week02/dfs/SubsetsIi.java @@ -0,0 +1,66 @@ +package week02.dfs; + +//给你一个整数数组 nums ,其中可能包含重复元素,请你返回该数组所有可能的子集(幂集)。 +// +// 解集 不能 包含重复的子集。返回的解集中,子集可以按 任意顺序 排列。 +// +// +// +// +// +// 示例 1: +// +// +//输入:nums = [1,2,2] +//输出:[[],[1],[1,2],[1,2,2],[2],[2,2]] +// +// +// 示例 2: +// +// +//输入:nums = [0] +//输出:[[],[0]] +// +// +// +// +// 提示: +// +// +// 1 <= nums.length <= 10 +// -10 <= nums[i] <= 10 +// +// +// +// Related Topics 数组 回溯算法 +// 👍 561 👎 0 + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +public class SubsetsIi{ + public static void main(String[] args) { + Solution solution = new SubsetsIi().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + List> results = new ArrayList<>(); + public List> subsetsWithDup(int[] nums) { + Arrays.sort(nums); + dfs(nums,0,new ArrayList<>()); + return results; + } + public void dfs(int[] nums, int begin, List path){ + results.add(new ArrayList<>(path)); + for(int i=begin;ibegin && nums[i]==nums[i-1]) continue; + path.add(nums[i]); + dfs(nums,i+1,path); + path.remove(path.size()-1); + } + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} From 6d4776a10d0f00b4ac5ca7f8719f5e87bcec54ed Mon Sep 17 00:00:00 2001 From: luxindi Date: Fri, 16 Apr 2021 18:38:16 +0800 Subject: [PATCH 40/45] 2021-04-16 --- week02/recursion/PowxN.java | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 week02/recursion/PowxN.java diff --git a/week02/recursion/PowxN.java b/week02/recursion/PowxN.java new file mode 100644 index 0000000..7d3f724 --- /dev/null +++ b/week02/recursion/PowxN.java @@ -0,0 +1,64 @@ +package week02.recursion; + +//实现 pow(x, n) ,即计算 x 的 n 次幂函数(即,xn)。 +// +// +// +// 示例 1: +// +// +//输入:x = 2.00000, n = 10 +//输出:1024.00000 +// +// +// 示例 2: +// +// +//输入:x = 2.10000, n = 3 +//输出:9.26100 +// +// +// 示例 3: +// +// +//输入:x = 2.00000, n = -2 +//输出:0.25000 +//解释:2-2 = 1/22 = 1/4 = 0.25 +// +// +// +// +// 提示: +// +// +// -100.0 < x < 100.0 +// -231 <= n <= 231-1 +// -104 <= xn <= 104 +// +// Related Topics 数学 二分查找 +// 👍 634 👎 0 + +public class PowxN{ + public static void main(String[] args) { + Solution solution = new PowxN().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public double myPow(double x, int n) { + if (n>=0) return quickMul(x,n); + else return 1/quickMul(x,-n); + } + //O(n) = O(logn) + //T(n) = T(n/2) + O(1) = T(n/4)+2T(1) + public double quickMul(double x, int n){ + if(n==0) return 1; + double mul = quickMul(x,n/2); + if(n%2==0){ + return mul * mul; + }else{ + return mul * mul * x; + } + } + } +//leetcode submit region end(Prohibit modification and deletion) +} From 1976a7d422152b007182b8ce2263936c81e5638e Mon Sep 17 00:00:00 2001 From: luxindi Date: Sun, 25 Apr 2021 10:25:11 +0800 Subject: [PATCH 41/45] 2021-04-25 --- chap02/LongestPalindromicSubsequence.java | 4 + chap02/LongestPalindromicSubstring.java | 159 ++++++++++++++++++++++ chap03/ImplementStrStr_On2.java | 76 +++++++++++ chap04/isPalindrome/Solution.java | 35 +++++ 4 files changed, 274 insertions(+) create mode 100644 chap02/LongestPalindromicSubsequence.java create mode 100644 chap02/LongestPalindromicSubstring.java create mode 100644 chap03/ImplementStrStr_On2.java create mode 100644 chap04/isPalindrome/Solution.java diff --git a/chap02/LongestPalindromicSubsequence.java b/chap02/LongestPalindromicSubsequence.java new file mode 100644 index 0000000..81e9f67 --- /dev/null +++ b/chap02/LongestPalindromicSubsequence.java @@ -0,0 +1,4 @@ +package chap02; + +public class LongestPalindromicSubsequence { +} diff --git a/chap02/LongestPalindromicSubstring.java b/chap02/LongestPalindromicSubstring.java new file mode 100644 index 0000000..693d299 --- /dev/null +++ b/chap02/LongestPalindromicSubstring.java @@ -0,0 +1,159 @@ +package chap02; + +//给你一个字符串 s,找到 s 中最长的回文子串。 +// +// +// +// 示例 1: +// +// +//输入:s = "babad" +//输出:"bab" +//解释:"aba" 同样是符合题意的答案。 +// +// +// 示例 2: +// +// +//输入:s = "cbbd" +//输出:"bb" +// +// +// 示例 3: +// +// +//输入:s = "a" +//输出:"a" +// +// +// 示例 4: +// +// +//输入:s = "ac" +//输出:"a" +// +// +// +// +// 提示: +// +// +// 1 <= s.length <= 1000 +// s 仅由数字和英文字母(大写和/或小写)组成 +// +// Related Topics 字符串 动态规划 +// 👍 3536 👎 0 + +public class LongestPalindromicSubstring{ + public static void main(String[] args) { + Solution solution = new LongestPalindromicSubstring().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + + class Solution { + // dp[i][j] = dp[i+1][j-1] && s.charAr[i] == s.charAr[j] + public String longestPalindrome(String s) { + int n = s.length(); + + // dp[i][j]: s从i到j位置是否是回文 + boolean[][] dp = new boolean[n][n]; + int longest = 1; + int start = 0; + + // 初始化 + // 两种情况:回文串为奇数长度和偶数长度 + for (int i = 0; i < n; i++) { + dp[i][i] = true; + } + for (int i = 0; i < n - 1; i++) { + dp[i][i+1] = s.charAt(i) == s.charAt(i+1); + if (dp[i][i+1]) { + longest = 2; + start = i; + } + } + + + for (int i = s.length()-1; i >= 0; i--) { + for (int j = i + 2; j < s.length(); j++){ + dp[i][j] = dp[i+1][j-1] && s.charAt(i) == s.charAt(j); + if (dp[i][j] && j - i + 1 > longest){ + longest = j - i + 1; + start = i; + } + } + } + + return s.substring(start, start + longest); + } + } + + + class Solution_center { + public String longestPalindrome(String s) { + if (s == null || s.length() == 0) return s; + + int maxLen = 1; + int start = 0; + for (int i = 0; i <= s.length() - 1; i++) { + int left = i - 1; + int right = i + 1; + int curLen = 1; + while (left >= 0 && s.charAt(left) == s.charAt(i)) { + left--; + curLen++; + } + while (right <= s.length() - 1 && s.charAt(right) == s.charAt(i)) { + right++; + curLen++; + } + while (left >= 0 && right <= s.length() - 1 && s.charAt(left) == s.charAt(right)) { + right++; + left--; + curLen += 2; + } + if (curLen > maxLen) { + maxLen = curLen; + start = left + 1; + } + } + + return s.substring(start, start + maxLen); + } + } + + class Solution_n3 { + // O(n^3) + public String longestPalindrome(String s) { + // 异常检测:需要对空对象进行特判; + if (s == null || s.length() == 0 ) return s; + + // 代码块分行 + // 变量命名:尽量不要用单个字符进行命名; + // 代码美观:在必要的位置需要加上空格; + for (int len = s.length(); len >= 1; len--) { + for (int left = 0; left + len -1 < s.length(); left++){ + int right = left + len - 1; + if (isPalindrome(s, left, right)) { + return s.substring(left, right+1); + } + } + } + + return ""; + } + + // 缩进过多:通过用函数包装代码块减少代码的缩进。 + public boolean isPalindrome(String s, int left, int right){ + while (left < right && s.charAt(left) == s.charAt(right)) { + left++; + right--; + } + return left >= right; + } + } + + +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/chap03/ImplementStrStr_On2.java b/chap03/ImplementStrStr_On2.java new file mode 100644 index 0000000..654ff01 --- /dev/null +++ b/chap03/ImplementStrStr_On2.java @@ -0,0 +1,76 @@ +package chap03; + +//实现 strStr() 函数。 +// +// 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始)。如 +//果不存在,则返回 -1 。 +// +// +// +// 说明: +// +// 当 needle 是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。 +// +// 对于本题而言,当 needle 是空字符串时我们应当返回 0 。这与 C 语言的 strstr() 以及 Java 的 indexOf() 定义相符。 +// +// +// +// 示例 1: +// +// +//输入:haystack = "hello", needle = "ll" +//输出:2 +// +// +// 示例 2: +// +// +//输入:haystack = "aaaaa", needle = "bba" +//输出:-1 +// +// +// 示例 3: +// +// +//输入:haystack = "", needle = "" +//输出:0 +// +// +// +// +// 提示: +// +// +// 0 <= haystack.length, needle.length <= 5 * 104 +// haystack 和 needle 仅由小写英文字符组成 +// +// Related Topics 双指针 字符串 +// 👍 872 👎 0 + +public class ImplementStrStr_On2{ + public static void main(String[] args) { + Solution solution = new ImplementStrStr_On2().new Solution(); + } + //leetcode submit region begin(Prohibit modification and deletion) + class Solution { + public int strStr(String haystack, String needle) { + if (needle.length() == 0) return 0; + if (haystack == null || haystack.length() == 0) { + return -1; + } + for (int i = 0; i < haystack.length() - needle.length() + 1; i++){ + boolean same = true; + for (int j = 0; j < needle.length(); j++) { + if (haystack.charAt(i+j) != needle.charAt(j)) { + same = false; + break; + } + } + if (same) return i; + } + return -1; + } + } +//leetcode submit region end(Prohibit modification and deletion) + +} diff --git a/chap04/isPalindrome/Solution.java b/chap04/isPalindrome/Solution.java new file mode 100644 index 0000000..640fce9 --- /dev/null +++ b/chap04/isPalindrome/Solution.java @@ -0,0 +1,35 @@ +package chap04.isPalindrome; + +public class Solution { + public static void main(String[] args) { + Solution sol = new Solution(); + sol.isPalindrome("ab"); + } + + /** + * @param s: A string + * @return: Whether the string is a valid palindrome + */ + public boolean isPalindrome(String s) { + // write your code here + if (s == null || s.length() == 0) return true; + + int left = 0; + int right = s.length()-1; + while(left < right) { + while (left < right && !isValid(s.charAt(left))) left ++; + while (left < right && !isValid(s.charAt(right))) right --; + if (left >= right) return true; + if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) { + return false; + } + left ++; + right --; + } + return true; + } + + public boolean isValid(char c) { + return Character.isLetter(c) || Character.isDigit(c); + } +} From ce16923931bde2d8b55deed06aeb0b2cd9f069e6 Mon Sep 17 00:00:00 2001 From: luxindi Date: Mon, 26 Apr 2021 19:28:35 +0800 Subject: [PATCH 42/45] 2021-04-26 --- chap05/MergeSort.java | 46 +++++++++++++++++++++++++++++++ chap05/QuickSelect.java | 47 ++++++++++++++++++++++++++++++++ chap05/QuickSelect2.java | 58 ++++++++++++++++++++++++++++++++++++++++ chap05/QuickSort.java | 45 +++++++++++++++++++++++++++++++ 4 files changed, 196 insertions(+) create mode 100644 chap05/MergeSort.java create mode 100644 chap05/QuickSelect.java create mode 100644 chap05/QuickSelect2.java create mode 100644 chap05/QuickSort.java diff --git a/chap05/MergeSort.java b/chap05/MergeSort.java new file mode 100644 index 0000000..f7697ae --- /dev/null +++ b/chap05/MergeSort.java @@ -0,0 +1,46 @@ +package chap05; + +public class MergeSort { + /** + * @param A: an integer array + * @return: nothing + */ + public void sortIntegers(int[] A) { + // write your code here + if (A == null || A.length == 0) { + return; + } + int[] temp = new int[A.length]; + mergeSort(A, 0, A.length-1, temp); + } + + public void mergeSort(int[] A, int start, int end, int[] temp) { + if (start >= end) return; + int mid = (start + end)/2; + mergeSort(A, start, mid, temp); + mergeSort(A, mid+1, end, temp); + + // merge + int leftidx = start; + int rightidx = mid + 1; + int idx = start; + while (leftidx <= mid && rightidx <= end) { + if (A[leftidx] <= A[rightidx]) { + temp[idx++] = A[leftidx++]; + } else { + temp[idx++] = A[rightidx++]; + } + } + + while (leftidx <= mid) { + temp[idx++] = A[leftidx++]; + } + while (rightidx <= end) { + temp[idx++] = A[rightidx++]; + } + + for (int i = start; i <= end; i++) { + A[i] = temp[i]; + } + } +} diff --git a/chap05/QuickSelect.java b/chap05/QuickSelect.java new file mode 100644 index 0000000..5e6c7ad --- /dev/null +++ b/chap05/QuickSelect.java @@ -0,0 +1,47 @@ +package chap05; + +import java.util.Random; + +public class QuickSelect { + Random random = new Random(); + public int findKthLargest(int[] nums, int k) { + int start = 0; + int end = nums.length - 1; + while(true) { + int ind = helper(nums, start, end); + if (ind == k - 1) { + return nums[ind]; + } else if (ind < k - 1) { + start = ind + 1; + } else { // ind > k - 1 + end = ind - 1; + } + } + } + + public int helper(int[] nums, int start, int end) { + if (start <= end) { + int pivotidx = start + random.nextInt(end - start + 1); + swap(nums, start, pivotidx); + } + int pivot = nums[start]; + int j = start; + // [start+1,j] >= pivot + // (j, end] < pivot + for (int i = start + 1; i <= end; i++) { + if (nums[i] >= pivot) { + j++; + swap(nums, j, i); + } + } + swap(nums, start, j); + // [start, j)>=pivot j==pivot (j,end] < pivot + return j; + } + + public void swap(int[] nums, int ind1, int ind2) { + int temp = nums[ind1]; + nums[ind1] = nums[ind2]; + nums[ind2] = temp; + } +} diff --git a/chap05/QuickSelect2.java b/chap05/QuickSelect2.java new file mode 100644 index 0000000..8ce0ea5 --- /dev/null +++ b/chap05/QuickSelect2.java @@ -0,0 +1,58 @@ +package chap05; + +import java.util.Random; + +public class QuickSelect2 { + Random random = new Random(); + public int findKthLargest(int[] nums, int k) { + int start = 0; + int end = nums.length - 1; + while (true) { + int ind = partition(nums, start, end); + if (ind == k - 1) + return nums[ind]; + else if (ind < k - 1) { + start = ind + 1; + } else { + end = ind - 1; + } + } + } + + public int partition(int[] nums, int start, int end) { + if (start < end) { + int pivotIdx = start + random.nextInt(end - start + 1); + swap(nums, start, pivotIdx); + } + int pivot = nums[start]; + int left = start + 1; + int right = end; + // [start+1, right) >= pivot + // (left, end] <= pivot + while (left <= right) { + // find first position <= pivot + // [start+1, left) > pivot + while (left <= right && nums[left] > pivot) { + left++; + } + // find first position >= pivot + // (right, end] < pivot + while (left <= right && nums[right] < pivot) { + right--; + } + if (left <= right) { + swap(nums, left, right); + left++; + right--; + } + } + swap(nums, start, right); + return right; + } + + public void swap(int[] nums, int ind1, int ind2) { + int temp = nums[ind1]; + nums[ind1] = nums[ind2]; + nums[ind2] = temp; + } +} diff --git a/chap05/QuickSort.java b/chap05/QuickSort.java new file mode 100644 index 0000000..9557740 --- /dev/null +++ b/chap05/QuickSort.java @@ -0,0 +1,45 @@ +package chap05; + +public class QuickSort { + /** + * @param A: an integer array + * @return: nothing + */ + public void sortIntegers(int[] A) { + // write your code here + if (A==null || A.length == 0) { + return; + } + quickSort(A, 0, A.length-1); + } + + public void quickSort(int[] A, int start, int end) { + if (start >= end) { + return; + } + int left = start; + int right = end; + int pivot = A[(left + right)/2]; + // [start, right] < pivot + // [left, end] > pivot + while (left <= right) { + // find first position A[left] >= pivot + while (left <= right && A[left] < pivot) { + left++; + } + // find first position A[right] <= pivot + while (left <= right && A[right] > pivot) { + right --; + } + if (left <= right) { + int temp = A[right]; + A[right] = A[left]; + A[left] = temp; + left++; + right--; + } + } + quickSort(A, start, right); + quickSort(A, left, end); + } +} From 176e014953cc7fb646f8dd4fa9f1c46775230abe Mon Sep 17 00:00:00 2001 From: luxindi Date: Tue, 27 Apr 2021 23:05:09 +0800 Subject: [PATCH 43/45] 2021-04-27 --- chap05/MontainSequence.java | 31 ++++++++++++++++++++++++++++ chap05/MontainSequence2.java | 28 +++++++++++++++++++++++++ "chap05/\351\200\222\345\275\222.md" | 2 ++ 3 files changed, 61 insertions(+) create mode 100644 chap05/MontainSequence.java create mode 100644 chap05/MontainSequence2.java create mode 100644 "chap05/\351\200\222\345\275\222.md" diff --git a/chap05/MontainSequence.java b/chap05/MontainSequence.java new file mode 100644 index 0000000..aebeeac --- /dev/null +++ b/chap05/MontainSequence.java @@ -0,0 +1,31 @@ +package chap05; + +public class MontainSequence { + /** + * @param nums: a mountain sequence which increase firstly and then decrease + * @return: then mountain top + */ + public int mountainSequence(int[] nums) { + // write your code here + // find first position nums[i] > nums[i+1] + if (nums == null || nums.length == 0) return -1; + if (nums.length == 1) return nums[0]; + int n = nums.length; + // 一直单调递增 + if (nums[n-1] > nums[n-2]) return nums[n-1]; + int start = 0; + int end = n - 1; + while (start + 1 < end) { + int mid = start + (end - start) / 2; + // mid是偏左的,所以mid+1一定有 + if (nums[mid] > nums[mid + 1]) { + end = mid; + } + if (nums[mid] < nums[mid + 1]) { + start = mid + 1; + } + } + if (nums[start] > nums[start + 1]) return nums[start]; + return nums[end]; + } +} diff --git a/chap05/MontainSequence2.java b/chap05/MontainSequence2.java new file mode 100644 index 0000000..d5ee2e5 --- /dev/null +++ b/chap05/MontainSequence2.java @@ -0,0 +1,28 @@ +package chap05; + +public class MontainSequence2 { + /** + * @param nums: a mountain sequence which increase firstly and then decrease + * @return: then mountain top + */ + public int mountainSequence(int[] nums) { + // write your code here + // find first position nums[i] > nums[i+1] + if (nums == null || nums.length == 0) return -1; + if (nums.length == 1) return nums[0]; + int n = nums.length; + int start = 0; + int end = n - 1; + while (start + 1 < end) { + int mid = start + (end - start) / 2; + // mid是偏左的,所以mid+1一定有 + if (nums[mid] > nums[mid + 1]) { + end = mid; + } + if (nums[mid] < nums[mid + 1]) { + start = mid + 1; + } + } + return Math.max(nums[start], nums[end]); + } +} diff --git "a/chap05/\351\200\222\345\275\222.md" "b/chap05/\351\200\222\345\275\222.md" new file mode 100644 index 0000000..139597f --- /dev/null +++ "b/chap05/\351\200\222\345\275\222.md" @@ -0,0 +1,2 @@ + + From c876040de3b4a7f9e7fdaa717441506cc7bee15c Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 29 Apr 2021 08:08:06 +0800 Subject: [PATCH 44/45] 2021-04-28 --- chap07/findPosition.java | 33 +++++++++++++++++++++++++ chap07/firstPosition.java | 27 +++++++++++++++++++++ chap07/lastPosition.java | 27 +++++++++++++++++++++ chap10/Main.java | 44 +++++++++++++++++++++++++++++++++ chap10/MyQueue.java | 51 +++++++++++++++++++++++++++++++++++++++ chap10/MyQueue2.java | 31 ++++++++++++++++++++++++ 6 files changed, 213 insertions(+) create mode 100644 chap07/findPosition.java create mode 100644 chap07/firstPosition.java create mode 100644 chap07/lastPosition.java create mode 100644 chap10/Main.java create mode 100644 chap10/MyQueue.java create mode 100644 chap10/MyQueue2.java diff --git a/chap07/findPosition.java b/chap07/findPosition.java new file mode 100644 index 0000000..17e8eeb --- /dev/null +++ b/chap07/findPosition.java @@ -0,0 +1,33 @@ +package chap07; + + +public class findPosition { + + /** + * @param nums: An integer array sorted in ascending order + * @param target: An integer + * @return: An integer + */ + public int findPosition(int[] nums, int target) { + // write your code here + if (nums == null || nums.length == 0) { + return -1; + } + return binarySearch(nums, 0, nums.length - 1, target); + } + + public int binarySearch(int[] nums, int start, int end, int target) { + while (start < end) { + int mid = start + (end - start) / 2; + if (nums[mid] == target) return mid; + if (nums[mid] < target) { + start = mid + 1; + } + if (nums[mid] > target) { + end = mid - 1; + } + } + if (nums[start] == target) return start; + return -1; + } +} diff --git a/chap07/firstPosition.java b/chap07/firstPosition.java new file mode 100644 index 0000000..d0c4fcd --- /dev/null +++ b/chap07/firstPosition.java @@ -0,0 +1,27 @@ +package chap07; + +public class firstPosition { + public int findfirstPosition(int[] nums, int target) { + // write your code here + if (nums == null || nums.length == 0) { + return -1; + } + int start = 0; + int end = nums.length - 1; + while (start + 1 < end) { + int mid = start + (end - start) / 2; + if (nums[mid] == target) { + end = mid; + } + if (nums[mid] < target) { + start = mid + 1; + } + if (nums[mid] > target) { + end = mid - 1; + } + } + if (nums[start] == target) return start; + if (nums[end] == target) return end; + return -1; + } +} diff --git a/chap07/lastPosition.java b/chap07/lastPosition.java new file mode 100644 index 0000000..b6c5ca7 --- /dev/null +++ b/chap07/lastPosition.java @@ -0,0 +1,27 @@ +package chap07; + +public class lastPosition { + public int findLastPosition(int[] nums, int target) { + // write your code here + if (nums == null || nums.length == 0) { + return -1; + } + int start = 0; + int end = nums.length - 1; + while (start + 1 < end) { + int mid = start + (end - start) / 2; + if (nums[mid] == target) { + start = mid; + } + if (nums[mid] < target) { + start = mid + 1; + } + if (nums[mid] > target) { + end = mid - 1; + } + } + if (nums[end] == target) return end; + if (nums[start] == target) return start; + return -1; + } +} diff --git a/chap10/Main.java b/chap10/Main.java new file mode 100644 index 0000000..f727b6c --- /dev/null +++ b/chap10/Main.java @@ -0,0 +1,44 @@ +package chap10; + +public class Main { + +} + + +interface IntStack { + void push(int val); + int pop(); + int peek(); + boolean isEmpty(); + void clear(); +} + +//实现一个接口 +// option + enter +class IntStackArrayListImpl implements IntStack { + + @Override + public void push(int val) { + + } + + @Override + public int pop() { + return 0; + } + + @Override + public int peek() { + return 0; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public void clear() { + + } +} diff --git a/chap10/MyQueue.java b/chap10/MyQueue.java new file mode 100644 index 0000000..a3e0557 --- /dev/null +++ b/chap10/MyQueue.java @@ -0,0 +1,51 @@ +package chap10; + + +//用链表实现Queue + +class Node { + public int val; + public Node next; + public Node(int _val) { + val = _val; + next = null; + } + public Node(int _val, Node _next) { + val = _val; + next = _next; + } +} +public class MyQueue { + /* + * @param item: An integer + * @return: nothing + */ + public Node head, tail; + public MyQueue() { + head = null; + tail = null; + } + public void enqueue(int item) { + // write your code here + if (head == null) { + tail = new Node(item); + head = tail; + } else { + tail.next = new Node(item); + tail = tail.next; + } + } + + /* + * @return: An integer + */ + public int dequeue() { + // write your code here + if (head != null) { + int item = head.val; + head = head.next; + return item; + } + return -1; + } +} diff --git a/chap10/MyQueue2.java b/chap10/MyQueue2.java new file mode 100644 index 0000000..22028cf --- /dev/null +++ b/chap10/MyQueue2.java @@ -0,0 +1,31 @@ +package chap10; + +public class MyQueue2 { + /* + * @param item: An integer + * @return: nothing + */ + int MAXSIZE = 10000; + int[] num = new int[MAXSIZE]; + int head, tail; + public MyQueue2() { + head = 0; + tail = 0; + } + public void enqueue(int item) { + // write your code here + if (tail == MAXSIZE) return; + num[tail++] = item; + } + + /* + * @return: An integer + */ + public int dequeue() { + // write your code here + if (head == tail) return -1; + return num[head++]; + } +} + + From 4d53e8ca40ca5168f67d9ab64e7f53109c3350fa Mon Sep 17 00:00:00 2001 From: luxindi Date: Thu, 29 Apr 2021 08:56:53 +0800 Subject: [PATCH 45/45] chap11 2021-04-29 --- chap11/LevelOrder.java | 50 ++++++++++++++++++++++++++++++++++++++ chap11/LevelOrder2.java | 54 +++++++++++++++++++++++++++++++++++++++++ chap11/LevelOrder3.java | 43 ++++++++++++++++++++++++++++++++ utils/TreeNode.java | 12 +++++++++ 4 files changed, 159 insertions(+) create mode 100644 chap11/LevelOrder.java create mode 100644 chap11/LevelOrder2.java create mode 100644 chap11/LevelOrder3.java create mode 100644 utils/TreeNode.java diff --git a/chap11/LevelOrder.java b/chap11/LevelOrder.java new file mode 100644 index 0000000..f426662 --- /dev/null +++ b/chap11/LevelOrder.java @@ -0,0 +1,50 @@ +package chap11; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import utils.TreeNode; + +/** + * Definition of TreeNode: + * public class TreeNode { + * public int val; + * public TreeNode left, right; + * public TreeNode(int val) { + * this.val = val; + * this.left = this.right = null; + * } + * } + */ + +public class LevelOrder { + /** + * @param root: A Tree + * @return: Level order a list of lists of integer + */ + public List> levelOrder(TreeNode root) { + // write your code here + List> results = new ArrayList<>(); + if (root == null) return results; + Queue queue = new LinkedList<>(); + queue.offer(root); + while (!queue.isEmpty()) { + int size = queue.size(); + List level = new ArrayList<>(); + for (int i = 0; i < size; i++) { + TreeNode node = queue.poll(); + level.add(node.val); + if (node.left != null) { + queue.offer(node.left); + } + if (node.right != null) { + queue.offer(node.right); + } + } + results.add(level); + } + return results; + + } +} diff --git a/chap11/LevelOrder2.java b/chap11/LevelOrder2.java new file mode 100644 index 0000000..21c9285 --- /dev/null +++ b/chap11/LevelOrder2.java @@ -0,0 +1,54 @@ +package chap11; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import utils.TreeNode; + +/** + * Definition of TreeNode: + * public class TreeNode { + * public int val; + * public TreeNode left, right; + * public TreeNode(int val) { + * this.val = val; + * this.left = this.right = null; + * } + * } + */ +//两个队列的方法实现BFS +public class LevelOrder2 { + /** + * @param root: A Tree + * @return: Level order a list of lists of integer + */ + public List> levelOrder(TreeNode root) { + // write your code here + List> results = new ArrayList<>(); + if (root == null) return results; + List queue = new LinkedList<>(); + queue.add(root); + while (!queue.isEmpty()) { + List nextQueue = new LinkedList<>(); + results.add(queue2IntegerList(queue)); + for (TreeNode node : queue) { + if (node.left != null) { + nextQueue.add(node.left); + } + if (node.right != null) { + nextQueue.add(node.right); + } + } + queue = nextQueue; + } + return results; + } + public List queue2IntegerList(List queue) { + List result = new ArrayList<>(); + for (TreeNode node : queue) { + result.add(node.val); + } + return result; + } +} diff --git a/chap11/LevelOrder3.java b/chap11/LevelOrder3.java new file mode 100644 index 0000000..8bc0a92 --- /dev/null +++ b/chap11/LevelOrder3.java @@ -0,0 +1,43 @@ +package chap11; + +import java.util.ArrayList; +import java.util.LinkedList; +import java.util.List; +import java.util.Queue; +import utils.TreeNode; + +public class LevelOrder3 { + /** + * @param root: A Tree + * @return: Level order a list of lists of integer + */ + public List> levelOrder(TreeNode root) { + // write your code here + List> results = new ArrayList<>(); + if (root == null) return results; + Queue queue = new LinkedList<>(); + queue.offer(root); + queue.offer(null); + List level = new ArrayList<>(); + while (!queue.isEmpty()) { + TreeNode node = queue.poll(); + if (node == null) { + if (level.isEmpty()) { + break; + } + results.add(level); + level = new ArrayList<>(); + queue.offer(null); // add a new dummy node + continue; + } + level.add(node.val); + if (node.left != null) { + queue.offer(node.left); + } + if (node.right != null) { + queue.offer(node.right); + } + } + return results; + } +} diff --git a/utils/TreeNode.java b/utils/TreeNode.java new file mode 100644 index 0000000..b5b02e0 --- /dev/null +++ b/utils/TreeNode.java @@ -0,0 +1,12 @@ +package utils; + +// Definition of TreeNode: + public class TreeNode { + public int val; + public TreeNode left, right; + public TreeNode(int val) { + this.val = val; + this.left = this.right = null; + } + } +