算法的深入学习和总结2022-09-05

算法学习总结–

labuladong 书的总结。 书本身并不难吧 套路也是 有用或没用。
一步一步来。 熟能生巧。-- 2022-09-05

Java 基础数据结构

数组
String
ArrayList 。 双向链表 LinkedList
HashMap :基本方法。HashSet。Queue . Stack

所谓套路

LeetCode 124 二叉树的最大路径和:

/**
     * LeetCode 124 二叉树的最大路径和
     * 本题难点:  最大路径和 不一定过 根结点。
     * 即是 路径的定义 这一问题。
     * <p>
     * TODO: 思考最大的路径不一定过根结点 所以再每一个有子节点的父节点 都要做一下求和。
     * TODO 遍历所以之后 就可以找到最大值。 这也是为什么
     */
    private int pathLength = Integer.MIN_VALUE;

    public int maxPathSum(TreeNode root) {
        maxPath(root);
        return pathLength;
    }

    public int maxPath(TreeNode root) {
        if (root == null) {
            return 0;
        }
        int left = Math.max(0, maxPath(root.left));
        int right = Math.max(0, maxPath(root.right));
        pathLength = Math.max(pathLength, right + left + root.val);
        return root.val + Math.max(root.left.val, root.right.val);
    }

回溯框架

动态规划框架:
最长递增子序列。
最小编辑距离。
凑零钱问题:

设计事务事实表

选择业务过程------声明粒度—确认维度—确认事实
粒度 找最细粒度。 每天 的库存 累积 不等于每个月的库存。 度量一定可加么?? 不一定。
数据调研----- 明确数据域—>>>> 构建业务总线矩阵------>>>>>.维度模型设计---- 开发-----调度
明确统计指标---->>>>> 汇总模型设计
指标:
原子指标-- 订单总金额
派生指标— 最近一天 各个省份手机品类订单总金额。 =原子指标+ 统计周期+业务限定+统计粒度。
衍生指标-----

原子指标: 不可以拆分。
派生:原子基础上 增加。
衍生: 一个或多个派生指标基础上 各种聚合逻辑 复合而成。 比率 比例等。

分层设计:
ODS :Kafka pulsar。
DWD: 日志分流。
DIM:常驻数据一般不用Redis
DWS 轻度汇总 窗口汇总

维度数据:
事实表 和维度表分流。
读取MySQL的配置数据—>>传统的 MaxWell 得到历史数据和全量数据。
或者CDC 连接器
JDBC 只能读取全量。
IDEA +Flink 环境

排序 和异或运算

排序
异或 运算理解为无进位 相加。
异或满足交换律。 与先后顺序无关。

数组中异或:两个位置 i!=j 不相同。

异或: 一种数出现了奇数次 其他数出现了偶数次。
两种数出现了奇数次。其他数出现了偶数次。

    /**
     * 一种数出现了奇数次 其他数出现了偶数次。
     *
     * @param arr
     */
    public static void printOddTimesNum1(int[] arr) {
        int eO = 0;
        for (int cur : arr) {
            eO ^= cur;
        }
        System.out.println(eO);
    }

    /**
     * 2种数出现了奇数次 其他数出现了偶数次。
     *
     * @param arr
     */
    public static void printOddTime2Num2(int[] arr) {
        int e0 = 0, ehasOne = 0;
        for (int curNum : arr) { // 最终结果是 两数异或。 一定在某一位不等于0.
            e0 ^= curNum;
        }
        int right = e0 & (~e0 + 1);   //最后一位不是1的数是哪一位。
        for (int cur : arr) {
            if ((cur & right) != 0) {
                ehasOne ^= cur;
            }
        }

        System.out.println(ehasOne + "" + (e0 ^ ehasOne));
    }
}

提取最低位的1
n&-n 或 n&(~n+1)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值