小哆啦解题记:拯救水世界大作战
小哆啦开始刷力扣的第二十三天
危机降临水世界
嘿呀,咱这有个神秘的水世界,里面矗立着好多好多奇怪的垂线。这些垂线呢,就像是水世界的守护神,可最近啊,水世界遇到大麻烦啦!守护神们得选出两位代表,和地面(也就是 x 轴)一起组成一个大容器,要装下尽可能多的水,不然水世界就要干涸啦!
这时候,聪明勇敢的小哆啦闪亮登场,拍拍胸脯说:“别怕别怕,有我小哆啦在,肯定能找出那对最佳组合,拯救咱们的水世界!”
小哆啦的 “蛮干” 计划
小哆啦挠挠头,想出了一个简单直接的办法。他决定像个勤劳的小蚂蚁一样,把每两条垂线都配对试一遍。于是,他敲出了这样一段代码:
function maxArea(height: number[]): number {
let y = 0
let max = 0;
for (let i = 0; i < height.length; i++) {
for (let j = i + 1; j < height.length; j++) {
y = height[j] > height[i] ? height[i] : height[j]
max = max >= y * (j - i ) ? max : y * (j - i )
}
}
return max
};
小哆啦一边敲代码一边念叨:“嘿嘿,我把每一对垂线都看看,找出短的那条,就像找到水桶的短板,然后算出它们能装多少水,再不断更新最大水量。我这办法多靠谱啊!”
可是呢,这代码跑起来就像个慢吞吞的乌龟。垂线数量少的时候还好,可水世界的垂线越来越多,这代码就开始喘粗气,跑不动啦!小哆啦急得直跺脚:“哎呀呀,这可咋办,难道我的计划要泡汤啦?”
小智老师来救场
就在小哆啦愁眉苦脸的时候,智慧超群的小智老师飘然而至。小智老师笑着说:“小哆啦呀,你这方法虽然老实,但是太笨啦!你想想,容器装水多少是由短板决定的,咱们为啥不换个思路呢?”
小哆啦眼睛亮晶晶地看着小智老师:“老师,快教教我,有啥好办法?”
小智老师神秘兮兮地说:“咱们可以用双指针法,就像两个超级飞侠,一个从左边出发,一个从右边出发,一起去寻找最大水量。”
双指针 “飞侠” 出击
小哆啦听了小智老师的话,赶紧动手修改代码:
typescript
function maxArea(height: number[]): number {
let left = 0;
let right = height.length - 1;
let max = 0;
while (left < right) {
const area = Math.min(height[left], height[right]) * (right - left);
max = Math.max(max, area);
if (height[left] < height[right]) {
left++;
} else {
right--;
}
}
return max;
}
小哆啦兴奋地解释:“你看哈,左指针飞侠和右指针飞侠一开始站在两边,它们先算出当前能装多少水,更新最大水量。然后比较一下它们脚下垂线的高度,谁矮谁就往中间飞。因为只有移动矮的,才有可能找到更高的垂线,让容器装更多的水!”
这一次,代码就像装上了火箭发动机,飞快地算出了结果。小哆啦高兴得一蹦三尺高:“哇塞,小智老师,你这方法太神啦!咱们成功拯救水世界咯!”
水世界的狂欢
水世界里的居民们看到找到了能装最多水的容器,都欢呼起来,举行了一场盛大的狂欢派对。小哆啦也明白了,遇到问题不能只知道蛮干,要开动脑筋,用更巧妙的方法解决。从此,小哆啦和小智老师在算法的世界里继续冒险,准备迎接更多有趣的挑战啦!