3. 无重复字符的最长子串
题目
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
题解
这题在前面 剑指offer专题 已经讲解过了,可参考前面解释的两种方法,动态规划 和 滑动窗口。
这里就简单描述一下滑动窗口过程:
用两个指针 i 和 j ,和哈希表
-
初始化:i = 0,指向第一个元素,j = -1
-
移动策略:当元素无重复,i 一直向后移动,并将扫描到的元素放入 map 中,同时记录最大值
max = Math.max(max, i - j);
当元素有重复,则改变左指针 j 的值,改变其位置为重复元素的上一个位置,即:j = Math.max(j, map.get(c));
。这里说明为什么需要对 j 和 map.get© 取最大值,是因为窗口滑动到后面了,不能再退回到之前,有重复元素取出来的值可能比当前窗口左边界还小,这是不允许的,如:abba,可自己推一下。
代码
class Solution {
public int lengthOfLongestSubstring(String s) {
int max = 0;
int j = -1;
Map<Character, Integer> map = new HashMap<>();
for(int i = 0;i < s.length();i++){
char c = s.charAt(i);
if(map.containsKey(c)){
j = Math.max(j, map.get(c));
}
map.put(c, i);
max = Math.max(max, i - j);
}
return max;
}
}
4. 寻找两个正序数组的中位数
题目
给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
算法的时间复杂度应该为 O(log (m+n)) 。
题解
这道题感觉没什么好解释的,就是对两个数组进行排序即可,然后取排序好数据中位数。
代码
class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int len1 = nums1.length;
int len2 = nums2.length;
int len = len1 + len2;
int[] mergeArray = new int[len1 + len2];
int i = 0,j = 0,k = 0;
while(len1 > 0 && len2 > 0){
if(nums1[i] > nums2[j]){
mergeArray[k++] = nums2[j++];
len2--;
}else{
mergeArray[k++] = nums1[i++];
len1--;
}
}
while(len1 > 0){
mergeArray[k++] = nums1[i++];
len1--;
}
while(len2 > 0){
mergeArray[k++] = nums2[j++];
len2--;
}
if(len % 2 == 1){
return mergeArray[len / 2];
}else {
return (mergeArray[len/2 - 1] + mergeArray[len / 2]) / 2.0;
}
}
}