预测赢家

给你一个整数数组 nums 。玩家 1 和玩家 2 基于这个数组设计了一个游戏。

玩家 1 和玩家 2 轮流进行自己的回合,玩家 1 先手。开始时,两个玩家的初始分值都是 0 。每一回合,玩家从数组的任意一端取一个数字(即,nums[0] 或 nums[nums.length - 1]),取到的数字将会从数组中移除(数组长度减 1 )。玩家选中的数字将会加到他的得分上。当数组中没有剩余数字可取时,游戏结束。
如果玩家 1 能成为赢家,返回 true 。如果两个玩家得分相等,同样认为玩家 1 是游戏的赢家,也返回 true 你可以假设每个玩家的玩法都会使他的分数最大化。

示例

输入:nums = [1,5,2]
输出:false
解释:一开始,玩家 1 可以从 1 和 2 中进行选择。
如果他选择 2(或者 1 ),那么玩家 2 可以从 1(或者 2 )和 5 中进行选择。如果玩家 2 选择了 5 ,那么玩家 1 则只剩下 1(或者 2 )可选。 
所以,玩家 1 的最终分数为 1 + 2 = 3,而玩家 2 为 5 。
因此,玩家 1 永远不会成为赢家,返回 false 。

解题

方法一:递归

递归函数:返回当前做选择的玩家,基于当前区间[i,j],赢过对手的分数。
当前选择的分数-往后对手赢过自己的分数(对剩余数组递归)。因为有两端可选择,所以差值有两个,取较大的判断是否 >= 0。

class Solution {
    int []nums ;
    public boolean PredictTheWinner(int[] nums) {
        this.nums = nums;
        //基于整个数组玩这个游戏,玩家1先手,>=0就获胜
        return recur(0,nums.length-1) >= 0; 
    }

    //从i到j的数组,当前选择的玩家所能赢对方的分数
    public int recur(int i, int j){
        if(i == j) return nums[i];

        //如果选择左端,获得nums[i],之后输掉recur(i+1,j)分
        int num1 = nums[i] - recur(i+1,j); 

        //如果选择右端,获得nums[j],之后输掉recur(i,j-1)分
        int num2 = nums[j] - recur(i,j-1); 

        return Math.max(num1,num2);
    }
}

方法二:记忆化递归

方法一做了一些重复的计算,存储计算过的子问题的解,当遇到重复的子问题,直接返回命中的存储值。

class Solution {
    int [] nums ;
    public boolean PredictTheWinner(int[] nums) {
        this.nums = nums;
        int len = nums.length;
        int [][]res = new int[len][len];
        for(int m = 0; m<len; m++){
             for(int n = 0; n<len; n++){
                 res[m][n] = 999;
            }
        }
        return recur(res,0,nums.length-1) >= 0; 
    }

    public int recur(int [][]res,int i, int j){

        if(i == j) return nums[i];
        if(res[i][j] != 999 ) return res[i][j];

        int num1 = nums[i] - recur(res,i+1,j); 
        int num2 = nums[j] - recur(res,i,j-1); 

        res[i][j] = Math.max(num1,num2);
        return res[i][j];
    }
}

方法三:动态规划

==1.数据迁移
六七百T,500并发,几百张表
一个月

replication数据/业务流量/ 摘掉   下线

过程中:
1.硬件指标关注
2.确保源集群 表 没流量了 “=0”  再切
3.关注集群容量   业务治理 / 15%就要扩容    凡是做快照,长时间不删,容量得关注


1.谷歌的机房迁移到新加坡自建机房
2.lt4,lt8   l3 内蒙古 便宜  便离线的  HBase
3.lt5,lt6,   北京的其他机房  便实时在线
4.aim xm/sg -> 华南   只需要跑一下迁移工具就行      业务需求  迁移存量数据到南方

==2.特征中心业务
离线,数据流大,特征数据,底层存储用hadoop大集群
hdfs是hadoop集群
不是HBase自己的集群

lt8 表 搜索1张,其他的reco
1.搜索  mr跑300T也能接受,全表扫描
现状:110T  50多rs ,做compaction,超过300扩容
2.reco
特征+样本-> 数据
分桶 mr任务
HDFS 
why HBase
1.debug查询
2.merge
小文件,合并

-关注region数



==3.用append_peer 
re问题:
堆积
set_peer 覆盖
blobstore集群粒度/表粒度  append了一下,建了一张表,  其他的没了

==4.tablediff 补数据

下周todo:
== 5.HBase接入hdfs鉴权。 沟通权限中心,进行测试
== bulkload
== 迁移->年后
==鉴权参数 ->朱超