# 两数之和

## 思路：

``````class Solution {

public:
vector<int> twoSum(vector<int>& nums, int target) {

vector<int> res;
int len = nums.size();
for (int i=0; i<len; ++i) {

for (int j = i+1; j<len; ++j) {

if((nums[i] + nums[j]) == target){

res.push_back(i);
res.push_back(j);
return res;
}
}
}
return res;
}
};
``````

## 哈希表解法

``````class Solution {

public:
vector<int> twoSum(vector<int>& nums, int target) {

unordered_map<int, int> hashtable;
for (int i = 0; i < nums.size(); ++i) {

auto it = hashtable.find(target - nums[i]);
if (it != hashtable.end()) {

return {
it->second, i};
}
hashtable[nums[i]] = i;
}
return {
};
}
};
``````

# 两数相加

## 思路

``````/**
* struct ListNode {
*     int val;
*     ListNode *next;
*     ListNode() : val(0), next(nullptr) {}
*     ListNode(int x) : val(x), next(nullptr) {}
*     ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {

public:
ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {

ListNode *l3 = new ListNode(0);
ListNode *p = l3;
int temp = 0;
while(l1 && l2) {

p->next = new ListNode((temp + l1->val + l2->val) % 10);
temp = (temp + l1->val + l2->val) / 10;
p = p->next;
l1 = l1->next;
l2 = l2->next;
}
if(l1==NULL) l1=l2;
while(l1) {

p->next = new ListNode((temp + l1->val) % 10);
temp = (temp + l1->val) / 10;
p = p->next;
l1 = l1->next;
}
if(temp) {

p->next = new ListNode(1);
}
return l3->next;
}
};
``````

ps：为啥实例中别人的代码明明运行时长挺短，但我一运行就特慢，还没有我的运行快。。还有内存消耗也是

# 无重复字符的最长子串

## 思路

``````class Solution {

public:
int lengthOfLongestSubstring(string s) {

int back=0,front=0;
int maxlength=0;
for(;front<s.size();front++){

for(int i=back;i<front;i++){

if(s[front]==s[i])
{

back=i+1;
break;
}
}
maxlength=max(front-back+1,maxlength);
}
return maxlength;
}
};
``````

## 滑动窗口

``````class Solution {

public:
int lengthOfLongestSubstring(string s) {

// 哈希集合，记录每个字符是否出现过
unordered_set<char> occ;
int n = s.size();
// 右指针，初始值为 -1，相当于我们在字符串的左边界的左侧，还没有开始移动
int rk = -1, ans = 0;
// 枚举左指针的位置，初始值隐性地表示为 -1
for (int i = 0; i < n; ++i) {

if (i != 0) {

// 左指针向右移动一格，移除一个字符
occ.erase(s[i - 1]);
}
while (rk + 1 < n && !occ.count(s[rk + 1])) {

// 不断地移动右指针
occ.insert(s[rk + 1]);
++rk;
}
// 第 i 到 rk 个字符是一个极长的无重复字符子串
ans = max(ans, rk - i + 1);
}
return ans;
}
};

``````