Fantasy-JXF
  • Introduction
  • 机器学习
    • 机器学习基础
    • 机器学习实践
    • 机器学习算法
    • 集成学习
  • 深度学习
    • 深度学习基础
    • 深度学习实践
    • CNN
    • RNN
    • 优化算法
    • 序列建模
    • 《深度学习》整理
    • 术语表
  • 自然语言处理
    • NLP发展趋势
    • 自然语言处理基础
    • 句嵌入
    • 词向量
    • 多模态
    • 视觉问答(VQA)综述
    • 深度查询理解
      • 综述
  • 计算机视觉
    • 基本模型
  • 数学
    • 概率论
    • 微积分的本质
    • 深度学习的核心
  • 算法
    • 字符串
    • 数据结构
    • 数据结构Advanced
    • 双指针
    • 动态规划
    • 区间问题
    • 排列组合
    • 数学问题
    • 洗牌/采样/随机数
    • 大数运算
    • 海量数据处理
    • IO模板
    • 必备算法
    • LeetCode
    • 剑指Offer
    • 面试真题
  • 编程
    • C++基础
    • C++面向对象
    • C++左值与右值
    • Python基础
  • 笔试面经
    • 360
    • iHandy
    • 作业帮
    • 字节跳动
    • 小米
    • 度小满
    • 快手
    • 招行
    • 搜狐畅游
    • 滴滴
    • 爱奇艺
    • 百度
    • 百度2
    • 百度3
    • 百词斩
    • 腾讯
    • 迅雷
    • 顺丰
    • 旷视
    • 爱笔
    • 魔门塔
    • 搜狐
由 GitBook 提供支持
在本页
  • Index
  • 编辑距离
  • 分发糖果

这有帮助吗?

  1. 笔试面经

顺丰

上一页迅雷下一页旷视

最后更新于6年前

这有帮助吗?

  • 选择 30,编程 2

Index

编辑距离

LeetCode

思路

  • 动态规划

C++(AC)

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.length();
        int n = word2.length();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));

        // 初始化 dp
        for (int i = 1; i <= m; i++)
            dp[i][0] = i;
        for (int j = 1; j <= n; j++)
            dp[0][j] = j;

        // 更新 dp
        for (int i = 1; i <=m; i++)
            for (int j = 1; j <= n; j++)
                if (word1[i - 1] == word2[j - 1])
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = min({ dp[i - 1][j] + 1, dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1 });

        return dp[m][n];
    }
};

分发糖果

思路

  • 贪心:

    • 首先初始化每个人一个糖果,然后这个算法需要遍历两遍,

    • 第一遍从左向右遍历,如果右边的小盆友的等级高,等加一个糖果,这样保证了一个方向上高等级的糖果多。

    • 第二遍从右向左遍历,如果相邻两个左边的等级高,而左边的糖果又少的话,则左边糖果数为右边糖果数加一。

    • 最后再把所有小盆友的糖果数都加起来返回即可。

C++(AC)

class Solution {
public:
    int candy(vector<int>& ratings) {
        int n = ratings.size();

        vector<int> nums(n, 1);
        for (int i = 0; i < n - 1; ++i) {
            if (ratings[i + 1] > ratings[i]) 
                nums[i + 1] = nums[i] + 1;
        }

        for (int i = n - 1; i > 0; --i) {
            if (ratings[i - 1] > ratings[i]) 
                nums[i - 1] = max(nums[i - 1], nums[i] + 1);
        }

        int res = 0
        for (auto num : nums) 
            res += num;
        return res;
    }
};

LeetCode

编辑距离
分发糖果
72. 编辑距离
135. 分发糖果