力扣打卡——接雨水、无重复字符的最长子串

42. 接雨水 - 力扣(LeetCode)

思路:当前列雨水面积:min(左边柱子的最高高度,记录右边柱子的最高高度) - 当前柱子高度。

为了得到两边的最高高度,使用了双指针来遍历,每到一个柱子都向两边遍历一遍,这其实是有重复计算的。我们把每一个位置的左边最高高度记录在一个数组上(maxLeft),右边最高高度记录在一个数组上(maxRight),这样就避免了重复计算。

当前位置,左边的最高高度是前一个位置的左边最高高度和本高度的最大值。

即从左向右遍历:maxLefti = max(heighti, maxLefti - 1);

右向左遍历:maxRighti = max(heighti, maxRighti + 1);

复制代码
class Solution {
    public int trap(int[] height) {
        //使用双指针进行做
        int length=height.length;
        if(length<=2) return 0;

        int [] leftMax=new int[length];
        int [] rigthMax=new int[length];
        // 记录每个柱子左边柱子最大高度
        leftMax[0] =height[0];
        for(int i=1;i<length;i++){
          leftMax[i]=Math.max(height[i],leftMax[i-1]);
        }
        
        // 记录每个柱子右边柱子最大高度
        rigthMax[length-1]=height[length-1];
        for(int j=length-2;j>=0;j--){
            rigthMax[j]=Math.max(height[j],rigthMax[j+1]);
        }
          // 求和
        int sum=0;
        for(int i=0;i<length;i++){
            int count=Math.min(leftMax[i],rigthMax[i])-height[i];
            sum+=count;
        }
        return sum;

    }
}

3. 无重复字符的最长子串 - 力扣(LeetCode)

可以把"窗口"想象成字符串中满足条件(无重复字符)的一段区间 [left, right]

  1. 我们使用两个指针 leftright 来表示窗口的左右边界,初始都为 0。

  2. right 指针主动向右遍历字符串,将新字符加入窗口。

  3. 如果加入的新字符在窗口中已经存在 (即出现了重复),我们就需要收缩窗口:将 left 指针向右移动,直到窗口内不再包含该重复字符为止。

  4. 在这个过程中,每次窗口处于"无重复"状态时,我们就记录一下当前窗口的长度 right - left + 1,并更新最大长度。

    class Solution {
    public int lengthOfLongestSubstring(String s) {
    // 记录字符及其最近一次出现的索引
    HashMap<Character, Integer> map = new HashMap<>();
    int left=0;
    int maxLength=0;
    for(int right=0;right<s.length();right++){
    char str=s.charAt(right);
    // 如果遇到了重复字符,且该字符在当前窗口内
    if(map.containsKey(str)&&map.get(str)>=left){
    left = map.get(str) + 1;
    }
    // 将字符及当前索引放入/更新到哈希表中
    map.put(str, right);
    // 计算当前无重复子串长度,更新最大值
    maxLength=Math.max(maxLength,right-left+1);
    }
    return maxLength;
    }
    }

相关推荐
luj_17681 小时前
星火科技助力边远地区防病攻坚
c语言·开发语言·c++·经验分享·算法
geats人山人海4 小时前
数据结构第六章c语言 树的存储下二叉树的概念和存储
c语言·数据结构·算法
漂流瓶jz5 小时前
UVA-12627 奇怪的气球膨胀 题解答案代码 算法竞赛入门经典第二版
算法·图论·递归·aoapc·算法竞赛入门经典·uva·12627
jarvisuni5 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
kobesdu5 小时前
流形上的优化:SO(3)与SE(3)的广义加减法在FAST-LIO中如何简化状态估计
人工智能·算法·fastlio
白狐_7985 小时前
408 数据结构算法题 01:线性表暴力求解保分指南
java·数据结构·算法
乐观勇敢坚强的老彭6 小时前
C++信奥:开关门、开关灯问题
开发语言·c++·算法
冻柠檬飞冰走茶6 小时前
PTA基础编程题目集 7-31 字符串循环左移(C语言实现)
c语言·开发语言·数据结构·算法
Hi李耶6 小时前
【LeetCode】4-寻找两个正序数组的中位数
算法·leetcode·职场和发展
图灵机z6 小时前
【算法提高课】AcWing 1027. 方格取数 长期攻克提高课-day3(3/219)
算法