leetcode 周赛 501

作者: | 更新日期:

全源最短路

本文首发于公众号:天空的代码世界,微信号:tiankonguse

零、背景

这次比赛最后一题是全源最短路,看错数据范围了,错了两次。

本场题型概览如下。
A 题:翻转。
B 题:分割字符串。
C 题:因子分解。
D 题:全源最短路。

一、连接逆序数组

题意:给一个数组,求原数组与翻转数组拼接后的数组。

思路:按题意原数组与翻转数组相连即可。

二、有效单词计数

题意:给若干字符串,问这些字符串拼接到一起后,进行分词统计,问指定的单词分别出现几次。
单词定义:字母与连接符组成,连接符左右必须是字母。

思路:分割字符串

双层循环遍历字符串数组,把字符尝试追加到单词上。
如果得到新的单词,更新单词的频率。

四种情况算单词结束。

1)遇到空格 2)前缀单词为空,遇到连接符 3)前缀单词最后一个字符是连接符,再次遇到连接符 4) 输入结束

auto Add = [&](char c) {
  if (c == ' ') {
    Flush();
  } else if (c == '-') {
    if (!s.empty() && s.back() == '-') {
      s.push_back(c);
    } else {
      Flush();
    }
  } else {
    s.push_back(c);
  }
};

单词识别结束时,还需要判断有没有后缀连接符,有的话需要删除。

auto Flush = [&]() {
  if (!s.empty() && s.back() == '-') {
    s.pop_back();
  }
  if (!s.empty()) {
    cnt[s]++;
    s.clear();
  }
};

三、可整除替换后的数组最小元素和

题意:给一个数组,如果数组中存在一个数字是自己的因子,则自己可以使用因子进行替换。
问不断替换,最终可以得到的最小数组和。

思路:因数分解

显然,对于一个数组,使用数组中出现过的最小因子进行替换,才能得到最小数组和。
故,问题转化为找到数字在数组中出现的最小因子。

可以先对数组排序,从小到大处理,这样因子分解时,就知道因子是否出现过了。

因子分解可以使用根号算法 sqrt(n) 来做。
复杂度:O(n sqrt(n))

扩展:数据范围不大,除了进行质因数分解,还可以使用筛法。
即如果一个数字不存在更小的因子,则把这个数字所有的倍数都标记。
复杂度保持不变。

四、购买苹果的最低成本 II

题意:给两个完全一样的无向图 G1 和 G2,权值不一样。
问对于每个节点 a,通过图 G1 到达任意节点,再通过图 G2 返回到 a 的最小代价。
数据范围:点 1000 个,边 2000 条。

思路:Dijkstra 单源最短路

按题意构造两个图,分别求 n 次单源最短路,再枚举求最小答案即可。

PS:一开始看错题意了,看成点是 100,直接 floyd 超时了。

五、最后

这次比赛很简单,第二题解析字符串、第三题因数分解、第四题最短路,都基础题。

《完》

-EOF-

本文公众号:天空的代码世界
个人微信号:tiankonguse
公众号 ID:tiankonguse-code

本文首发于公众号:天空的代码世界,微信号:tiankonguse
如果你想留言,可以在微信里面关注公众号进行留言。

关注公众号,接收最新消息

tiankonguse +
穿越