这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战
611. 有效三角形的个数
给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。
示例 1:
输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 注意:
数组长度不超过1000。 数组里整数的范围为 [0, 1000]。
解题思路
- 构成三角形的条件是最长边小于其余两边之和,因此我们首先可以枚举最长边a和次长边b,我们就可以得出组成三角形的最小边长为a-b+1
- 通过二分法我们可以查找出最小边长所在的位置,大于最小边长的都是满足题意的,累加到结果当中去
代码
class Solution {
public int triangleNumber(int[] nums) {
int n=nums.length,res=0;
Arrays.sort(nums);
for (int i=n-1;i>=2;i--)
{
for (int j=i-1;j>=1;j--)
{
int tar=nums[i]-nums[j]+1;
int l=0,r=j-1;
while (l<=r)
{
int mid=(r-l)/2+l;
if (nums[mid]>=tar)
r=mid-1;
else l=mid+1;
}
res+=j-l;
}
}
return res;
}
}
3. 无重复字符的最长子串
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
- 示例 1:
输入: s = "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
- 示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
- 示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
- 示例 4:
输入: s = "" 输出: 0
解题思路
使用滑动窗口维护一个区间,区间内无重复字母,使用set维护窗口内的字母种类
- 枚举右边界,将右边界元素加入窗口,如果set里面包含了右边界字母,说明窗口内存在重复元素,因此我们需要不断移动左边界,直到找到重复元素,将这个重复元素剔除出来,我们才可以把右边界加入窗口,这时的窗口就是一个合法的窗口
- 对于所有合法的窗口,找出最大的长度
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
Set<Character> set=new HashSet<>();
int l=0,r=0,n=s.length(),max=0;
while (r<n)
{
if (set.contains(s.charAt(r))) {
while (s.charAt(l)!=s.charAt(r))
{
set.remove(s.charAt(l));
l++;
}
l++;
}
set.add(s.charAt(r));
r++;
max=Math.max(max,r-l);
}
return max;
}
}