3. 无重复字符的最长子串 4. 寻找两个正序数组的中位数 java

Posted 可持续化发展

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了3. 无重复字符的最长子串 4. 寻找两个正序数组的中位数 java相关的知识,希望对你有一定的参考价值。

3. 无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: s = "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
示例 4:

输入: s = ""
输出: 0

给一个序列,找答案。考虑怎么把所有情况枚举到。

双指针(索引)问题,要看单调性。所谓的单调性,指 双指针 单向移动。本题中为 j 和 i 都是往右边移动。

 j i 之间是此时最长无重复字符子串。之后 i 再往右移动。

有反证法可知  j` 只能为 j 或者出现在 j 的右边。每个指针只会从左往右走,走 n 次。 O(n)

 用 hashmap来维护 ij 子串中每个字符出现的次数。

 

import java.util.HashMap;
import java.util.Map;
public class Solution {
    public int lengthOfLongestSubstring(String s) {
        //map <字符串s中的字符,该字符在ij子串中出现的次数>
        Map<Character, Integer> map = new HashMap<>();
        //res 记录 曾经扫描到的最长子串的长度
        int res = 0;
        //i,j 相当于双指针,i到j 之间维护的是 无重复最长子串
        //先移i,后移j 。j在左,i在右。 ij子串
        for(int i = 0, j = 0; i < s.length(); i++){
            char a = s.charAt(i);
            if(map.containsKey(a)){
                map.put(a, map.get(a)+1);
            }else{
                map.put(a, 1);
            }
            /**
             * 当put进来后,发现ij子串中当前字符 a=s.charAt(i) 重复了,
             * 即 map中当前字符对应的value 大于1。put进来后,如果有重复字符,肯定是 a=s.charAt(i) 重复了。
             * 就需要重新调整ij之间的子串。
             * 调整方法为:
             * 移动j指针,逐个给map中对应字符的出现次数 -1,直到当前重复字符的出现次数为 1.
             * map的字符出现的次数为0,代表 ij子串中没有这个字符。
             */
            while(map.get(a) > 1){
                char b = s.charAt(j++);
                map.put(b, map.get(b) -1);
            }
            //更新res的值
            res = Math.max(res, i-j +1);
        }
        return res;
    }
}

4. 寻找两个正序数组的中位数

给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。

示例 1:

输入:nums1 = [1,3], nums2 = [2]
输出:2.00000
解释:合并数组 = [1,2,3] ,中位数 2
示例 2:

输入:nums1 = [1,2], nums2 = [3,4]
输出:2.50000
解释:合并数组 = [1,2,3,4] ,中位数 (2 + 3) / 2 = 2.5
示例 3:

输入:nums1 = [0,0], nums2 = [0,0]
输出:0.00000
示例 4:

输入:nums1 = [], nums2 = [1]
输出:1.00000
示例 5:

输入:nums1 = [2], nums2 = []
输出:2.00000

 

以上是关于3. 无重复字符的最长子串 4. 寻找两个正序数组的中位数 java的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题模版:1 - 10

代码题(56)— 最长重复子串无重复字符的最长子串

#leetcode刷题之路3-无重复字符的最长子串

Java:LeetCode题目1~5试做

leetcode的Hot100系列--3. 无重复字符的最长子串--滑动窗口

3. [数组][滑动窗口]无重复字符的最长子串