双指针二题

(其一)题目来源:

leetcode 11.盛最多水的容器:https://leetcode.cn/problems/container-with-most-water/

思想:双指针:

  1. 首先,要想盛水最多,那么就要使得容器的面积最大,而面积的表达式为area = bottleHeight * width,其中width为前指针和后指针之间差值的绝对值,而bottleHeight为两个指针所指容器的左右两边最短的一个边(木桶效应😶‍🌫️)。
  2. 有了这个思路,我们就在每一次移动指针的时候来计算出新的area来和旧的area比较,如果新的area较大,area就是目前较大的值,否则不变。
  3. 那么我们何时移动指针呢:我们在计算出每一次area后比较前后指针各自所指容器两边的数值,我们移动较短的边(前指针的话就后移,后指针的话则前移),因为我们总是想赌一赌移动指针后所指向的边会不会是更长的边。可能会有人问,为什么不移动较高的边:我们移动较高的边,就算指针的下一位所指向的边更长,因为木桶效应,我们接的水反而会更少(宽变短,高不变),所以我们要移动较短的边。
  4. 最后,附上题解:
    执行用时: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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值