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; + } +}