(其一)题目来源:
leetcode 11.盛最多水的容器:https://leetcode.cn/problems/container-with-most-water/
思想:双指针:
- 首先,要想盛水最多,那么就要使得容器的面积最大,而面积的表达式为area = bottleHeight * width,其中width为前指针和后指针之间差值的绝对值,而bottleHeight为两个指针所指容器的左右两边最短的一个边(木桶效应😶🌫️)。
- 有了这个思路,我们就在每一次移动指针的时候来计算出新的area来和旧的area比较,如果新的area较大,area就是目前较大的值,否则不变。
- 那么我们何时移动指针呢:我们在计算出每一次area后比较前后指针各自所指容器两边的数值,我们移动较短的边(前指针的话就后移,后指针的话则前移),因为我们总是想赌一赌移动指针后所指向的边会不会是更长的边。可能会有人问,为什么不移动较高的边:我们移动较高的边,就算指针的下一位所指向的边更长,因为木桶效应,我们接的水反而会更少(宽变短,高不变),所以我们要移动较短的边。
- 最后,附上题解:
执行用时:3 ms, 在所有 Java 提交中击败了92.44% 的用户
内存消耗:51 MB, 在所有 Java 提交中击败了97.65% 的用户
通过测试用例:60 / 60
class Solution {
public int maxArea(int[] height) {
int first = 0;
int last = height.length-1;
int area=0;
int bottleHeight;
int width;
while(true){
if(first>=last){
return area;
}
width = last-first;
bottleHeight = height[last]>height[first]?height[first]:height[last];
area = width*bottleHeight>area?width*bottleHeight:area;
if(height[last]>height[first]){
first++;
}
else{
last--;
}
}
}
}
如有更好的题解,欢迎评论哦!
(其二)题目来源:
leetcode 3.无重复字符的最长字串 https://leetcode.cn/problems/longest-substring-without-repeating-characters/
思想:双指针(滑动窗口)
滑动窗口是双指针中的一种类型,这题刚开始解出来了,用了暴力+双指针的思想,但是用了24ms(属实是创世奇才😶🌫️),因为写的不太好,去看了题解,有一位大佬的思路太牛皮了,我刚开始还没看明白,看着看着才体会到其中的妙处,但是我用这种思路写了好久总是有几个是错误的,于是我决定暂且搁置起来,等到明天后天的再去写
先把大佬的题解放上来:
执行用时:1 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗:41.5 MB, 在所有 Java 提交中击败了58.49% 的用户
通过测试用例:987 / 987
class Solution {
public int lengthOfLongestSubstring(String s) {
// 记录字符上一次出现的位置
int[] last = new int[128];
for(int i = 0; i < 128; i++) {
last[i] = -1;
}
int n = s.length();
int res = 0;
int start = 0; // 窗口开始位置
for(int i = 0; i < n; i++) {
int index = s.charAt(i);
start = Math.max(start, last[index] + 1);
res = Math.max(res, i - start + 1);
last[index] = i;
}
return res;
}
}