先来回顾一下昨天的面试题及答案:
「盛最多水的容器」(Container With Most Water)
题目描述: 给定 n 个非负整数 a1,a2,...,an,代表坐标中的 n 个点 (i, ai)。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
解题思路: 这道题可以使用双指针的方法来解决。我们初始化左指针指向数组的起始位置,右指针指向数组的结束位置。然后,计算当前左右指针所指的两条垂直线构成的容器的面积。面积的计算公式是:面积 = (右指针 - 左指针) * min(左指针的高度, 右指针的高度)。接下来,我们移动指针的原则是:每次移动高度较小的指针,这样才有可能找到更高的垂直线,从而使容器的面积更大。我们不断移动指针,并更新最大的面积值,直到左右指针相遇。
算法实现(JavaScript):
function maxArea(height) {let maxArea = 0;let left = 0;let right = height.length - 1;while (left < right) {const minHeight = Math.min(height[left], height[right]);const area = (right - left) * minHeight;maxArea = Math.max(maxArea, area);if (height[left] < height[right]) {left++;} else {right--;}}return maxArea;
}
时间复杂度分析: 双指针移动的过程中,我们每次向内移动一个指针,直到左右指针相遇。因此,每个指针最多移动 n-1 次。所以总的时间复杂度为 O(n),其中 n 是数组的长度。
空间复杂度分析: 我们只使用了几个变量来存储指针的位置和当前的最大面积值,没有使用额外的数据结构。所以空间复杂度是 O(1)。
这道题目的关键在于理解如何移动指针来获取更大的面积,并利用双指针的方法将时间复杂度优化到 O(n)。
2023年5月30日
「两数之和」(Two Sum)。
题目描述: 给定一个整数数组 nums
和一个目标值 target
,请在数组中找出两个数,它们的和等于目标值,并返回这两个数的索引。假设每种输入只会对应一个答案,而且同一个元素不能使用两次。
你可以按任意顺序返回答案。
上面问题的答案会在第二天的公众号推文中公布,大家可以关注公众号:程序员每日三问,第一时间获得推送内容。
学习不打烊,充电加油只为遇到更好的自己,每天早上9点纯手工发布面试题(死磕自己,愉悦大家) 希望大家在这浮夸的程序员圈里保持冷静,每天坚持花20分钟来学习与思考,在千变万化,类库层出不穷的今天,不要等到找工作时才狂刷题,提倡每日学习。