- 无重复字符的最长子串
给定一个字符串,找出不含有重复字符的最长子串的长度。
示例:
给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。
给定 “bbbbb” ,最长的子串就是 “b” ,长度是1。
给定 “pwwkew” ,最长子串是 “wke” ,长度是3。请注意答案必须是一个子串,”pwke” 是 子序列 而不是子串。
分析思路:
- 暴力法:取出所有的子串,校验没有重复的最大值,显然这种算法是有很多重复操作的。比如遍历abc的时候已经知道abc没有重复,后面没必要再进行这段的比对。
- 使用滑动窗口,初始窗口左值为0,右值为1,右值开始遍历字符串每个字符的同时,存入hash表,如果hash表中已经有了改字符的索引,那么久移动窗口的左值为该位置的下一个位置,继续滑动窗口,直到遍历完字符串,思路并不算复杂。时间复杂度和空间复杂度都是O(n)
代码如下:
1 | class Solution { |
- 两个排序数组的中位数
给定两个大小为 m 和 n 的有序数组 nums1 和 nums2 。
请找出这两个有序数组的中位数。要求算法的时间复杂度为 O(log (m+n)) 。
示例 1:
nums1 = [1, 3]
nums2 = [2]
中位数是 2.0
示例 2:
nums1 = [1, 2]
nums2 = [3, 4]
中位数是 (2 + 3)/2 = 2.5
分析核心思路,中位数的数学定义就是该位置左边的数和右边的数数量一致。我们抽象s1数组存在位置i,s2的数组存在位置j,s1的数组i左边的数加上s2数组j左边的数正好是两个数组总长度的一半。这样i和j就存在数学关系i+j= (m+n)/2。我们同时假设n是大于等于m的。这样我们再s1数组中搜索位置i,j的位置根据数学关系也是对应的,采用二分法搜索合适i的位置保证时间复杂度要求到O(log (m+n))
代码如下
1 | class Solution { |