算法进修Day - 2
3. 无重复字符的最长字串
难度:中等
题目要求:
给定一个字符串s,请你找出其中不含有重复字符的最长字串的长度
示例1:
输入:s = “abcabcbb”
输出:3
解释:因为无重复字符的最长字串是“abc”,所以其长度为 3
示例2:
输入:s = “bbbbb”
输出:1
解释:因为无重复字符的最长子串是“b“,所以其长度为 1
示例3:
输入:s = “pwwkew”
输出:3
解释:因为无重复字符的最长子串是”wke",所以其长度为3
注意:答案必须是子串的长度,“pwke"是一个子序列,不是子串
题解
最开始的想法:将字符串s转换成char的字符组,然后对数组进行遍历,利用for循环来达到校验的目的
犯的错误:时间复杂度过高,导致编译不通过
修改过后的方法:定义哈希集合,记录每一个字符是否出现过,然后根据两个指针left,right的移动来对整个字符串来进行窗口移动
修改后的代码
public static int LengthOfLongestSubstring(string s)
{
HashSet<char> letter = new HashSet<char>();
int left = 0, right = 0;
int length = s.Length;
int count = 0, max = 0;
while (right < length)
{
if (!letter.Contains(s[right]))
{
letter.Add(s[right]);
right++;
count++;
}
else
{
letter.Remove(s[left]);
left++;
count--;
}
max = Math.Max(max, count);
}
return max;
}
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.5
题解
最开始的想法为将两个数组合并到一个List表中,通过Sort来对它进行排序,并获得两个数组的长度的和len,如果和为奇数就可以直接返回List中的len / 2的值,如果为偶数,就返回List中len / 2和len / 2 + 1的和的平均值
想法代码
public static double FindMedianSortedArrays(int[] nums1, int[] nums2)
{
int m = nums1.Length;
int n = nums2.Length;
int len = m + n;
var resultIndex = len / 2;
List<int> list = new List<int>(nums1);
list.AddRange(nums2);
list.Sort();
if (len % 2 == 0)
{
return (list[resultIndex - 1] + list[resultIndex]) / 2.0;
}
else
{
return list[resultIndex];
}
}