算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 设计 Excel 求和公式,我们先来看题面:

https://leetcode.cn/problems/design-excel-sum-formula/

示例

示例 1:输入:courses = [[100, 200], [200, 1300], [1000, 1250], [2000, 3200]]
输出:3
解释:
这里一共有 4 门课程,但是你最多可以修 3 门:
首先,修第 1 门课,耗费 100 天,在第 100 天完成,在第 101 天开始下门课。
第二,修第 3 门课,耗费 1000 天,在第 1100 天完成,在第 1101 天开始下门课程。
第三,修第 2 门课,耗时 200 天,在第 1300 天完成。
第 4 门课现在不能修,因为将会在第 3300 天完成它,这已经超出了关闭日期。示例 2:输入:courses = [[1,2]]
输出:1示例 3:输入:courses = [[3,2],[4,3]]
输出:0

解题

https://www.cnblogs.com/grandyang/p/7170238.html

主要思路:

这道题让我们设计Excel表格的求和公式,Excel表格想必大家都用过,还是比较熟悉的,这里让我们对单元格进行求和运算。由于这道题里要求二维数组的局部和,而且又会经常更新数组的值,博主第一反应觉得应该用之前那题Range Sum Query 2D - Mutable中的树状数组来做,结果哼哼哧哧的写完后,发现下面这个test case没通过:

["Excel","sum","set","get"]

[[3,"C"],[1,"A",["A2"]],[2,"A",1],[1,"A"]]

Expected:

[null,0,null,1]

仔细分析一下发现,这个case先把A2的值赋给了A1,此时A1和A2都是0,然后给A2赋值为1,求A1的值。大家的第一印象肯定是觉得A1还是0啊,其实在Excel中,相当于已经把A1和A2关联起来了,只要A2点值发生了改变,A1的值也会跟着变,所以A1的值此时也为1。而树状数组的主要功能的优化区域和的计算速度,并没有建立关联的步骤,难怪不能通过OJ呢。这道题标记为Hard还是有道理的,我们要模拟出Excel表中的这种关联方式,这里参考的是yupinglu大神的帖子,首先我们肯定需要一个二维数组mat来保存数据,然后需要一个map来建立单元格和区域和之间的映射,这里的区域和就是sum函数中的字符串数组表示的内容,可参见题目中的例子,有可能单个单元格或者多个。

我们来看set函数,如果我们改变了某个单元格的内容,那么如果作为结果单元格,那么对应的链接就会断开。比如我们有三个单元格A1, B1, C1,我们设置的关联是A1 + B1 = C1,那么我们改变A1和B1的值都是OK的,C1的值会自动更新。但如果我们改变了C1的值,那么这个关联就不复存在了,Excel中也是这样的。所以我们在改变某个单元格的时候,要将其的关联删除。

我们再来看get函数,我们在获取某个单元格的值的时候,一定要先看其有没有和其他单元格关联,如果有的话,要重新计算一下关联,有可能关联的单元格的值已经发生改变了,那么当前作为结果单元格的值也需要改变;如果该单元格没有任何关联,那么就直接从数组mat中取值即可。

最后看本题的难点sum函数,要根据关联格求出结果格的值,首先这个字符串数组可能有多个字符串,每个字符串有两个可能,一种是单个的单元格,一种是两个单元格中间用冒号隔开。那么我们需要分情况讨论,区别这两种情况的方法就是看冒号是否存在,如果不存在,就说明只有一个单元格,我们将其数字和字母都提取出来,调用get函数,将该位置的值加入结果res中;如果冒号存在,我们根据冒号的位置,分别将两个单元格的字母和数字提取出来,然后遍历这两个单元格之间所有的单元格,调用get函数并将返回值加入结果res中。这个遍历相加的过程可能可以用树状数组来优化,但由于这不是此题的考察重点,所以直接遍历就OK。最后别忘了建立目标单元格和区域字符串数组之间的映射,并返回结果res即可。

class Excel {
public:Excel(int H, char W) {m.clear();mat.resize(H, vector<int>(W - 'A', 0));}void set(int r, char c, int v) {if (m.count({r, c})) m.erase({r, c});mat[r - 1][c - 'A'] = v;}int get(int r, char c) {if (m.count({r, c})) return sum(r, c, m[{r, c}]);return mat[r - 1][c - 'A'];}int sum(int r, char c, vector<string> strs) {int res = 0;for (string str : strs) {auto found = str.find_last_of(":");if (found == string::npos) {char y = str[0];int x = stoi(str.substr(1));res += get(x, y);} else {int x1 = stoi(str.substr(1, (int)found - 1)), y1 = str[0] - 'A';int x2 = stoi(str.substr(found + 2)), y2 = str[found + 1] - 'A';for (int i = x1; i <= x2; ++i) {for (int j = y1; j <= y2; ++j) {res += get(i, j + 'A');}}}}m[{r, c}] = strs;return res;}private:vector<vector<int>> mat;map<pair<int, char>, vector<string>> m;
};

上期推文:

LeetCode1-620题汇总,希望对你有点帮助!

LeetCode刷题实战621:任务调度器

LeetCode刷题实战622:设计循环队列

LeetCode刷题实战623:在二叉树中增加一行

LeetCode刷题实战624:数组列表中的最大距离

LeetCode刷题实战625:最小因式分解

LeetCode刷题实战626:换座位

LeetCode刷题实战627:变更性别

LeetCode刷题实战628:三个数的最大乘积

LeetCode刷题实战629:K个逆序对数组

LeetCode刷题实战630:课程表 III

​LeetCode刷题实战631:设计 Excel 求和公式相关推荐

  1. ​LeetCode刷题实战168:Excel表列名称

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  2. ​LeetCode刷题实战174:地下城游戏

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  3. ​LeetCode刷题实战179:最大数

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  4. ​LeetCode刷题实战69:x 的平方根

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  5. ​LeetCode刷题实战70:爬楼梯

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  6. ​LeetCode刷题实战81:搜索旋转排序数组 II

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  7. ​LeetCode刷题实战181: 超过经理收入的员工

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  8. ​LeetCode刷题实战355:设计推特

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

  9. ​LeetCode刷题实战623:在二叉树中增加一行

    算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试.所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 ! 今天和大家 ...

最新文章

  1. python初步学习-查看文档及数据类型转换
  2. Android之ConnectivityManager
  3. BootStrap 用法
  4. H5常用拖放事件解析
  5. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单
  6. 学习了pr后的收获_零基础如何学习PR影视剪辑以及调色?
  7. GNU Call 开源的Skype替代项目
  8. POJ 1089 Intervals 区间覆盖+ 贪心
  9. PHP实现单向链表解决约瑟夫环问题
  10. 《Java从入门到放弃》JavaSE入门篇:单元测试
  11. 【WPS】excel 使用MD5宏 windows环境
  12. mro python_Python之super与MRO
  13. python 二维码生成器_python二维码生成器
  14. python网络登录脚本_Python实现登录人人网并抓取新鲜事的方法
  15. 编译原理 3.28 课堂作业
  16. vl53l1x+stm32激光测距分析(待修改)
  17. SysML实践指南第二版(中文翻译:刘亚龙)第七章 使用模块图(BDD)建模
  18. 【论文写作】——懒人怎么进行论文排版?文献引用怎么引?图表题注怎么加?怎么一键更新全文?如何添加目录、图录、表录?
  19. root后手机银行用不了,root之后手机银行不能用
  20. 多个电商平台聚合关键字搜索接口

热门文章

  1. 健身行业需求分析与解决方案-捷径体系
  2. navigationBar相关的设置
  3. 自相矛盾的俗语及名言
  4. 呼吸机的前世与今生:呼吸机的发展历史
  5. 学习STM32(一)之芯片类型,内核架构的关系
  6. WPF中创建水晶动画效果的treeview控件
  7. shadergraph_learning_14 水晶效果
  8. 用台达PLC进行PID控制程序编写
  9. Slide 插件的实现
  10. 键盘快捷键设置与记录,附表格