988. Smallest String Starting From Leaf

本文介绍了一种寻找二叉树中从叶子节点到根节点的最小字典序字符串的方法。通过深度优先搜索策略,递归地构建路径并比较字符串大小,最终确定最小子串。

题目描述

Given the root of a binary tree, each node has a value from 0 to 25 representing the letters ‘a’ to ‘z’: a value of 0 represents ‘a’, a value of 1 represents ‘b’, and so on.

Find the lexicographically smallest string that starts at a leaf of this tree and ends at the root.

(As a reminder, any shorter prefix of a string is lexicographically smaller: for example, “ab” is lexicographically smaller than “aba”. A leaf of a node is a node that has no children.)

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

题目链接

https://leetcode.com/problems/smallest-string-starting-from-leaf/

方法思路

class Solution {
    //Runtime: 4 ms, faster than 55.51%
    //Memory Usage: 38.7 MB, less than 5.17% 
    String ans = "~";
    public String smallestFromLeaf(TreeNode root) {
        dfs(root, new StringBuilder());
        return ans;
    }

    public void dfs(TreeNode node, StringBuilder sb) {
        if (node == null) return;
        sb.append((char)('a' + node.val));

        if (node.left == null && node.right == null) {
            sb.reverse();
            String S = sb.toString();
            sb.reverse();

            if (S.compareTo(ans) < 0)
                ans = S;
        }

        dfs(node.left, sb);
        dfs(node.right, sb);
        sb.deleteCharAt(sb.length() - 1);//回溯
    }
}
### 计算逻辑分析 #### 平均成绩计算 平均成绩是运动员 6 次百米成绩的总和除以成绩次数(这里是 6 次)。公式为: \[ \text{平均成绩} = \frac{\sum_{i=1}^{6} x_i}{6} \] 其中 \( x_i \) 表示第 \( i \) 次的百米成绩。通过计算每个运动员的平均成绩,比较得出最短平均时间的运动员。 #### 成绩标准差计算 成绩标准差反映了成绩的离散程度,计算公式为: \[ \text{标准差} = \sqrt{\frac{\sum_{i=1}^{6} (x_i - \overline{x})^2}{6}} \] 其中 \( x_i \) 是第 \( i \) 次的百米成绩,\( \overline{x} \) 是平均成绩。计算每个运动员成绩的标准差,比较得出最小标准差的运动员。 ### 代码实现(C++) ```cpp #include <iostream> #include <iomanip> #include <vector> #include <cmath> // 计算平均成绩 double calculateAverage(const std::vector<double>& scores) { double sum = 0; for (double score : scores) { sum += score; } return sum / scores.size(); } // 计算成绩标准差 double calculateStandardDeviation(const std::vector<double>& scores, double average) { double sumSquaredDiff = 0; for (double score : scores) { sumSquaredDiff += (score - average) * (score - average); } return std::sqrt(sumSquaredDiff / scores.size()); } int main() { int n; std::cin >> n; double minAverage = 1e9; int minAverageIndex = -1; double minStdDev = 1e9; int minStdDevIndex = -1; for (int i = 0; i < n; ++i) { std::vector<double> scores(6); for (int j = 0; j < 6; ++j) { std::cin >> scores[j]; } double average = calculateAverage(scores); double stdDev = calculateStandardDeviation(scores, average); if (average < minAverage) { minAverage = average; minAverageIndex = i; } if (stdDev < minStdDev) { minStdDev = stdDev; minStdDevIndex = i; } } std::cout << std::fixed << std::setprecision(3); std::cout << "The shortest average time (" << minAverage << ") is from No." << minAverageIndex << std::endl; std::cout << "The smallest standard deviation (" << minStdDev << ") is from No." << minStdDevIndex << std::endl; return 0; } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值