之前都是用java来写代码题,因为之前只能用java和python提交,就想着练一练java,今天就用c++来写题目。
第一道题目如下:
开始,没理解正确题目的意思,想着就是字符串相加的问题,“加1”k次就是“加k”,后来看了例子发现自己想错了,重新理解了题意。
我的想法就是k次循环,每次判断一次字符串,每次判断字符串的时候,对每一位进行判断,小于‘9’,就加1,否则,直接变成“10”。通过这一个if语句的判断得到结果。而且观察到题目中k的取值范围小于等于100,所以一般不会有超时的可能。
写完发现要求输出的结果是int类型的,发现题目中要求最终结果对1000000007取模后的值。这一步的时候,我就没想出来怎么做了,因为字符串转成数字对于int和long long类型,好像都太大了。这时候,问豆包MarsCode AI,给出了完美的解答。
通过了每取一位就乘10相加的方式得到解决。最后这道题就成功解决了。
第二道题目如下:
这道题就很简单了,首先可以从例子里面观察到,不能造出合理的桥梁,就输出-1,所以先进行一个判断abs(a-b)<=(n-1),并且n>=2,只要不满足哦上述任意一种情况,那就是不合理的桥,输出-1。
要想达到最高高度,那就是一个先上后下的一个造型,假设最高高度为T,那么(T-a)+(T-b)<=(n-1),转换过来T<=(a+b+n-1)/2,利用int的去小数属性,就能得到最后的答案。
第三道题目如下:
这个题目所定义的矩阵的最大面积是h[i]到h[i+k-1]的最小值,乘上k。可能第一眼,会把这个问题想着用双指针的方式来解决,这样每次就要考虑两个指针之间的最小值,可能可以用优先级队列来完成。但是,还是很难想出这个问题的解法。
所以,可以换一个思路去想这个问题,直接确定的找到h[i]到h[i+k-1]的最小值,所以,只要找到了这个最小值,就去确定i和k就行了。所以对于每个元素,考虑左边距离最近的大于它的值的数的位置和右边距离最近的大于它的值的数的位置就可以确定出一个最大的矩阵面积了。
在这种思路确定后,豆包MarsCode AI给出了进一步优化的方案,使用单调栈来高效地找到每个元素左边和右边距离最近的大于它的值的位置。最后的实现如下: