RTTO HOT 100

HOT 100

1.两数之和(e)

使用map<int,int>构造哈希表;使用map的count方法寻找target-nums[i]是否存在,存在的话就存入res相关index,否则存入nums[i]的索引位置。

2.两数相加(m)

遍历l1,l2计算sum和进位,尾插法更新tail,注意此时的tail是逆序的,需要一开始使用head指向初始节点作为结果返回。

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

滑动窗口法,使用start,end,使用end进行遍历整个字符串,记录每次end的所指向的字符记为tmp,子循环从start遍历到end,若发现有与tmp相等的符号,则发生子串重复,更新start位置到当前index下一位,计算当前子串length,并退出子循环。动态更新res和length的最大值作为当前结果。

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

二分法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
int n = nums1.size();
int m = nums2.size();
int left = (n + m + 1) / 2;
int right = (n + m + 2) / 2;
return (getKth(nums1, 0, n - 1, nums2, 0, m - 1, left) + getKth(nums1, 0, n - 1, nums2, 0, m - 1, right)) * 0.5;
}

int getKth(vector<int>& nums1, int start1, int end1, vector<int>& nums2, int start2, int end2, int k){
int len1 = end1 - start1 + 1;
int len2 = end2 - start2 + 1;

if(len1 > len2) return getKth(nums2, start2, end2, nums1, start1, end1, k);
if (len1 == 0) return nums2[start2 + k - 1];

if(k == 1) return min(nums1[start1], nums2[start2]);

int i = start1 + min(len1, k / 2) - 1;
int j = start2 + min(len2, k / 2) - 1;

if(nums1[i] > nums2[j]){
return getKth(nums1, start1, end1, nums2, j + 1, end2, k - (j - start2 + 1));
}
else{
return getKth(nums1, i + 1, end1, nums2, start2, end2, k - (i - start1 + 1));
}
}
};