From b0abd362d58eb77026651aba947ac94255464df6 Mon Sep 17 00:00:00 2001 From: Sainnhe Park Date: Sat, 3 Dec 2022 11:40:33 +0800 Subject: [PATCH] Add three_sum.md --- notes/src/SUMMARY.md | 1 + notes/src/three_sum.md | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 notes/src/three_sum.md diff --git a/notes/src/SUMMARY.md b/notes/src/SUMMARY.md index ad60c90..157bb92 100644 --- a/notes/src/SUMMARY.md +++ b/notes/src/SUMMARY.md @@ -6,6 +6,7 @@ - [二分查找](./bin_search.md) - [移除元素](./remove_elements.md) - [长度最小的子数组](./minimum_size_subarray_sum.md) +- [三数相加](./three_sum.md) # 链表 diff --git a/notes/src/three_sum.md b/notes/src/three_sum.md new file mode 100644 index 0000000..c59b73c --- /dev/null +++ b/notes/src/three_sum.md @@ -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)