This commit is contained in:
fanxb 2022-02-22 23:59:42 +08:00
parent 28072a53ce
commit 861597228a
4 changed files with 106 additions and 6 deletions

View File

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

View File

@ -14,13 +14,27 @@ import java.util.Arrays;
public class Q213 { public class Q213 {
public int rob(int[] nums) { public int rob(int[] nums) {
int last = 0, cur = 0; if (nums.length == 1) {
for (int num : nums) { return nums[0];
int temp = cur; } else {
cur = Math.max(cur, last + num); return Math.max(robDo(Arrays.copyOfRange(nums, 0, nums.length - 1)), robDo(Arrays.copyOfRange(nums, 1, nums.length)));
last = temp;
} }
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) { public static void main(String[] args) {

View File

@ -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<TreeNode, Integer> 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) {
}
}

View File

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