611. 有效三角形的个数 AND 3. 无重复字符的最长子串

370 阅读2分钟

这是我参与8月更文挑战的第4天,活动详情查看:8月更文挑战

611. 有效三角形的个数

给定一个包含非负整数的数组,你的任务是统计其中可以组成三角形三条边的三元组个数。

示例 1:

输入: [2,2,3,4] 输出: 3 解释: 有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 注意:

数组长度不超过1000。 数组里整数的范围为 [0, 1000]。

解题思路

  1. 构成三角形的条件是最长边小于其余两边之和,因此我们首先可以枚举最长边a和次长边b,我们就可以得出组成三角形的最小边长为a-b+1
  2. 通过二分法我们可以查找出最小边长所在的位置,大于最小边长的都是满足题意的,累加到结果当中去

代码

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维护窗口内的字母种类

  1. 枚举右边界,将右边界元素加入窗口,如果set里面包含了右边界字母,说明窗口内存在重复元素,因此我们需要不断移动左边界,直到找到重复元素,将这个重复元素剔除出来,我们才可以把右边界加入窗口,这时的窗口就是一个合法的窗口
  2. 对于所有合法的窗口,找出最大的长度

代码

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;

    }
}