Skip to content

Commit

Permalink
Update
Browse files Browse the repository at this point in the history
  • Loading branch information
youngyangyang04 committed Jun 29, 2020
1 parent bffb121 commit 18516eb
Show file tree
Hide file tree
Showing 6 changed files with 171 additions and 5 deletions.
3 changes: 3 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ LeetCode 最强题解(持续更新中):
|题目 | 类型 | 解题方法 |
|---|---| ---|
|[0000.两数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0000.两数之和.md) | 数组|**暴力** **哈希**|
|[0015.三数之和](https://github.com/youngyangyang04/leetcode/blob/master/problems/0015.三数之和.md) | 数组|**双指针** 哈希|
|[0021.合并两个有序链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0021.合并两个有序链表.md) |链表 |**模拟** |
|[0026.删除排序数组中的重复项](https://github.com/youngyangyang04/leetcode/blob/master/problems/0026.删除排序数组中的重复项.md) |数组 |**暴力** **快慢指针** |
|[0027.移除元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0027.移除元素.md) |数组 | **暴力** **快慢指针**|
Expand All @@ -20,10 +21,12 @@ LeetCode 最强题解(持续更新中):
|[0203.移除链表元素](https://github.com/youngyangyang04/leetcode/blob/master/problems/0203.移除链表元素.md) |链表 |**模拟** **虚拟头结点**|
|[0206.翻转链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0206.翻转链表.md) |链表 | **模拟** **递归**|
|[0209.长度最小的子数组](https://github.com/youngyangyang04/leetcode/blob/master/problems/0209.长度最小的子数组.md) |数组 | **暴力** **滑动窗口**|
|[0219.存在重复元素II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0219.存在重复元素II.md) | 哈希表 | **哈希** |
|[0237.删除链表中的节点](https://github.com/youngyangyang04/leetcode/blob/master/problems/0237.删除链表中的节点.md) |链表 | **原链表移除** **添加虚拟节点** 递归|
|[0349.两个数组的交集](https://github.com/youngyangyang04/leetcode/blob/master/problems/0349.两个数组的交集.md) |哈希表 |**哈希**|
|[0350.两个数组的交集II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0350.两个数组的交集II.md) |哈希表 |**哈希**|
|[0383.赎金信](https://github.com/youngyangyang04/leetcode/blob/master/problems/0383.赎金信.md) |数组 |**暴力** **字典计数**|
|[0454.四数相加II](https://github.com/youngyangyang04/leetcode/blob/master/problems/0454.四数相加II.md) |哈希表 | **哈希**|
|[0575.分糖果.md](https://github.com/youngyangyang04/leetcode/blob/master/problems/0575.分糖果.md) |哈希表 |**哈希**|
|[0705.设计哈希集合.md](https://github.com/youngyangyang04/leetcode/blob/master/problems/0705.设计哈希集合.md) |哈希表 |**模拟**|
|[0707.设计链表](https://github.com/youngyangyang04/leetcode/blob/master/problems/0707.设计链表.md) |链表 |**模拟**|
Expand Down
66 changes: 61 additions & 5 deletions problems/0015.三数之和.md
Original file line number Diff line number Diff line change
@@ -1,15 +1,71 @@
## 题目地址
https://leetcode-cn.com/problems/3sum/

## 思路

## 哈希解法
### 哈希解法

去重的过程不好处理,有很多小细节,在面试中很难想到为
去重的过程不好处理,有很多小细节,如果在面试中很难想到位,需要在oj上不断尝试

## 双指针
时间复杂度:O(n^2)

推荐使用这个方法,排序后用双指针前后操作,比较容易达到去重的目的
### 双指针

O(n^2)
推荐使用这个方法,排序后用双指针前后操作,比较容易达到去重的目的,但也有一些细节需要注意,我在如下代码详细注释了需要注意的点

时间复杂度:O(n^2)

## 代码

```
class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); i++) {
// 排序之后如果第一个元素已经大于零,那么无论如何组合都不可能凑成三元组,直接返回结果就可以了
if (nums[i] > 0) {
return result;
}
// 错误去重方法,将会漏掉-1,-1,2 这种情况
/*
if (nums[i] == nums[i + 1]) {
continue;
}
*/
// 正确去重方法
if (i > 0 && nums[i] == nums[i - 1]) {
continue;
}
int left = i + 1;
int right = nums.size() - 1;
while (right > left) {
// 去重复逻辑如果放在这里,0,0,0 的情况,可能直接导致 right<=left 了,从而漏掉了 0,0,0 这种三元组
/*
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
*/
if (nums[i] + nums[left] + nums[right] > 0) {
right--;
} else if (nums[i] + nums[left] + nums[right] < 0) {
left++;
} else {
result.push_back(vector<int>{nums[i], nums[left], nums[right]});
// 去重逻辑应该放在找到一个三元组之后
while (right > left && nums[right] == nums[right - 1]) right--;
while (right > left && nums[left] == nums[left + 1]) left++;
// 找到答案时,双指针同时收缩
right--;
left++;
}
}
}
return result;
}
};
```

> 更多精彩文章持续更新,可以微信搜索「 代码随想录」第一时间阅读,关注后有大量的学习资料和简历模板可以免费领取,本文 [GitHub](https://github.com/youngyangyang04/leetcode-master )https://github.com/youngyangyang04/leetcode-master 已经收录,欢迎star,fork,共同学习,一起进步。
9 changes: 9 additions & 0 deletions problems/0021.合并两个有序链表.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,13 @@

## 题目地址
https://leetcode-cn.com/problems/merge-two-sorted-lists/

## 思路

链表的基本操作,一下代码中有详细注释


## 代码

```
/**
Expand Down
33 changes: 33 additions & 0 deletions problems/0219.存在重复元素II.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@

## 题目地址
https://leetcode-cn.com/problems/contains-duplicate-ii/

## 思路

使用哈希策略,map数据结构来记录数组元素和对应的元素所在下表

## C++代码

```
class Solution {
public:
bool containsNearbyDuplicate(vector<int>& nums, int k) {
unordered_map<int, int> map; // key: 数组元素, value:元素所在下表
for (int i = 0; i < nums.size(); i++) {
if (map.find(nums[i]) != map.end()) { // 找到了在索引i之前就出现过nums[i]这个元素
int distance = i - map[nums[i]];
if (distance <= k) {
return true;
}
map[nums[i]] = i; // 更新元素nums[i]所在的最新位置i
} else { // 如果map里面没有,就把插入一条数据<元素,元素所在的下表>
map[nums[i]] = i;
}
}
return false;
}
};
```

> 笔者在先后在腾讯和百度从事技术研发多年,利用工作之余重刷leetcode,本文 [GitHub](https://github.com/youngyangyang04/leetcode-master )https://github.com/youngyangyang04/leetcode-master 已经收录,欢迎star,fork,共同学习,一起进步。
22 changes: 22 additions & 0 deletions problems/0220.存在重复元素III.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@



```
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
multiset<int> s;
if(nums.empty() || k==0) return false;
for(int i=0;i<nums.size();i++){
if(s.size()>k){
s.erase(nums[i-k-1]);
}
auto index = s.lower_bound(nums[i]-t);
if(index!=s.end() && abs(*index-nums[i])<=t) return true;
s.insert(nums[i]);
}
return false;
}
};
```
43 changes: 43 additions & 0 deletions problems/0454.四数相加II.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
## 题目地址
https://leetcode-cn.com/problems/4sum-ii/

## 思路

本题使用哈希表映射的方法

那么为什么0015.三数之和不适用哈希表映射的方法呢,感觉上 这道题目都是四个数之和都可以用哈希,三数之和怎么就用不了哈希呢

因为题目0015.三数之和,使用哈希的方法在不超时的情况下做到对结果去重很困难

而这道题目 相当于说 不用考虑重复元素,是四个独立的数组,所以相对于题目0015.三数之和,还是简单了不少

## C++代码

```
class Solution {
public:
int fourSumCount(vector<int>& A, vector<int>& B, vector<int>& C, vector<int>& D) {
unordered_map<int, int> umap;
for (int x : A) {
for (int y : B) {
if (umap.find(x + y) != umap.end()) {
umap[x + y]++;
} else {
umap[x + y] = 1;
}
}
}
int count = 0;
for (int x : C) {
for (int y : D) {
if (umap.find(0 - (x + y)) != umap.end()) {
count += umap[0 - (x + y)]; // 注意这里是加上umap[0 - (x + y)]的值
}
}
}
return count;
}
};
```

> 更多精彩文章持续更新,可以微信搜索「 代码随想录」第一时间阅读,关注后有大量的学习资料和简历模板可以免费领取,本文 [GitHub](https://github.com/youngyangyang04/leetcode-master )https://github.com/youngyangyang04/leetcode-master 已经收录,欢迎star,fork,共同学习,一起进步。

0 comments on commit 18516eb

Please sign in to comment.