Java刷题笔记(三)
一.简介
本系列是用来分享在洛谷,LeetCode的有趣的题目,使用Java编写且代码解释以注释为主。
本篇涉及:哈希表,双指针
二.题目
1. 无重复字符的最长子串
题目描述:
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串 的长度。
输入输出样例:
示例 1:
1
2
3 >输入: s = "abcabcbb"
>输出: 3
>解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
1
2
3 输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 3:
1
2
3
4 输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s
由英文字母、数字、符号和空格组成
方法一:滑动窗口
我们使用两个指针表示字符串中的某个子串(或窗口)的左右边界
在每一步的操作中,我们会将左指针向右移动一格,表示 我们开始枚举下一个字符作为起始位置
然后我们可以不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符(使用哈希表)。
在移动结束后,这个子串就对应着 以左指针开始的,不包含重复字符的最长子串。我们记录下这个子串的长度;
将左指针的位置指向右指针的位置,右指针继续右移开始下一轮查找。
在枚举结束后,我们找到的最长的子串的长度即为答案。
1 | /** |
2. 盛最多水的容器
题目描述:
给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。
说明:你不能倾斜容器。
输入输出样例:
示例 1:
1
2
3 >输入:[1,8,6,2,5,4,8,3,7]
>输出:49
>解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。
示例 2:
1
2 输入:height = [1,1]
输出:1
提示:
n == height.length
2 <= n <= 105
0 <= height[i] <= 104
方法一:双指针
设两指针 i , j ,指向的水槽板高度分别为 h[i] , h[j] ,此状态下水槽面积为 S(i, j) 。由于可容纳水的高度由两板中的 短板 决定,因此可得如下 面积公式 : S(i, j) = min(h[i], h[j]) × (j - i)
在每个状态下,无论长板或短板向中间收窄一格,都会导致水槽 底边宽度 -1−1 变短:
- 若向内 移动短板 ,水槽的短板 min(h[i], h[j]) 可能变大,因此下个水槽的面积 可能增大 。
- 若向内 移动长板 ,水槽的短板 min(h[i], h[j]) 不变或变小,因此下个水槽的面积 一定变小 。
因此,初始化双指针分列水槽左右两端,循环每轮将短板向内移动一格,并更新面积最大值,直到两指针相遇时跳出;即可获得最大面积。
1 | /** |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 magic-H!
评论