Skip to content

Commit 78cf266

Browse files
committed
16 24
1 parent f9fdc2c commit 78cf266

File tree

4 files changed

+180
-1
lines changed

4 files changed

+180
-1
lines changed

docs/.vuepress/config.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ const algorithmArr = [
22
'',
33
'record',
44
'1',
5+
'16',
6+
'24',
57
'77',
68
'96',
79
'101',

docs/.vuepress/dist

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Subproject commit f456070c9be6d146714c81cd370853cf54785764
1+
Subproject commit 801242e1f0f6e27867233520a3c391dc15355756

docs/algorithm/16.md

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# 画解算法 16-最接近的三数之和
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/3sum-closest/
6+
7+
## 题目描述
8+
9+
给定一个包括 `n` 个整数的数组 `nums` 和 一个目标值 `target`。找出 `nums` 中的三个整数,使得它们的和与 `target` 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
10+
11+
```bash
12+
例如,给定数组 nums = [-1,2,1,-4], 和 target = 1.
13+
14+
与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
15+
```
16+
17+
## 解题方案
18+
19+
### 思路
20+
21+
- 标签:排序和双指针
22+
- 本题目因为要计算三个数,如果靠暴力枚举的话时间复杂度会到O(n^3),需要降低时间复杂度
23+
- 首先进行数组排序,时间复杂度O(nlogn)
24+
- 在数组nums中,进行遍历,每遍历一个值利用其下标i,形成一个固定值nums[i]
25+
- 再使用前指针指向`start = i + 1`处,后指针指向`end = nums.length - 1`处,也就是结尾处
26+
- 根据 `sum = nums[i] + nums[start] + nums[end]` 的结果,判断sum与目标target的距离,如果更近则更新结果ans
27+
- 同时判断sum与target的大小关系,因为数组有序,如果`sum > target``end--`,如果`sum < target``start++`,如果`sum == target` 则说明距离为0直接返回结果
28+
- 整个遍历过程,固定值为n次,双指针为n次,时间复杂度为O(n^2)
29+
- 总时间复杂度:O(nlogn) + O(n^2) = O(n^2)
30+
31+
32+
### 代码
33+
34+
```java
35+
class Solution {
36+
public int threeSumClosest(int[] nums, int target) {
37+
Arrays.sort(nums);
38+
int ans = nums[0] + nums[1] + nums[2];
39+
for(int i=0;i<nums.length;i++) {
40+
int start = i+1, end = nums.length - 1;
41+
while(start < end) {
42+
int sum = nums[start] + nums[end] + nums[i];
43+
if(Math.abs(target - sum) < Math.abs(target - ans))
44+
ans = sum;
45+
if(sum > target)
46+
end--;
47+
else if(sum < target)
48+
start++;
49+
else
50+
return ans;
51+
}
52+
}
53+
return ans;
54+
}
55+
}
56+
```
57+
58+
### 画解
59+
60+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/06/02/5cf33ce01d7d135496.png)
61+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/06/02/5cf33cddae14929017.png)
62+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/06/02/5cf33cdde59d254015.png)
63+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/06/02/5cf33cddedd0677648.png)
64+
![fr&lt;x&gt;ame_00005.png](https://i.loli.net/2019/06/02/5cf33cde24b8294298.png)
65+
![fr&lt;x&gt;ame_00006.png](https://i.loli.net/2019/06/02/5cf33ce2b4de280312.png)
66+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/06/02/5cf33cdeee60a11430.png)
67+
![fr&lt;x&gt;ame_00008.png](https://i.loli.net/2019/06/02/5cf33ce00757169832.png)
68+
![fr&lt;x&gt;ame_00009.png](https://i.loli.net/2019/06/02/5cf33ce01fbde20281.png)
69+
![fr&lt;x&gt;ame_00010.png](https://i.loli.net/2019/06/02/5cf33ce00addd36100.png)
70+
![fr&lt;x&gt;ame_00011.png](https://i.loli.net/2019/06/02/5cf3d6e4cce5b14060.png)
71+
72+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
73+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
74+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
75+
76+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

docs/algorithm/24.md

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
# 画解算法 24-两两交换链表中的节点
2+
3+
## 题目链接
4+
5+
https://leetcode-cn.com/problems/swap-nodes-in-pairs/
6+
7+
## 打卡链接
8+
9+
https://leetcode-cn.com/problems/swap-nodes-in-pairs/solution/hua-jie-suan-fa-24-liang-liang-jiao-huan-lian-biao/
10+
11+
## 题目描述
12+
13+
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
14+
15+
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
16+
17+
示例:
18+
19+
```bash
20+
给定 1->2->3->4, 你应该返回 2->1->4->3.
21+
```
22+
23+
## 解题方案
24+
25+
### 思路
26+
27+
- 标签:链表
28+
- 本题的递归和非递归解法其实原理类似,都是更新每两个点的链表形态完成整个链表的调整
29+
- 其中递归解法可以作为典型的递归解决思路进行讲解
30+
31+
递归写法要观察本级递归的解决过程,形成抽象模型,[因为递归本质就是不断重复相同的事情](http://www.lylblog.cn/blog/4 "套路解决递归问题")。而不是去思考完整的调用栈,一级又一级,无从下手。如图所示,我们应该关注一级调用小单元的情况,也就是单个f(x)。
32+
33+
![fr&lt;x&gt;ame_00007.png](https://i.loli.net/2019/06/03/5cf480c68ddae72860.png)
34+
35+
其中我们应该关心的主要有三点:
36+
37+
1. 返回值
38+
2. 调用单元做了什么
39+
3. 终止条件
40+
41+
在本题中:
42+
43+
1. 返回值:交换完成的子链表
44+
2. 调用单元:设需要交换的两个点为head和next,head连接后面交换完成的子链表,next连接head,完成交换
45+
3. 终止条件:head为空指针或者next为空指针,也就是当前无节点或者只有一个节点,无法进行交换
46+
47+
48+
### 代码
49+
50+
递归解法
51+
52+
```java
53+
class Solution {
54+
public ListNode swapPairs(ListNode head) {
55+
if(head == null || head.next == null){
56+
return head;
57+
}
58+
ListNode next = head.next;
59+
head.next = swapPairs(next.next);
60+
next.next = head;
61+
return next;
62+
}
63+
}
64+
```
65+
66+
非递归解法
67+
68+
```java
69+
class Solution {
70+
public ListNode swapPairs(ListNode head) {
71+
ListNode pre = new ListNode(0);
72+
pre.next = head;
73+
ListNode temp = pre;
74+
while(temp.next != null && temp.next.next != null) {
75+
ListNode start = temp.next;
76+
ListNode end = temp.next.next;
77+
temp.next = end;
78+
start.next = end.next;
79+
end.next = start;
80+
temp = start;
81+
}
82+
return pre.next;
83+
}
84+
}
85+
```
86+
87+
### 画解
88+
89+
![fr&lt;x&gt;ame_00001.png](https://i.loli.net/2019/06/03/5cf480c4a7caa31352.png)
90+
![fr&lt;x&gt;ame_00002.png](https://i.loli.net/2019/06/03/5cf480c49ba2396370.png)
91+
![fr&lt;x&gt;ame_00003.png](https://i.loli.net/2019/06/03/5cf480c4a7e2c31176.png)
92+
![fr&lt;x&gt;ame_00004.png](https://i.loli.net/2019/06/03/5cf480c4a538329362.png)
93+
![fr&lt;x&gt;ame_00005.png](https://i.loli.net/2019/06/03/5cf480c4aa5b893598.png)
94+
![fr&lt;x&gt;ame_00006.png](https://i.loli.net/2019/06/03/5cf480c4a8cbe39732.png)
95+
96+
97+
<span style="display:block;text-align:center;">点击「<strong>阅读原文</strong>」打卡</span>
98+
<span style="display:block;text-align:center;">后台回复「<strong>算法</strong>」,加入天天算法群</span>
99+
<span style="display:block;text-align:center;">觉得算法直击灵魂,欢迎点击<strong>在看</strong>和<strong>转发</strong></span>
100+
101+
![](https://i.loli.net/2019/05/20/5ce23b33cc01d73486.gif)

0 commit comments

Comments
 (0)