diff --git a/.gitignore b/.gitignore index bf13a4d8b3ca92821011100cde73127a3d6846bd..2f3fe84e02235d53774edd684a46acc69371ce87 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,8 @@ # Generated files .idea/**/contentModel.xml .idea/* +*.iml +target/ # Sensitive or high-churn files .idea/**/dataSources/ @@ -65,3 +67,9 @@ fabric.properties # Android studio 3.1+ serialized cache file .idea/caches/build_file_checksums.ser + +# vscode +*/.settings/* +.project +*/.classpath +.settings/* diff --git a/0001-Two-Sum/pom.xml b/0001-Two-Sum/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..fd61b3059e8fb6cb59060d14df801636c29d67e4 --- /dev/null +++ b/0001-Two-Sum/pom.xml @@ -0,0 +1,15 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0001-Two-Sum + + + \ No newline at end of file diff --git a/0001-Two-Sum/src/main/java/com/lin/twosum/TwoSum.java b/0001-Two-Sum/src/main/java/com/lin/twosum/TwoSum.java new file mode 100644 index 0000000000000000000000000000000000000000..930b5d9741cf8a163012075c41d2edd34b729fc0 --- /dev/null +++ b/0001-Two-Sum/src/main/java/com/lin/twosum/TwoSum.java @@ -0,0 +1,28 @@ +package com.lin.twosum; + +/** + * @author linqiankun + * @date 2020-06-23 + */ +public class TwoSum { + + /** + * 两次遍历 + * + * @param nums 数组 + * @param target 目标值 + * @return 查找到的元素下标 + */ + public int[] twoSum(int[] nums, int target) { + int[] a = new int[2]; + for (int i = 0; i < nums.length; i++) { + for (int j = i + 1; j < nums.length; j++) { + if (nums[i] + nums[j] == target) { + a[0] = i; + a[1] = j; + } + } + } + return a; + } +} diff --git a/0001-Two-Sum/src/main/resources/0001-two-sum.md b/0001-Two-Sum/src/main/resources/0001-two-sum.md new file mode 100644 index 0000000000000000000000000000000000000000..f9fa158c375ff154f4919f09060a7a54001f24d5 --- /dev/null +++ b/0001-Two-Sum/src/main/resources/0001-two-sum.md @@ -0,0 +1,26 @@ +# 两数之和 + +## 题目描述 + +给定一个整数数组 `nums` 和一个目标值 `target`,请你在该数组中找出和为目标值的那 **两个** 整数,并返回他们的数组下标。 +你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。 + +**示例:** +``` +给定 nums = [2, 7, 11, 15], target = 9 + +因为 nums[0] + nums[1] = 2 + 7 = 9 +所以返回 [0, 1] +``` +--- +## 题目解析 + +### 1. 两次遍历 + +通过两次遍历找出之和4等于目标值的数据。 +1. 外层遍历确定一位元素 +2. 内层遍历确定另一位元素,内层元素从外层元素的下一位开始取 +3. 元素相加,判断是否等于目标值。 + +### 2. 一次遍历 + diff --git a/0002-Add-Two-Numbers/pom.xml b/0002-Add-Two-Numbers/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..4d9e4e1c53fd68f384ca397c299eb915f1a69456 --- /dev/null +++ b/0002-Add-Two-Numbers/pom.xml @@ -0,0 +1,22 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0002-Add-Two-Numbers + + + + org.junit.jupiter + junit-jupiter + test + + + + \ No newline at end of file diff --git a/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/AddTwoNumbers.java b/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/AddTwoNumbers.java new file mode 100644 index 0000000000000000000000000000000000000000..f1574a9b02f39914e80d8a1d784fa33fb767f4f6 --- /dev/null +++ b/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/AddTwoNumbers.java @@ -0,0 +1,50 @@ +package com.lin.addtwonumbers; + + +/** + * @author linqiankun + * @date 2020-06-23 + */ +public class AddTwoNumbers { + + + /** + * 两数相加 + * + * @param l1 链表1 + * @param l2 链表2 + * @return 返回结果链表的头节点 + */ + public ListNode addTwoNumbers(ListNode l1, ListNode l2) { + ListNode listNode = new ListNode(l1.val); + ListNode c = listNode; + int n = 0; + do { + int a = 0; + if (l1 != null) { + a = l1.val; + } + int b = 0; + if (l2 != null) { + b = l2.val; + } + int sum = a + b + n; + c.val = sum % 10; + n = sum / 10; + if (l1 != null) { + l1 = l1.next; + } + if (l2 != null) { + l2 = l2.next; + } + if (l1 != null || l2 != null || n != 0) { + c.next = new ListNode(n); + c = c.next; + } + + } while (l1 != null || l2 != null); + return listNode; + } +} + + diff --git a/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/ListNode.java b/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/ListNode.java new file mode 100644 index 0000000000000000000000000000000000000000..725859bb6b8ca9fd8d417dd7ca2a09e44068fe88 --- /dev/null +++ b/0002-Add-Two-Numbers/src/main/java/com/lin/addtwonumbers/ListNode.java @@ -0,0 +1,10 @@ +package com.lin.addtwonumbers; + +public class ListNode { + int val; + public ListNode next; + + public ListNode(int x) { + val = x; + } +} \ No newline at end of file diff --git a/0003-Longest-Substring-Without-Repeating-Characters/pom.xml b/0003-Longest-Substring-Without-Repeating-Characters/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ab9852555dc0801a5749c6e8b888a5c52548f748 --- /dev/null +++ b/0003-Longest-Substring-Without-Repeating-Characters/pom.xml @@ -0,0 +1,15 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0003-Longest-Substring-Without-Repeating-Characters + + + \ No newline at end of file diff --git a/0003-Longest-Substring-Without-Repeating-Characters/src/main/java/com/lin/longestsubstringwithoutrepeatingcharacters/LongSubstringWithoutRepeatingCharacters.java b/0003-Longest-Substring-Without-Repeating-Characters/src/main/java/com/lin/longestsubstringwithoutrepeatingcharacters/LongSubstringWithoutRepeatingCharacters.java new file mode 100644 index 0000000000000000000000000000000000000000..c6d86513465e8fd8dc7843fc20396034130011a0 --- /dev/null +++ b/0003-Longest-Substring-Without-Repeating-Characters/src/main/java/com/lin/longestsubstringwithoutrepeatingcharacters/LongSubstringWithoutRepeatingCharacters.java @@ -0,0 +1,10 @@ +package com.lin.longestsubstringwithoutrepeatingcharacters; + +/** + * @author 九分石人 + * @date 2020-06-25 + */ +public class LongSubstringWithoutRepeatingCharacters { + + +} diff --git a/0007-Reverse-Integer/pom.xml b/0007-Reverse-Integer/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..df32f227d73267cb49100886eb034104f1b125b9 --- /dev/null +++ b/0007-Reverse-Integer/pom.xml @@ -0,0 +1,22 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0007-Reverse-Integer + + + + org.junit.jupiter + junit-jupiter + test + + + + \ No newline at end of file diff --git a/0007-Reverse-Integer/src/main/java/com/lin/reverseinteger/ReverseInteger.java b/0007-Reverse-Integer/src/main/java/com/lin/reverseinteger/ReverseInteger.java new file mode 100644 index 0000000000000000000000000000000000000000..ce2e2b68a3671483084043979ddaca1a6dbf8e16 --- /dev/null +++ b/0007-Reverse-Integer/src/main/java/com/lin/reverseinteger/ReverseInteger.java @@ -0,0 +1,33 @@ +package com.lin.reverseinteger; + +/** + * 整数反转 + * + * @author 九分石人 + */ +public class ReverseInteger { + + + /** + * 整数反转 + * + * @param x 目标元素 + * @return 反转后的元素 + */ + public int reverse(int x) { + int pes = 0; + int p = 0; + while (x != 0) { + p = pes * 10 + x % 10; + //用计算后的数字与计算前的比较,判断是否溢出存储大小 + if ((p - (x % 10)) / 10 != pes) { + return 0; + } + x = x / 10; + pes = p; + } + return pes; + } + + +} diff --git a/0009-Palindrome-Number/pom.xml b/0009-Palindrome-Number/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..ff2998a053efeed21037d3ae68f80f8767d0b9f5 --- /dev/null +++ b/0009-Palindrome-Number/pom.xml @@ -0,0 +1,21 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0009-Palindrome-Number + + + + org.junit.jupiter + junit-jupiter + test + + + \ No newline at end of file diff --git a/0009-Palindrome-Number/src/main/java/com/lin/palindromenumber/PalindromeNumber.java b/0009-Palindrome-Number/src/main/java/com/lin/palindromenumber/PalindromeNumber.java new file mode 100644 index 0000000000000000000000000000000000000000..5c6633efcaea841d1fdda0884a9f8119f19e1017 --- /dev/null +++ b/0009-Palindrome-Number/src/main/java/com/lin/palindromenumber/PalindromeNumber.java @@ -0,0 +1,42 @@ +package com.lin.palindromenumber; + +/** + * 回文数 + * + * @author 九分石人 + */ +public class PalindromeNumber { + + + /** + * 回文数 + * + * @param x 数 + * @return 是/否 + */ + public boolean isPalindrome(int x) { + int num = x; + if (x < 0) { + return false; + } + if (x == 0) { + return true; + } + int pes = 0; + int p = 0; + while (x != 0) { + p = pes * 10 + x % 10; + // 用计算后的数字与计算前的比较,判断是否溢出存储大小,溢出内存,提升效率 + if ((p - (x % 10)) / 10 != pes) { + return false; + } + x = x / 10; + pes = p; + } + if (num == pes) { + return true; + } else { + return false; + } + } +} diff --git a/0019-Remove-Nth-Node-From-End-of-List/pom.xml b/0019-Remove-Nth-Node-From-End-of-List/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..733d8a4f725164a25231f9aed943ddb7f9f131d2 --- /dev/null +++ b/0019-Remove-Nth-Node-From-End-of-List/pom.xml @@ -0,0 +1,15 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0019-Remove-Nth-Node-From-End-of-List + + + \ No newline at end of file diff --git a/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/ListNode.java b/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/ListNode.java new file mode 100644 index 0000000000000000000000000000000000000000..b5785df406d128bcf34f1fb80d718c89fab0b86d --- /dev/null +++ b/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/ListNode.java @@ -0,0 +1,16 @@ +package com.lin.removenthnodefromendoflist; + +/** + * @author 九分石人 + */ +public class ListNode { + + int val; + ListNode next; + + ListNode(int x) { + val = x; + } + + +} diff --git a/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/RemoveNthNodeFromEndofList.java b/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/RemoveNthNodeFromEndofList.java new file mode 100644 index 0000000000000000000000000000000000000000..2136ce41e7f3ecce45641179523b2f03567af687 --- /dev/null +++ b/0019-Remove-Nth-Node-From-End-of-List/src/main/java/com/lin/removenthnodefromendoflist/RemoveNthNodeFromEndofList.java @@ -0,0 +1,58 @@ +package com.lin.removenthnodefromendoflist; + +/** + * 删除链表倒数第n个节点 + * + * @author 九分石人 + */ +public class RemoveNthNodeFromEndofList { + + /** + * 一次遍历法 + * Leetcode题解带坑,不考虑极限情况 + * + * @param head 链表头节点 + * @param n 要删除的节点 + * @return 头节点 + */ + public ListNode removeNthFromEnd(ListNode head, int n) { + + ListNode first; + ListNode second; + ListNode third; + + first = head; + second = head; + third = head; + if (n == 1 && head.next == null) { + return null; + } + +// for (int i = 0; i < n; i++) { +// //此处规避掉删除头节点的情况,如果删除头节点,n与链表长度相等,后移语句必定空指针 +// //长度为n的链表只可移动n-1次 +// if (third.next != null) { +// third = third.next; +// } else { +// return first.next; +// } +// } + +// 与上面的注作用相同,提升效率 + for (int i = 0; i < n; i++) { + third = third.next; + } + if (third == null) { + return first.next; + } + + while (third.next != null) { + third = third.next; + second = second.next; + } + second.next = second.next.next; + return first; + } + + +} diff --git a/0019-Remove-Nth-Node-From-End-of-List/src/main/resources/0019-remove-nth-node-from-end-of-list.md b/0019-Remove-Nth-Node-From-End-of-List/src/main/resources/0019-remove-nth-node-from-end-of-list.md new file mode 100644 index 0000000000000000000000000000000000000000..2bea9eebc39cfaa6b4bb99b3a4dbdbea05c5cdf4 --- /dev/null +++ b/0019-Remove-Nth-Node-From-End-of-List/src/main/resources/0019-remove-nth-node-from-end-of-list.md @@ -0,0 +1,26 @@ +# 删除链表的倒数第N个节点 +## 题目描述 + +给定一个链表,删除链表的倒数第n个节点,并返回链表的头节点。 + +**示例:** +``` +给定一个链表:1->2->3->4->5,和 n = 2。 + +当删除了倒数第二个节点后,链表变为:1->2->3->5。 +``` +**说明:** + +给定的n保证是有效的。 + +**进阶:** + +你能尝试使用一趟扫描实现吗? + +--- +## 题目解析 + +### 1. 两次扫描 + + +### 2. 一次扫描 \ No newline at end of file diff --git a/0021-Merge-Two-Lists/pom.xml b/0021-Merge-Two-Lists/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..13a9b15571ecc5d0c4e195e99cb7f012b43cbb06 --- /dev/null +++ b/0021-Merge-Two-Lists/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0021-Merge-Two-Lists + + + 14 + 14 + + + \ No newline at end of file diff --git a/0021-Merge-Two-Lists/src/main/java/com/lin/mergetwolists/MergeTwoLists.java b/0021-Merge-Two-Lists/src/main/java/com/lin/mergetwolists/MergeTwoLists.java new file mode 100644 index 0000000000000000000000000000000000000000..6ff40045e8c8cb04066a18e866e3b6cadf963371 --- /dev/null +++ b/0021-Merge-Two-Lists/src/main/java/com/lin/mergetwolists/MergeTwoLists.java @@ -0,0 +1,96 @@ +package com.lin.mergetwolists; + + +// Definition for singly-linked list. + +class ListNode { + int val; + ListNode next; + + ListNode() { + } + + ListNode(int val) { + this.val = val; + } + + ListNode(int val, ListNode next) { + this.val = val; + this.next = next; + } +} + +/** + * @author 九分石人 + */ +public class MergeTwoLists { + + /** + * 将l2插入l1 + * + * @param l1 链表l1 + * @param l2 链表l2 + * @return 新链表头节点 + */ + public static ListNode mergeTwoLists(ListNode l1, ListNode l2) { + if (l1 == null) { + return l2; + } + if (l2 == null) { + return l1; + } + ListNode head = l1; + while (l2 != null) { + while (l1 != null) { + if (l2 != null) { + if (l2.val >= l1.val && l1.next == null) { + ListNode val = l2; + l1.next = val; + l2 = l2.next; + val.next = null; + break; + } else if (l2.val >= l1.val && l2.val <= l1.next.val) { + ListNode val = l2; + ListNode ll = l1.next; + l1.next = val; + l2 = l2.next; + val.next = ll; + break; + } else if (l2.val < l1.val) { + ListNode val = l2; + head = val; + l2 = l2.next; + val.next = l1; + break; + } else { + l1 = l1.next; + } + } + } + l1 = head; + if (l2 == null) { + break; + } + } + return head; + } + + + public static void main(String[] args) { + ListNode l1 = new ListNode(-9); + ListNode l2 = new ListNode(3); +// ListNode l4 = new ListNode(4); + l1.next = l2; +// l2.next = l4; + ListNode r1 = new ListNode(5); + ListNode r3 = new ListNode(7); +// ListNode r4 = new ListNode(4); + r1.next = r3; +// r3.next = r4; + ListNode listNode = mergeTwoLists(l1, r1); + while (listNode != null) { + System.out.println(listNode.val); + listNode = listNode.next; + } + } +} \ No newline at end of file diff --git a/0026-RemoveDuplicates/pom.xml b/0026-RemoveDuplicates/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..3bc255d0dd25acf2c9d2f01c97743f9ab660a4f8 --- /dev/null +++ b/0026-RemoveDuplicates/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + RemoveDuplicates + + + 14 + 14 + + + \ No newline at end of file diff --git a/0026-RemoveDuplicates/src/main/java/com/lin/removeduplicates/RemoveDuplicates.java b/0026-RemoveDuplicates/src/main/java/com/lin/removeduplicates/RemoveDuplicates.java new file mode 100644 index 0000000000000000000000000000000000000000..9a245abfa6ebd1430f469ed554b318a653d13d26 --- /dev/null +++ b/0026-RemoveDuplicates/src/main/java/com/lin/removeduplicates/RemoveDuplicates.java @@ -0,0 +1,38 @@ +package com.lin.removeduplicates; + + + +/** + * @author 九分石人 + */ +public class RemoveDuplicates { + + /** + * 移除数组中的重复项 + * @param nums 数组 + * @return 不重复项长度 + */ + public static int removeDuplicates(int[] nums) { + int n = 0; + for (int i = 0; i < nums.length; i++) { + for (int j = i+1; j < nums.length-n;) { + if (nums[i] == nums[j]){ + for (int k = j; k < nums.length-1; k++) { + nums[k]= nums[k+1]; + } + n++; + } + if (nums[i] != nums[j]){ + j++; + } + } + } + return nums.length-n; + } + + public static void main(String[] args) { + int[] nums = {1,1,2}; + int i = removeDuplicates(nums); + System.out.println(i); + } +} diff --git a/0027-Remove-Element/pom.xml b/0027-Remove-Element/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..5d585bc6a462c7cde76dfd2ab2ad928ad689eb23 --- /dev/null +++ b/0027-Remove-Element/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0027-Remove-Element + + + 14 + 14 + + + \ No newline at end of file diff --git a/0027-Remove-Element/src/main/java/com/lin/removeelement/RomoveElement.java b/0027-Remove-Element/src/main/java/com/lin/removeelement/RomoveElement.java new file mode 100644 index 0000000000000000000000000000000000000000..c5f48a7a0bb6f9b240ab63b387237b9707c9be21 --- /dev/null +++ b/0027-Remove-Element/src/main/java/com/lin/removeelement/RomoveElement.java @@ -0,0 +1,37 @@ +package com.lin.removeelement; + +/** + * @author 九分石人 + */ +public class RomoveElement { + + + /** + * 移除数组中指定元素 + * + * @param nums 指定数组 + * @param val 指定元素 + * @return 剩余数组长度 + */ + public static int removeElement(int[] nums, int val) { + int k = nums.length; + for (int i = 0; i < k; i++) { + if (nums[i] == val) { + if (k - 1 - i >= 0) { + System.arraycopy(nums, i + 1, nums, i, k - 1 - i); + } + i--; + k--; + } + } + return k; + } + + + public static void main(String[] args) { + int[] nums = {0, 1, 2, 2, 3, 0, 4, 2}; + int val = 2; + int i = removeElement(nums, val); + System.out.println(i); + } +} diff --git a/0028-Str-Str/pom.xml b/0028-Str-Str/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..8f21093b97cc652a39360120b3ff05ae8f2d6d5a --- /dev/null +++ b/0028-Str-Str/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0028-Str-Str + + + 14 + 14 + + + \ No newline at end of file diff --git a/0028-Str-Str/src/main/java/com/lin/strstr/StrStr.java b/0028-Str-Str/src/main/java/com/lin/strstr/StrStr.java new file mode 100644 index 0000000000000000000000000000000000000000..b92d919de0a4a3f613419ae4f5cc1242f2451355 --- /dev/null +++ b/0028-Str-Str/src/main/java/com/lin/strstr/StrStr.java @@ -0,0 +1,23 @@ +package com.lin.strstr; + +/** + * @author 九分石人 + */ +public class StrStr { + + /** + * 截取字符字串 + * + * @param haystack 原字符串 + * @param needle 截取的字符串 + * @return 返回截取字串的下标 + */ + public int strStr(String haystack, String needle) { + if ("".equals(needle)) { + return 0; + } + return haystack.indexOf(needle); + } + + +} diff --git a/0035-Search-Insert/pom.xml b/0035-Search-Insert/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..3254ae14470a11d0809f051a9d6503205471595d --- /dev/null +++ b/0035-Search-Insert/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0035-Search-Insert + + + 14 + 14 + + + \ No newline at end of file diff --git a/0035-Search-Insert/src/main/java/com/lin/searchinsert/SearchInsert.java b/0035-Search-Insert/src/main/java/com/lin/searchinsert/SearchInsert.java new file mode 100644 index 0000000000000000000000000000000000000000..509d94143efa9515d7963df52c0cd92eb63e36d8 --- /dev/null +++ b/0035-Search-Insert/src/main/java/com/lin/searchinsert/SearchInsert.java @@ -0,0 +1,48 @@ +package com.lin.searchinsert; + +/** + * @author 九分石人 + */ +public class SearchInsert { + + /** + * 搜索插入位置 + * 要求二分法 + * + * @param nums 数组 + * @param target 目标数字 + * @return 位置 + */ + public static int search(int[] nums, int min, int max, int target) { + if (target > nums[max]) { + return max + 1; + } + if (target < nums[min]) { + return min; + } + int mid = (min + max) / 2; + + if (mid == min && nums[min] < target && nums[max] > target) { + return mid + 1; + } + if (nums[mid] == target) { + return mid; + } else if (nums[mid] < target) { + return search(nums, mid + 1, max, target); + } else if (nums[mid] > target) { + return search(nums, min, mid - 1, target); + } + return mid; + } + + public static int searchInsert(int[] nums, int target) { + return search(nums, 0, nums.length - 1, target); + } + + public static void main(String[] args) { + int[] nums = {1, 3, 5, 8}; + int target = 2; + int i = searchInsert(nums, target); + System.out.println(i); + } +} diff --git a/0053-Max-Sub-Array/pom.xml b/0053-Max-Sub-Array/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..44a502f2a1a78575b14b0fcb1a422751882c41eb --- /dev/null +++ b/0053-Max-Sub-Array/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0053-Max-Sub-Array + + + 14 + 14 + + + \ No newline at end of file diff --git a/0053-Max-Sub-Array/src/main/java/com/lin/maxsubarray/MaxSubArray.java b/0053-Max-Sub-Array/src/main/java/com/lin/maxsubarray/MaxSubArray.java new file mode 100644 index 0000000000000000000000000000000000000000..0b47340bf27f95e7cec1930522eab55338da3794 --- /dev/null +++ b/0053-Max-Sub-Array/src/main/java/com/lin/maxsubarray/MaxSubArray.java @@ -0,0 +1,30 @@ +package com.lin.maxsubarray; + +/** + * @author 九分石人 + */ +public class MaxSubArray { + + + /** + * 使用动态规划的方法 + * + * @param nums + * @return + */ + public static int maxSubArray(int[] nums) { + int pre = 0; + int max = nums[0]; + for (int x : nums) { + pre = Math.max(pre + x, x); + max = Math.max(max, pre); + } + return max; + } + + public static void main(String[] args) { + int[] nums = {-8, 1, 9, -3, 7, -6, 3}; + int i = maxSubArray(nums); + System.out.println(i); + } +} diff --git a/0053-Max-Sub-Array/src/main/resources/0053-max-sub-array.md b/0053-Max-Sub-Array/src/main/resources/0053-max-sub-array.md new file mode 100644 index 0000000000000000000000000000000000000000..126f2be5f07308da527ff79679895d868a0813b8 --- /dev/null +++ b/0053-Max-Sub-Array/src/main/resources/0053-max-sub-array.md @@ -0,0 +1,69 @@ +# 最大子序和 + +## 题目描述 + +给定一个整数数组`nums`,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 + +**示例1:** + +``` +输入:nums = [-2,1,-3,4,-1,2,1,-5,4] +输出:6 +解释:连续子数组 [4,-1,2,1] 的和最大,为 6。 +``` + +**示例1:** + +``` +输入:nums = [-2,1,-3,4,-1,2,1,-5,4] +输出:6 +解释:连续子数组 [4,-1,2,1] 的和最大,为 6。 +``` + +**示例2:** + +``` +输入:nums = [1] +输出:1 +``` + +**示例3:** + +``` +输入:nums = [0] +输出:0 +``` + +**示例4:** + +``` +输入:nums = [-1] +输出:-1 +``` + +**示例5:** + +``` +输入:nums = [-100000] +输出:-100000 +``` + +**提示:** + +- 1 <= nums.length <= 3 * 104 +- -105 <= nums[i] <= 105 + +**进阶:** 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 **分治法** 求解。 + +--- +## 题目解析 + +### 1. 动态规划 + +1. 判定对于下标为i的节点,最大值(i)。 +2. 对于i前一个节点其有存在的最大值为f(i-1)。 +3. 则可以判定f(i) = {f(i-1) + nums[i],nums[i]}。 +4. 算法中,从左到右开始计算,`pre = Math.max(pre+x,x)`。这里计算出,下标为i的所在的最大值f(i)。 +5. 统计每一步中的最大值,每步进行比较,如果原有值大则是原有值,如果f(i)大则是f(i),`max = Math.max(max, pre)`。 + +### 2. 分治法 \ No newline at end of file diff --git a/0058-Length-Of-Last-Word/pom.xml b/0058-Length-Of-Last-Word/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..501a5d38a8c9b21a96211e91294022db6b25dfa3 --- /dev/null +++ b/0058-Length-Of-Last-Word/pom.xml @@ -0,0 +1,19 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0058-Length-Of-Last-Word + + + 14 + 14 + + + \ No newline at end of file diff --git a/0058-Length-Of-Last-Word/src/main/java/lengthoflastword/LengthOfLastWord.java b/0058-Length-Of-Last-Word/src/main/java/lengthoflastword/LengthOfLastWord.java new file mode 100644 index 0000000000000000000000000000000000000000..c1113a2cf95fb69eb5e7aada919599e41b1de78f --- /dev/null +++ b/0058-Length-Of-Last-Word/src/main/java/lengthoflastword/LengthOfLastWord.java @@ -0,0 +1,27 @@ +package lengthoflastword; + +/** + * @author 九分石人 + */ +public class LengthOfLastWord { + + /** + * 按空格切割后最后字符串的长度 + * + * @param s 原始字符串 + * @return 长度 + */ + public static int lengthOfLastWord(String s) { + String[] s1 = s.split(" "); + if (s1.length == 0) { + return 0; + } else { + return s1[s1.length - 1].length(); + } + } + + public static void main(String[] args) { + int i = lengthOfLastWord(""); + System.out.println(i); + } +} diff --git a/0337-House-Robber-III/pom.xml b/0337-House-Robber-III/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..e769f8ead8233d5e36d77c615ab9021a30b01ba4 --- /dev/null +++ b/0337-House-Robber-III/pom.xml @@ -0,0 +1,15 @@ + + + + LeetCode + com.lin.LeetCode + 1.0 + + 4.0.0 + + 0337-House-Robber-III + + + \ No newline at end of file diff --git a/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/HouseRobberIii.java b/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/HouseRobberIii.java new file mode 100644 index 0000000000000000000000000000000000000000..be31aefc8dae45723a1248b3def01b21b337e699 --- /dev/null +++ b/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/HouseRobberIii.java @@ -0,0 +1,32 @@ +package com.lin.houserobberiii; + +/** + * 打家劫舍3 + * + * @author 九分石人 + */ +public class HouseRobberIii { + + public int rob(TreeNode root) { + int[] robb = robb(root); + return Math.max(robb[0], robb[1]); + } + + + int[] robb(TreeNode root) { + if (root == null) { + return new int[2]; + } + int[] result = new int[2]; + + int[] left = robb(root.left); + int[] right = robb(root.right); + + //不选当前节点,则选左子树的最大值加右子树的最大值 + result[0] = Math.max(left[0], left[1]) + Math.max(right[0], right[1]); + //选当前节点,则为不选左子树加不选右子树加自己的值 + result[1] = left[0] + right[0] + root.val; + + return result; + } +} diff --git a/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/TreeNode.java b/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/TreeNode.java new file mode 100644 index 0000000000000000000000000000000000000000..da38172a48a6384648faa0c62b2ab1e775fc3f62 --- /dev/null +++ b/0337-House-Robber-III/src/main/java/com/lin/houserobberiii/TreeNode.java @@ -0,0 +1,14 @@ +package com.lin.houserobberiii; + +/** + * @author 九分石人 + */ +public class TreeNode { + int val; + TreeNode left; + TreeNode right; + + TreeNode(int x) { + val = x; + } +} diff --git a/0337-House-Robber-III/src/main/resources/0337-house-robber-iii.md b/0337-House-Robber-III/src/main/resources/0337-house-robber-iii.md new file mode 100644 index 0000000000000000000000000000000000000000..a732760829dcaffb2b70c193934417b28084e45b --- /dev/null +++ b/0337-House-Robber-III/src/main/resources/0337-house-robber-iii.md @@ -0,0 +1,56 @@ +# 打家劫舍3 +## 题目描述 + +在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃的地区。 +这个地区只有一个入口,我们称之为“根”。 +除了“根”之外,每栋房子有且只有一个“父“房子与之相连。 +一番侦察之后,聪明的小偷意识到“这个地方的所有房屋的排列类似于一棵二叉树”。 +如果两个直接相连的房子在同一天晚上被打劫,房屋将自动报警。 + +计算在不触动警报的情况下,小偷一晚能够盗取的最高金额。 + +**示例1:** + +``` +输入:[3,2,3,null,3,null,1] + + 3 + / \ + 2 3 + \ \ + 3 1 + +输出:7 +解释:小偷一晚能盗取的最高金额 = 3 + 3 + 1 = 7 +``` +**示例2:** +``` +输入:[3,4,5,1,3,null,1] + + 3 + / \ + 4 5 + / \ \ + 1 3 1 + +输出:7 +解释:小偷一晚能盗取的最高金额 = 4 + 5 = 9 +``` +--- +## 题目解析 + +### 1. 动态规划 + +1. 以当前节点为根节点 +2. 对于当前节点,所能计算的最大值为 + 1. 选中当前节点时,最大值为当前节点的值加不选左子节点的左子树最大值加不选右子节点的右子树最大值 + 2. 不选当前节点时,最大值为左子树最大值加右子树最大值 + 3. 返回当前节点的值 +3. 递归对左子树和右子树进行计算 +4. 当前节点为叶子节点时不在继续往下递归 +5. 返回递归结果 + +### 2. 爷孙相加 + + + diff --git a/README.en.md b/README.en.md index 05c8d05a7c9a6bbe990e2098c7bc02b61b97b421..bd2c0a3cfd55513cf43a67b9a746522e456b3ffc 100644 --- a/README.en.md +++ b/README.en.md @@ -1,36 +1,18 @@ # LeetCode #### Description -我的LeetCode做题记录 +My LeetCode History #### Software Architecture Software architecture description #### Installation -1. xxxx -2. xxxx -3. xxxx +1. Maven +2. git clone #### Instructions 1. xxxx 2. xxxx 3. xxxx - -#### Contribution - -1. Fork the repository -2. Create Feat_xxx branch -3. Commit your code -4. Create Pull Request - - -#### Gitee Feature - -1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md -2. Gitee blog [blog.gitee.com](https://blog.gitee.com) -3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) -4. The most valuable open source project [GVP](https://gitee.com/gvp) -5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) -6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) diff --git a/README.md b/README.md index 18f6c8f45339b0ea42862e5bad6690e176a5a896..2d8a8985369cc71754b11b625a6c5509e012446f 100644 --- a/README.md +++ b/README.md @@ -4,34 +4,16 @@ 我的LeetCode做题记录 #### 软件架构 -软件架构说明 +Maven #### 安装教程 -1. xxxx -2. xxxx -3. xxxx +1. 安装maven +2. git clone -#### 使用说明 - -1. xxxx -2. xxxx -3. xxxx - -#### 参与贡献 -1. Fork 本仓库 -2. 新建 Feat_xxx 分支 -3. 提交代码 -4. 新建 Pull Request - - -#### 码云特技 +#### 使用说明 -1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md -2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) -3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 -4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 -5. 码云官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) -6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) +1. 两数之和 +2. 两数相加 \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..7a790620196dc7ac7f7eeb76514b1a2547bacd72 --- /dev/null +++ b/pom.xml @@ -0,0 +1,58 @@ + + + 4.0.0 + + com.lin.LeetCode + LeetCode + pom + 1.0 + + + + + + org.junit.jupiter + junit-jupiter + 5.5.2 + test + + + + + + + 0001-Two-Sum + 0002-Add-Two-Numbers + 0003-Longest-Substring-Without-Repeating-Characters + 0007-Reverse-Integer + 0009-Palindrome-Number + 0337-House-Robber-III + 0019-Remove-Nth-Node-From-End-of-List + 0021-Merge-Two-Lists + 0026-RemoveDuplicates + 0035-Search-Insert + 0058-Length-Of-Last-Word + 0027-Remove-Element + 0028-Str-Str + 0053-Max-Sub-Array + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.5.1 + + 1.8 + 1.8 + + + + + + + \ No newline at end of file