This commit is contained in:
parent
b4db0fa9d6
commit
b0abd362d5
@ -6,6 +6,7 @@
|
|||||||
- [二分查找](./bin_search.md)
|
- [二分查找](./bin_search.md)
|
||||||
- [移除元素](./remove_elements.md)
|
- [移除元素](./remove_elements.md)
|
||||||
- [长度最小的子数组](./minimum_size_subarray_sum.md)
|
- [长度最小的子数组](./minimum_size_subarray_sum.md)
|
||||||
|
- [三数相加](./three_sum.md)
|
||||||
|
|
||||||
# 链表
|
# 链表
|
||||||
|
|
||||||
|
32
notes/src/three_sum.md
Normal file
32
notes/src/three_sum.md
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
# 三数相加
|
||||||
|
|
||||||
|
[Leetcode 15. 3Sum](https://leetcode.com/problems/3sum/)
|
||||||
|
|
||||||
|
这是一道典型的双指针 + 排序的题目。
|
||||||
|
|
||||||
|
如果暴力枚举的话时间复杂度是 O(n^3) ,我们考虑用双指针来遍历。
|
||||||
|
|
||||||
|
双指针可以将 O(n^2) 的时间复杂度降到 O(n),如果这道题用了双指针的话可以将时间复杂度降到 O(n^2) 。
|
||||||
|
|
||||||
|
思路很简单,首先对数组从小到大排序,然后 `for i from 0 to end` ,这是第一重循环
|
||||||
|
|
||||||
|
然后在 [i+1, end] 这个区间里,定义一个 left 从左往右,和一个 right 从右往左。
|
||||||
|
|
||||||
|
终止条件是它们相遇,或者三数相加满足题目条件。
|
||||||
|
|
||||||
|
当三数之和小于 0 时,left 往右移;
|
||||||
|
|
||||||
|
当三数之和大于 0 时,right 往左移。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Leetcode 18. 4Sum](https://leetcode.com/problems/4sum/)
|
||||||
|
|
||||||
|
和三数相加差不多,只不过我们把 `for i from 0 to end` 这个循环改成了双重循环
|
||||||
|
|
||||||
|
```text
|
||||||
|
for i from 0 to end
|
||||||
|
for j from i+1 to end
|
||||||
|
```
|
||||||
|
|
||||||
|
其它都一样。时间复杂度 O(n^3)
|
Loading…
Reference in New Issue
Block a user