有两个长度均为n 的数组nums,values,从nums数组头或尾取出一个数,
假设第i次取的值为x,那么第i次的价值为values[i - 1]*x,
求最终价值累计和的最大值
机考的时候想着其他的更优解,没能憋出来,此解为事后直接按暴力递归求解,若有更优解欢迎斧正。
public class Solution {
public class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
public int getMaxValue(int[] nums, int[] values) {
// 定义存储各个选择数据的二叉树根节点
Node root = new Node(0);
// 穷举各种选择
function(nums, values, root, 0, 0, nums.length - 1);
// 计算结果最大值
return functionSum(root);
}
/**
* 递归穷举所有可能性
* @param nums 题目给出的nums数组
* @param values 题目给出的values数组
* @param node 使用二叉树存储做出选择的各个数据
* @param i values的下标,控制递归结束的条件
* @param l 此次选择若选择左侧的nums数据,对应数据的下标
* @param r 此次选择若选择右侧的nums数据,对应数据的下标
*/
public void function(int[] nums, int[] values, Node node, int i, int l, int r) {
if (i == values.length) {
return;
}
node.left = new Node(nums[l] * values[i]);
node.right = new Node(nums[r] * values[i]);
function(nums, values, node.left, i + 1, l + 1, r);
function(nums, values, node.right, i + 1, l, r - 1);
}
/**
* 递归遍历二叉树获取最终累计和的最大值
* @param node 当前节点
* @return 当前节点的累计和
*/
public int functionSum(Node node) {
if (node.left == null && node.right == null) {
return node.value;
}
int left = node.left == null ? 0 : functionSum(node.left);
int right = node.right == null ? 0 : functionSum(node.right);
return Math.max(left, right) + node.value;
}
public static void main(String[] args) {
System.out.println((new Solution()).getMaxValue(new int[]{100, 1}, new int[]{1, 2}));
System.out.println((new Solution()).getMaxValue(new int[]{100, 1}, new int[]{2, 1}));
System.out.println((new Solution()).getMaxValue(new int[]{1, 2, 3, 4, 5}, new int[]{1, 2, 3, 4, 5}));
System.out.println((new Solution()).getMaxValue(new int[]{1, 3, 5, 2, 4}, new int[]{1, 2, 3, 4, 5}));
}
}