From 84f1b5fa8352205ca8930d58c9b07961fe235820 Mon Sep 17 00:00:00 2001 From: fanxb Date: Wed, 23 Feb 2022 11:24:00 +0800 Subject: [PATCH 1/4] add --- 5.leetcode/src/com/fanxb/common/ListNode.java | 18 +++ 5.leetcode/src/com/fanxb/common/Q23.java | 118 ++++++++++++++++++ 5.leetcode/src/com/fanxb/common/Q25.java | 56 +++++++++ 3 files changed, 192 insertions(+) create mode 100644 5.leetcode/src/com/fanxb/common/ListNode.java create mode 100644 5.leetcode/src/com/fanxb/common/Q23.java create mode 100644 5.leetcode/src/com/fanxb/common/Q25.java diff --git a/5.leetcode/src/com/fanxb/common/ListNode.java b/5.leetcode/src/com/fanxb/common/ListNode.java new file mode 100644 index 0000000..93a4750 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/ListNode.java @@ -0,0 +1,18 @@ +package com.fanxb.common; + +public class ListNode { + int val; + ListNode next; + + public ListNode() { + } + + public ListNode(int val) { + this.val = val; + } + + public ListNode(int val, ListNode next) { + this.val = val; + this.next = next; + } +} diff --git a/5.leetcode/src/com/fanxb/common/Q23.java b/5.leetcode/src/com/fanxb/common/Q23.java new file mode 100644 index 0000000..778fbac --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q23.java @@ -0,0 +1,118 @@ +package com.fanxb.common; + +import java.util.*; +import java.util.stream.Collectors; + +public class Q23 { + public static class ListNode { + int val; + ListNode next; + + ListNode() { + } + + ListNode(int val) { + this.val = val; + } + + ListNode(int val, ListNode next) { + this.val = val; + this.next = next; + } + } + + public ListNode mergeKLists(ListNode[] lists) { + PriorityQueue queue = new PriorityQueue<>(Comparator.comparingInt(a -> a.val)); + queue.addAll(Arrays.stream(lists).filter(Objects::nonNull).collect(Collectors.toList())); + if (queue.isEmpty()) { + return null; + } + ListNode res = queue.poll(), temp = res; + while (!queue.isEmpty()) { + if (temp.next != null) { + queue.add(temp.next); + } + temp.next = queue.poll(); + temp = temp.next; + } + return res; + } + + /** + * 依次归并 + */ + public ListNode so1(ListNode[] lists) { + List listNodeList = Arrays.stream(lists).filter(Objects::nonNull).collect(Collectors.toList()); + if (listNodeList.isEmpty()) { + return null; + } + ListNode res = listNodeList.get(0); + for (int i = 1; i < listNodeList.size(); i++) { + //依次和第i合并 + ListNode tempRes = new ListNode(), temp = tempRes; + ListNode cur = listNodeList.get(i); + while (res != null && cur != null) { + if (res.val < cur.val) { + temp.next = res; + res = res.next; + } else { + temp.next = cur; + cur = cur.next; + } + temp = temp.next; + } + //接上剩下的部分 + temp.next = res == null ? cur : res; + //临时结果 + res = tempRes.next; + } + return res; + } + + public ListNode so2(ListNode[] lists) { + List listNodeList = Arrays.stream(lists).filter(Objects::nonNull).collect(Collectors.toList()); + int n = listNodeList.size(); + if (n == 0) { + return null; + } + while (n > 1) { + int count = 0; + for (int i = 0; i + 1 < n; i += 2, count++) { + ListNode a = listNodeList.get(i), b = listNodeList.get(i + 1), head = new ListNode(), temp = head; + while (a != null && b != null) { + if (a.val < b.val) { + temp.next = a; + a = a.next; + } else { + temp.next = b; + b = b.next; + } + temp = temp.next; + } + temp.next = a == null ? b : a; + listNodeList.set(count, head.next); + } + //如果为奇数,要把最后一个落单的放到count上 + if (n % 2 != 0) { + listNodeList.set(count++, listNodeList.get(n - 1)); + } + //新的链表数量为count + n = count; + } + return listNodeList.get(0); + } + + public static void main(String[] args) { + ListNode a = new ListNode(1); + a.next = new ListNode(4); + a.next.next = new ListNode(5); + ListNode b = new ListNode(1); + b.next = new ListNode(3); + b.next.next = new ListNode(4); + ListNode c = new ListNode(2); + c.next = new ListNode(6); +// new Q23().mergeKLists(new ListNode[]{a, b, c}); +// new Q23().so1(new ListNode[]{a, b, c}); + new Q23().so2(new ListNode[]{a, b}); + } +} diff --git a/5.leetcode/src/com/fanxb/common/Q25.java b/5.leetcode/src/com/fanxb/common/Q25.java new file mode 100644 index 0000000..a999912 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q25.java @@ -0,0 +1,56 @@ +package com.fanxb.common; + +public class Q25 { + public ListNode reverseKGroup(ListNode head, int k) { + ListNode res = new ListNode(), index = head; + res.next = head; + int count = 0; + //left:开始翻转节点的父节点 + //right:结束翻转的节点 + ListNode beforeL = res, l = beforeL.next, r, afterR; + while (index != null) { + if (++count == k) { + //进行翻转 + r = index; + afterR = index.next; + reverse(l, count); + index = l; + //处理头尾节点关系 + l.next = afterR; + beforeL.next = r; + //进行下一轮循环 + beforeL = index; + l = index.next; + count = 0; + } + index = index.next; + } + return res.next; + } + + /** + * 翻转start后的n个节点 + * + * @param start + * @param n + */ + private void reverse(ListNode start, int n) { + //反转节点 + ListNode prev = null; + for (int i = 0; i < n; i++) { + ListNode next = start.next; + start.next = prev; + prev = start; + start = next; + } + } + + public static void main(String[] args) { + ListNode node = new ListNode(1); + node.next = new ListNode(2); + node.next.next = new ListNode(3); + node.next.next.next = new ListNode(4); + node.next.next.next.next = new ListNode(5); + new Q25().reverseKGroup(node, 3); + } +} From ea56f626b7e72da3b347322d8d3e1306056da6ab Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sun, 26 Dec 2021 13:44:42 +0000 Subject: [PATCH 2/4] Bump elasticsearch from 7.13.3 to 7.14.0 in /es-demo Bumps [elasticsearch](https://github.com/elastic/elasticsearch) from 7.13.3 to 7.14.0. - [Release notes](https://github.com/elastic/elasticsearch/releases) - [Commits](https://github.com/elastic/elasticsearch/compare/v7.13.3...v7.14.0) --- updated-dependencies: - dependency-name: org.elasticsearch:elasticsearch dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- es-demo/pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/es-demo/pom.xml b/es-demo/pom.xml index 429e577..f4f39b4 100644 --- a/es-demo/pom.xml +++ b/es-demo/pom.xml @@ -31,7 +31,7 @@ org.elasticsearch elasticsearch - 7.13.3 + 7.14.0 From 5e6fdc40cc4a4b5df1b3ebbb68ed0c999d1cb8fa Mon Sep 17 00:00:00 2001 From: fanxb Date: Tue, 22 Feb 2022 23:59:42 +0800 Subject: [PATCH 3/4] add --- 5.leetcode/src/com/fanxb/common/Q198.java | 20 ++++++++ 5.leetcode/src/com/fanxb/common/Q213.java | 26 ++++++++--- 5.leetcode/src/com/fanxb/common/Q337.java | 46 +++++++++++++++++++ 5.leetcode/src/com/fanxb/common/TreeNode.java | 20 ++++++++ 4 files changed, 106 insertions(+), 6 deletions(-) create mode 100644 5.leetcode/src/com/fanxb/common/Q198.java create mode 100644 5.leetcode/src/com/fanxb/common/Q337.java create mode 100644 5.leetcode/src/com/fanxb/common/TreeNode.java diff --git a/5.leetcode/src/com/fanxb/common/Q198.java b/5.leetcode/src/com/fanxb/common/Q198.java new file mode 100644 index 0000000..90885c6 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q198.java @@ -0,0 +1,20 @@ +package com.fanxb.common; + +public class Q198 { + public int rob(int[] nums) { + //定义fn[k]表示有k个房子时的最大金额 + int[] fn = new int[nums.length + 1]; + //显然fn[0]=0,fn[1]=nums[0] + fn[1] = nums[0]; + int res = fn[1]; + for (int i = 2; i <= nums.length; i++) { + //当发现新房子时要获得最大收益有两种选择,偷这个新房子(不能偷前一个房子)或者不偷这一个房子(这样就能偷前一个房子了),这两个情况用公式表示如下: + fn[i] = Math.max(fn[i - 1], fn[i - 2] + nums[i - 1]); + if (fn[i] > res) { + res = fn[i]; + } + } + return res; + } + +} diff --git a/5.leetcode/src/com/fanxb/common/Q213.java b/5.leetcode/src/com/fanxb/common/Q213.java index 2fc71cf..1c3b25b 100644 --- a/5.leetcode/src/com/fanxb/common/Q213.java +++ b/5.leetcode/src/com/fanxb/common/Q213.java @@ -14,13 +14,27 @@ import java.util.Arrays; public class Q213 { public int rob(int[] nums) { - int last = 0, cur = 0; - for (int num : nums) { - int temp = cur; - cur = Math.max(cur, last + num); - last = temp; + if (nums.length == 1) { + return nums[0]; + } else { + return Math.max(robDo(Arrays.copyOfRange(nums, 0, nums.length - 1)), robDo(Arrays.copyOfRange(nums, 1, nums.length))); } - return cur; + } + + private int robDo(int[] nums) { + //定义fn[k]表示有k个房子时的最大金额 + int[] fn = new int[nums.length + 1]; + //显然fn[0]=0,fn[1]=nums[0] + fn[1] = nums[0]; + int res = fn[1]; + for (int i = 2; i <= nums.length; i++) { + //当发现新房子时要获得最大收益有两种选择,偷这个新房子(不能偷前一个房子)或者不偷这一个房子(这样就能偷前一个房子了),这两个情况用公式表示如下: + fn[i] = Math.max(fn[i - 1], fn[i - 2] + nums[i - 1]); + if (fn[i] > res) { + res = fn[i]; + } + } + return res; } public static void main(String[] args) { diff --git a/5.leetcode/src/com/fanxb/common/Q337.java b/5.leetcode/src/com/fanxb/common/Q337.java new file mode 100644 index 0000000..7f10868 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/Q337.java @@ -0,0 +1,46 @@ +package com.fanxb.common; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +/** + * 旋转链表 + * 题目地址:https://leetcode-cn.com/problems/assign-cookies/submissions/ + * 解题思路: + * 贪心算法,想不明白 + * + * @author fanxb + * Date: 2020/6/9 15:10 + */ +public class Q337 { + + + public int rob(TreeNode root) { + return robDo(root, new HashMap<>()); + } + + public int robDo(TreeNode root, Map map) { + if (root == null) { + return 0; + } + Integer val = map.get(root); + if (val != null) { + return val; + } + //从根节点看起,根节点如果选择投了钱那么他的两个子节点都不能投钱,此是偷的钱的和为根节点的钱+从根节点孙子结点开始偷的钱的综合 + //如果根节点不偷,那么他的两个子节点都可以投钱,此时偷钱的和为从两个子节点开始偷到的钱的综合 + //然后再把子节点当作根节点来看就得到了递归关系 + //sum1:两个孩子节点能偷到的钱 + int sum1 = robDo(root.left, map) + robDo(root.right, map); + //四个孙子和roo节点能偷盗的钱 + int sum2 = root.val + (root.left == null ? 0 : (robDo(root.left.left, map) + robDo(root.left.right, map))) + (root.right == null ? 0 : (robDo(root.right.left, map) + robDo(root.right.right, map))); + val = Math.max(sum1, sum2); + map.put(root, val); + return val; + } + + + public static void main(String[] args) { + } +} diff --git a/5.leetcode/src/com/fanxb/common/TreeNode.java b/5.leetcode/src/com/fanxb/common/TreeNode.java new file mode 100644 index 0000000..6cc0dd9 --- /dev/null +++ b/5.leetcode/src/com/fanxb/common/TreeNode.java @@ -0,0 +1,20 @@ +package com.fanxb.common; + +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; + } +} From 81e2e456b826741e13032a094fae0a27d9bc0264 Mon Sep 17 00:00:00 2001 From: fanxb Date: Wed, 23 Feb 2022 15:48:36 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20'README.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 72 +++++++++++++++++++++++++++---------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/README.md b/README.md index 105a9a4..d1036d6 100644 --- a/README.md +++ b/README.md @@ -1,36 +1,36 @@ -欢迎Issues提问,我会每天看的。 - -这里的代码都有对应的博文的,可以在[www.tapme.top](http://www.tapme.top) 上查看。 - -这里给我另外的项目打个广告: - -- [签签世界](https://github.com/FleyX/bookmark) 在线云书签应用 - - -# demo-project -用于存放demo代码。 -- **1. SSO单端登陆 : 基于jwt的单点登陆实现demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/1.SSO%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95) -- **2. dxfl : spring boot 2.x + mybatis + mysql(基于主从备份) 读写分离demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/dxfl) - -- **3. h5websocket : spring boot 2.x 原生websocket实现demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/h5websocket) - -- **4. redis实现简易版消息队列mq(java版)**,[代码位置](https://github.com/FleyX/demo-project/tree/master/4.redis-mq),[博文地址](http://www.tapme.top/blog/detail/20200605) - -- ** jms_demo : spring boot 2.x 整合使用activemq教程**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/jms_demo) - -- ** mybatis-test : springboot 2.x 整合使用mybatis教程(xml和注解两种方式)** , [点击跳转](https://github.com/FleyX/demo-project/tree/master/mybatis-test) - -- ** springboot_springsecurity_demo : sping boot 2.下整合使用springsecurity demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/springboot_spirngsecurity_demo) - -- ** springcloud: spring cloud学习过程中的demo项目**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/springcloud)
注意其中licensingservice为配置中心git集中配置的样例配置。configFolder为配置中心磁盘文件集中式配置的样例。 - -- ** 杂项**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/%E6%9D%82%E9%A1%B9) - - svg转png、jpg:svg文件转成png,jpg等图片格式 - - excel导出 : java 导出excel,支持百万级别数据导出 - -- ** springboot logback配置**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/spring-boot/log-demo)
运行test文件看效果 - -- ** springboot 分库分表demo**,基于sharding-jdbc实现。[点击跳转](https://github.com/FleyX/demo-project/tree/master/spring-boot/sjdemo)。博文跳转:[https://www.tapme.top/blog/detail/2019-03-20-10-38](https://www.tapme.top/blog/detail/2019-03-20-10-38) -- ** springboot整合elasticsearch 7.2,基于官方high level client**。[点击跳转](https://github.com/FleyX/demo-project/tree/master/es-demo).[博客地址](https://www.tapme.top/blog/detail/2019-07-29-14-59) - -- ** 主流排序算法**:[点击跳转](https://github.com/FleyX/demo-project/tree/master/3.%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/src).[对应的博文](https://www.tapme.top/blog/detail/20190806/) +欢迎Issues提问,我会每天看的。 + +这里的代码都有对应的博文的,可以在[blog.fleyx.com](http://blog.fleyx.com) 上查看。 + +这里给我另外的项目打个广告: + +- [签签世界](https://github.com/FleyX/bookmark) 在线云书签应用 + + +# demo-project +用于存放demo代码。 +- **1. SSO单端登陆 : 基于jwt的单点登陆实现demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/1.SSO%E5%8D%95%E7%82%B9%E7%99%BB%E5%BD%95) +- **2. dxfl : spring boot 2.x + mybatis + mysql(基于主从备份) 读写分离demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/dxfl) + +- **3. h5websocket : spring boot 2.x 原生websocket实现demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/h5websocket) + +- **4. redis实现简易版消息队列mq(java版)**,[代码位置](https://github.com/FleyX/demo-project/tree/master/4.redis-mq),[博文地址](http://www.tapme.top/blog/detail/20200605) + +- ** jms_demo : spring boot 2.x 整合使用activemq教程**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/jms_demo) + +- ** mybatis-test : springboot 2.x 整合使用mybatis教程(xml和注解两种方式)** , [点击跳转](https://github.com/FleyX/demo-project/tree/master/mybatis-test) + +- ** springboot_springsecurity_demo : sping boot 2.下整合使用springsecurity demo**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/springboot_spirngsecurity_demo) + +- ** springcloud: spring cloud学习过程中的demo项目**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/springcloud)
注意其中licensingservice为配置中心git集中配置的样例配置。configFolder为配置中心磁盘文件集中式配置的样例。 + +- ** 杂项**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/%E6%9D%82%E9%A1%B9) + - svg转png、jpg:svg文件转成png,jpg等图片格式 + - excel导出 : java 导出excel,支持百万级别数据导出 + +- ** springboot logback配置**,[点击跳转](https://github.com/FleyX/demo-project/tree/master/spring-boot/log-demo)
运行test文件看效果 + +- ** springboot 分库分表demo**,基于sharding-jdbc实现。[点击跳转](https://github.com/FleyX/demo-project/tree/master/spring-boot/sjdemo)。博文跳转:[https://www.tapme.top/blog/detail/2019-03-20-10-38](https://www.tapme.top/blog/detail/2019-03-20-10-38) +- ** springboot整合elasticsearch 7.2,基于官方high level client**。[点击跳转](https://github.com/FleyX/demo-project/tree/master/es-demo).[博客地址](https://www.tapme.top/blog/detail/2019-07-29-14-59) + +- ** 主流排序算法**:[点击跳转](https://github.com/FleyX/demo-project/tree/master/3.%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95/src).[对应的博文](https://www.tapme.top/blog/detail/20190806/)