招银笔试算法题

有两个长度均为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}));
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值