如果你时间比较紧迫,为了找工作而刷题,我建议你先刷热门推荐,一共100道题。
先刷热题 HOT 100,再刷精选 TOP 面试题,之后刷其他的题。
接下来的一段时间,我会把做的这些题做一个总结,每天在 每日一题算法群中公布题目和解法,定时推送公众号,欢迎各位关注公众号加入群聊,大家一起监督一起努力。
LeetCode 11 盛最多水的容器
给定 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。
图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49
解释:数字8 的索引为1 数字7的索引为8 故容器水的体积为 (8-1)*7=49
示例:
输入: [1,8,6,2,5,4,8,3,7]
输出: 49
暴力枚举
在这种情况下,我们将简单地考虑每、对可能出现的线段组合并找出这些情况之下的最大面积。
拿到一道算法题,我一般都会先找出暴力的做法是怎么样的。这道题目由于是计算它的矩形面积,那么相当于是我们枚举所有的起点跟终点就可以将所有的面积算出来,然后再把它的面积最大值更新
时间复杂度:O(n^2) 两层循环
空间复杂度:O(1)
public class Solution {
public int maxArea(int[] height) {
int maxarea = 0;
for (int i = 0; i < height.length; i++)
for (int j = i + 1; j < height.length; j++)
maxarea = Math.max(maxarea, Math.min(height[i], height[j]) * (j - i));
return maxarea;
}
}
双指针算法
第二种算法是采用双指针的算法,由于我们在遍历所有可能的情况的时候,总是没有把上一次的经验
转做下一次的变化一个教训
,就是说我们每次计算的时候都是基于一个全新的状况,而双指针算法就是能够基于上一次的情况,对下一次怎么走做出一个最佳的判断
这种方法背后的思路在于,两线段之间形成的区域总是会受到其中较短那条长度的限制
。此外,两线段距离越远,得到的面积就越大。
我们在由线段长度构成的数组中使用两个指针,一个放在开始,一个置于末尾。此外,我们会使用变量 maxarea 来持续存储到目前为止所获得的最大面积。在每一步中,我们会找出指针所指向的两条线段形成的区域,更新 maxarea,并将指向较短线段的指针向较长线段那端移动一步。
public int maxArea(int[] height) {
int res=0;//结果
int i=0;//起点
int j=height.length-1;//终点
while(i<j){
int water=Math.min(height[i],height[j]);//注水高度取两个值的最小值
res=Math.max(res,(j-i)*water);//更新容器的结果
if(height[i]<height[j])
//小的一方先做出改变,因为若大的一方做出改变结果必定减小,小的
//一方改变,在宽度变小的情况下长度可能会上升
i+=1;
else
j-=1;
}
return res;
}
}
时间复杂度:O(n) 一次扫描完成
空间复杂度:O(1)
LeetCode day 1 题号1、2(两数之和,两数相加)
LeetCode day 2 题号 3、4 (最长无重复子串,两个有序数组的中位数)
快来加入 每日一题算法群 吧