将数组中所有的数插入到一个unordered_map(哈希表)中, 在插入之前在哈希表中查找一下, 是否存在一个值等于 target - nums[i] , 如果有就直接返回.
class Solution {
public:
vector<int> twoSum(vector<int>& nums, int target) {
unordered_map<int, int> heap;
for (int i = 0; i < nums.size(); ++ i)
{
int r = target - nums[i];
if (heap.count(r)) return { heap[r], i };
heap[nums[i]] = i;
}
return {};
}
};
class Solution {
public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
ListNode *newList = new ListNode(-1);
ListNode *tail = newList;
int tmp = 0;
while (l1 || l2 || tmp)
{
if (l1)
{
tmp += l1->val;
l1 = l1->next;
}
if (l2)
{
tmp += l2->val;
l2 = l2->next;
}
tail = tail->next = new ListNode(tmp % 10);
tmp /= 10;
}
tail = newList->next;
delete newList;
return tail;
}
};
这道题目这里分享两种解法, 第一种就是暴力枚举, 两层for循环, 去看从每一个位置开始未出现相同字符的子字符串就行.
第二种就是双指针, 滑动窗口, 我们先看算法的原理

当我们扫描到 i 的时候, 假设 j 位置是 到达 i 位置, 最长的无重复的子串, 那么当 i 向后走一步 到 i + 1的时候, 最长的子串仍然是 从 j 位置到 i + 1 位置, 为什么不会出现 j - 1或者之前的位置呢?
因为我们之前的假设, j 位置是 到达 i 位置, 最长的无重复的子串, 那么当 i 向后走一步 到 i + 1 如果出现在了 j - 1或者更之前的位置, 那么必然 j 位置不是 到达 i 位置的最长的无重复的子串, 而是从j - 1或者更之前的位置是最长的无重复的子串.

class Solution {
public:
int lengthOfLongestSubstring(string s) {
unordered_map<char, int> heap;
int res = 0;
for (int i = 0, j = 0; i < s.size(); ++i)
{
heap[s[i]] ++;
while (heap[s[i]] > 1) heap[s[j ++]] --;
res = max(res, i - j + 1);
}
return res;
}
};
1318






