leetcode每日一题
今天是我在力扣做题的第二天,也是第一次做每日一题,就,写得挺暴力。因为目前为止,我都是“能解出来就万事大吉”的态度,思路没规划就开始敲代码,执行几次改几次。如果有的题写得乱些,过两天我也不知道自己写了什么鬼。
解完后发现这题标的难度是困难,有点高兴(_)。不过我还不了解力扣是怎么评难度的。
题目是这样的:
- 接雨水
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。 感谢 Marcos 贡献此图。
示例:
输入: [0,1,0,2,1,0,1,3,2,1,2,1]
输出: 6来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/trapping-rain-water
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我最开始的做法:
class Solution {
public:
int trap(vector<int>& height) {
int q=0;
int sum=0;
for(int i=1;i<height.size();i++){
if(height[i]>height[i-1]){
for(int j=i-1;j>q;j--){
int t=min(height[i],height[q])-height[j];
if(t>0){
sum+=t;height[j]=min(height[i],height[q]);
}
}
}
if(height[i]>=height[q]){
q=i;
}
}
return sum;
}
};
我的思路是:只有柱子高度上升+左边有柱子凸出时需要考虑填充雨水的问题,为了避免重复在一个地方填充雨水,每次填充雨水后的相应空地的高度要进行改变,把雨水的存储高度看成是柱子的高度。
我在看大家的题解前,决定自己尝试改进运行时间。在脑内臆想中,有两个索引巴拉巴拉……结果超出了时间限制。好吧,我还是看看别人的题解吧。
看到了官方的栈解,才恍然反应过来这不就是个栈嘛!/(ㄒoㄒ)/~~
官方也给出了一个双索引答案 时间复杂度O(n),空间复杂度O(1)的。
https://leetcode-cn.com/problems/trapping-rain-water/solution/jie-yu-shui-by-leetcode/
一个以高度最大值为分界线的解法也好棒啊。
先确定最高柱子,这个柱子的左边的柱子就有了右面的最高依凭,接下来只要从左至右遍历时边找彼时柱子左边的最高依凭,边记录水位(彼时左边最高依凭-彼时遍历到的柱子的高度)就行了。右边也一样。
页面变灰方法
今天是一个特殊的日子。
看到了一篇公众号文: https://mp.weixin.qq.com/s/_DA0Lm6nDrLtw6YRpjCWPA
html {
-webkit-filter: grayscale(100%);
-moz-filter: grayscale(100%);
-ms-filter: grayscale(100%);
-o-filter: grayscale(100%);
filter: grayscale(100%);
filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=1);
}
filter
CSS 属性将模糊或颜色偏移等图形效果应用于元素。滤镜通常用于调整图像,背景和边框的渲染。
算法书学习
今天看了《挑战程序设计竞赛》的迷你版(不到一百页)的开头,收到了两个重要信息。
首先是时间复杂度的问题。我虽然知道解题要考虑算法的复杂度优化,但不知道在竞赛中复杂度怎样才算太高。此书列了一张表。
另外就是,这本书用题和代码演示如何降低复杂度,例子非常好。题目是抽四张牌,抽出的牌代表的数字加起来要等于某个数。
记住几个函数
max_element(arr[],arr[]+size) 查找容器中的最大值 min_element(arr[],arr[]+size)
binary_search(arr[],arr[]+size,indx) 二分查找
lower_search(arr[],arr[]+size,indx) 查找第一个大于或者等于某个元素的位置 有就返回索引值 没有就返回最后一个元素的下一个位置(越界)
upper_search(arr[],arr[]+size,indx) 查找第一个大于某个元素的位置