-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsearch.xml
564 lines (271 loc) · 162 KB
/
search.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
<?xml version="1.0" encoding="utf-8"?>
<search>
<entry>
<title>leetcode 239. 滑动窗口最大值</title>
<link href="/2020/08/27/leetcode-239/"/>
<url>/2020/08/27/leetcode-239/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="单调队列解题思路"><a href="#单调队列解题思路" class="headerlink" title="单调队列解题思路"></a>单调队列解题思路</h3><p>1.使用双端队列<br>2.维护队列的单调性,保持由大到小,队头即为当前窗口的最大元素,将小于nums[i]的元素全部pop<br>3.注意最大值必须要在当前窗口的范围内</p><h3 id="deque代码-记录数组的索引"><a href="#deque代码-记录数组的索引" class="headerlink" title="deque代码(记录数组的索引)"></a>deque代码(记录数组的索引)</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">maxSlidingWindow</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> k)</span> </span>{ </span><br><span class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> res;</span><br><span class="line"> <span class="built_in">deque</span><<span class="keyword">int</span>> dq;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < nums.size(); i++) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">while</span>(!dq.empty() && nums[dq.back()] < nums[i]) dq.pop_back(); <span class="comment">//保持单调性</span></span><br><span class="line"> <span class="keyword">if</span>(!dq.empty() && dq.front() == i-k) dq.pop_front(); <span class="comment">//检查最大值是否超出窗口范围</span></span><br><span class="line"> dq.push_back(i);</span><br><span class="line"> <span class="keyword">if</span>(i >= k<span class="number">-1</span>) res.push_back(nums[dq.front()]);</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="deque代码-记录数组的元素"><a href="#deque代码-记录数组的元素" class="headerlink" title="deque代码(记录数组的元素)"></a>deque代码(记录数组的元素)</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">maxSlidingWindow</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> k)</span> </span>{ </span><br><span class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> res;</span><br><span class="line"> <span class="built_in">deque</span><<span class="keyword">int</span>> dq;</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">int</span> i = <span class="number">0</span>; i < nums.size(); i++) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">while</span>(!dq.empty() && dq.back() < nums[i]) dq.pop_back(); <span class="comment">//保持单调性</span></span><br><span class="line"> <span class="keyword">if</span>(!dq.empty() && i >= k && dq.front() == nums[i-k]) dq.pop_front(); <span class="comment">//检查最大值是否超出窗口范围</span></span><br><span class="line"> dq.push_back(nums[i]);</span><br><span class="line"> <span class="keyword">if</span>(i >= k<span class="number">-1</span>) res.push_back(dq.front());</span><br><span class="line"> } </span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="手写类-思路一样"><a href="#手写类-思路一样" class="headerlink" title="手写类(思路一样)"></a>手写类(思路一样)</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MonotonicQueue</span>{</span></span><br><span class="line"><span class="keyword">private</span>:</span><br><span class="line"> <span class="built_in">deque</span><<span class="keyword">int</span>> data;</span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">push</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">while</span>(!data.empty() && data.back() < n)</span><br><span class="line"> data.pop_back();</span><br><span class="line"> data.push_back(n);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">max</span><span class="params">()</span> </span>{<span class="keyword">return</span> data.front();}</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">pop</span><span class="params">(<span class="keyword">int</span> n)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span>(!data.empty() && data.front() == n)</span><br><span class="line"> data.pop_front();</span><br><span class="line"> }</span><br><span class="line">};</span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">maxSlidingWindow</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> k)</span> </span>{</span><br><span class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> res;</span><br><span class="line"> MonotonicQueue window;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < nums.size(); ++i)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(i < k<span class="number">-1</span>) window.push(nums[i]);</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> window.push(nums[i]);</span><br><span class="line"> res.push_back(window.max()); <span class="comment">//将本轮窗口的最大值加入res中</span></span><br><span class="line"> window.pop(nums[i+<span class="number">1</span>-k]); <span class="comment">//检查最大值是否将要滑出范围</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 堆 </tag>
<tag> 滑动窗口 </tag>
<tag> 单调数据结构 </tag>
</tags>
</entry>
<entry>
<title>CS50games-Pong学习记录</title>
<link href="/2020/08/27/CS50games-Pong%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/"/>
<url>/2020/08/27/CS50games-Pong%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h3><p>本项目来源于哈佛大学的cs50课程,在跟随视频教程的学习过程中,对游戏开发的基本过程有一定了解,有意识好的项目架构应该遵循怎样的原则,是一个不错的Toy project,在经过自主学习之后,部分代码本人进行了中文注释.</p><h3 id="以下选取重点功能部分的代码进行展示。"><a href="#以下选取重点功能部分的代码进行展示。" class="headerlink" title="以下选取重点功能部分的代码进行展示。"></a>以下选取重点功能部分的代码进行展示。</h3><p><a href="https://www.youtube.com/watch?v=yuAxsEuxbIQ&list=PLhQjrBD2T382mHvZB-hSYWvoLzYQzT_Pb&index=1">cs50games youtube地址</a></p><h3 id="Ball-lua-代码"><a href="#Ball-lua-代码" class="headerlink" title="Ball.lua 代码"></a>Ball.lua 代码</h3><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> Pong</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> -- Ball Class --</span></span><br><span class="line"><span class="comment"> 游戏简介:一个球在屏幕中间自由移动,两个玩家控制两个类似浆的矩形,像打乒乓球一样将球打向对方</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"></span><br><span class="line">Ball = Class{}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Ball:init</span><span class="params">(x, y, width, height)</span></span></span><br><span class="line"> <span class="built_in">self</span>.x = x</span><br><span class="line"> <span class="built_in">self</span>.y = y</span><br><span class="line"> <span class="built_in">self</span>.width = width</span><br><span class="line"> <span class="built_in">self</span>.height = height</span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 随机球的初始移动速度</span></span><br><span class="line"> <span class="built_in">self</span>.dy = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">2</span>) == <span class="number">1</span> <span class="keyword">and</span> <span class="number">-100</span> <span class="keyword">or</span> <span class="number">100</span></span><br><span class="line"> <span class="built_in">self</span>.dx = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">2</span>) == <span class="number">1</span> <span class="keyword">and</span> <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">-80</span>, <span class="number">-100</span>) <span class="keyword">or</span> <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">80</span>, <span class="number">100</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 球与浆的碰撞检测</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Ball:collides</span><span class="params">(paddle)</span></span></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">self</span>.x > paddle.x + paddle.width <span class="keyword">or</span> paddle.x > <span class="built_in">self</span>.x + <span class="built_in">self</span>.width <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">self</span>.y > paddle.y + paddle.height <span class="keyword">or</span> paddle.y > <span class="built_in">self</span>.y + <span class="built_in">self</span>.height <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span></span><br><span class="line"> <span class="keyword">end</span> </span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 返回false,则说明发生了碰撞</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 将球重新置于中央,并且给与随机的初始速度</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Ball:reset</span><span class="params">()</span></span></span><br><span class="line"> <span class="built_in">self</span>.x = VIRTUAL_WIDTH / <span class="number">2</span> - <span class="number">2</span></span><br><span class="line"> <span class="built_in">self</span>.y = VIRTUAL_HEIGHT / <span class="number">2</span> - <span class="number">2</span></span><br><span class="line"> <span class="built_in">self</span>.dy = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">2</span>) == <span class="number">1</span> <span class="keyword">and</span> <span class="number">-100</span> <span class="keyword">or</span> <span class="number">100</span></span><br><span class="line"> <span class="built_in">self</span>.dx = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">-50</span>, <span class="number">50</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 随着时间更新球的位置</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Ball:update</span><span class="params">(dt)</span></span></span><br><span class="line"> <span class="built_in">self</span>.x = <span class="built_in">self</span>.x + <span class="built_in">self</span>.dx * dt</span><br><span class="line"> <span class="built_in">self</span>.y = <span class="built_in">self</span>.y + <span class="built_in">self</span>.dy * dt</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 渲染球的图形</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Ball:render</span><span class="params">()</span></span> </span><br><span class="line"> love.graphics.rectangle(<span class="string">'fill'</span>, <span class="built_in">self</span>.x, <span class="built_in">self</span>.y, <span class="built_in">self</span>.width, <span class="built_in">self</span>.height)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><h3 id="paddle-lua-代码"><a href="#paddle-lua-代码" class="headerlink" title="paddle.lua 代码"></a>paddle.lua 代码</h3><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">Paddle = Class{}</span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 初始化浆</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Paddle:init</span><span class="params">(x, y, width, height)</span></span></span><br><span class="line"> <span class="built_in">self</span>.x = x</span><br><span class="line"> <span class="built_in">self</span>.y = y</span><br><span class="line"> <span class="built_in">self</span>.width = width</span><br><span class="line"> <span class="built_in">self</span>.height = height</span><br><span class="line"> <span class="built_in">self</span>.dy = <span class="number">0</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 保证浆的移动始终在屏幕之内</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Paddle:update</span><span class="params">(dt)</span></span></span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">self</span>.dy < <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">self</span>.y = <span class="built_in">math</span>.<span class="built_in">max</span>(<span class="number">0</span>,<span class="built_in">self</span>.y + <span class="built_in">self</span>.dy * dt)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">self</span>.y = <span class="built_in">math</span>.<span class="built_in">min</span>(VIRTUAL_HEIGHT - <span class="built_in">self</span>.height,<span class="built_in">self</span>.y + <span class="built_in">self</span>.dy * dt)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 渲染浆的图形</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">Paddle:render</span><span class="params">()</span></span></span><br><span class="line"> love.graphics.rectangle(<span class="string">'fill'</span>,<span class="built_in">self</span>.x, <span class="built_in">self</span>.y, <span class="built_in">self</span>.width, <span class="built_in">self</span>.height) </span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> </span><br></pre></td></tr></table></figure><h3 id="main-lua-代码"><a href="#main-lua-代码" class="headerlink" title="main.lua 代码"></a>main.lua 代码</h3><figure class="highlight lua"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">-- pong完整版(包括ai电脑功能)</span></span><br><span class="line"></span><br><span class="line">push = <span class="built_in">require</span> <span class="string">'push'</span> <span class="comment">--导入push库</span></span><br><span class="line"></span><br><span class="line">Class = <span class="built_in">require</span> <span class="string">'class'</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">require</span> <span class="string">'Paddle'</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">require</span> <span class="string">'Ball'</span></span><br><span class="line"></span><br><span class="line">WINDOW_WIDTH = <span class="number">1280</span> </span><br><span class="line">WINDOW_HEIGHT = <span class="number">720</span> <span class="comment">--定义窗体的长度和宽度</span></span><br><span class="line"></span><br><span class="line">VIRTUAL_WIDTH = <span class="number">432</span></span><br><span class="line">VIRTUAL_HEIGHT = <span class="number">243</span> <span class="comment">--定义虚拟窗口大小</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">PADDLE_SPEED = <span class="number">200</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">love.load</span><span class="params">()</span></span> <span class="comment">--游戏开始的初始化</span></span><br><span class="line"> love.graphics.setDefaultFilter(<span class="string">'nearest'</span>, <span class="string">'nearest'</span>) <span class="comment">--当缩放时使用最近边缘处理模糊部分</span></span><br><span class="line"> </span><br><span class="line"> love.window.setTitle(<span class="string">"PongPong"</span>)</span><br><span class="line"></span><br><span class="line"> <span class="built_in">math</span>.<span class="built_in">randomseed</span>(<span class="built_in">os</span>.<span class="built_in">time</span>()) <span class="comment">--设置随机数种子,可更好保证随机性</span></span><br><span class="line"></span><br><span class="line"> smallFont = love.graphics.newFont(<span class="string">'font.ttf'</span>,<span class="number">8</span>) <span class="comment">--设置新的字体对象</span></span><br><span class="line"> largeFont = love.graphics.newFont(<span class="string">'font.ttf'</span>, <span class="number">16</span>) <span class="comment">--成功后的提示字体</span></span><br><span class="line"> scoreFont = love.graphics.newFont(<span class="string">'font.ttf'</span>,<span class="number">32</span>) <span class="comment">--显示分数的字体</span></span><br><span class="line"></span><br><span class="line"> love.graphics.setFont(smallFont)</span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 设置游戏中的各种音效</span></span><br><span class="line"> sounds = {</span><br><span class="line"> [<span class="string">'paddle_hit'</span>] = love.audio.newSource(<span class="string">'sounds/paddle_hit.wav'</span>,<span class="string">'static'</span>),</span><br><span class="line"> [<span class="string">'score'</span>] = love.audio.newSource(<span class="string">'sounds/score.wav'</span>, <span class="string">'static'</span>),</span><br><span class="line"> [<span class="string">'wall_hit'</span>] = love.audio.newSource(<span class="string">'sounds/wall_hit.wav'</span>, <span class="string">'static'</span>),</span><br><span class="line"> [<span class="string">'win'</span>] = love.audio.newSource(<span class="string">'sounds/win.mp3'</span>, <span class="string">'static'</span>),</span><br><span class="line"> [<span class="string">'background'</span>] = love.audio.newSource(<span class="string">'sounds/background.mp3'</span>, <span class="string">'static'</span>)</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> push:setupScreen(VIRTUAL_WIDTH,VIRTUAL_HEIGHT,WINDOW_WIDTH,WINDOW_HEIGHT,{</span><br><span class="line"> fullscreen = <span class="literal">false</span>,</span><br><span class="line"> resizable = <span class="literal">true</span>,</span><br><span class="line"> vsync = <span class="literal">true</span></span><br><span class="line"> })</span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 初始化各种变量</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"> player1Score = <span class="number">0</span></span><br><span class="line"> player2Score = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> servingPlayer = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> player1 = Paddle(<span class="number">10</span>,<span class="number">30</span>,<span class="number">5</span>,<span class="number">20</span>)</span><br><span class="line"> player2 = Paddle(VIRTUAL_WIDTH - <span class="number">10</span>, VIRTUAL_HEIGHT - <span class="number">30</span>, <span class="number">5</span>, <span class="number">40</span>)</span><br><span class="line"> </span><br><span class="line"> ball = Ball(VIRTUAL_WIDTH / <span class="number">2</span> - <span class="number">2</span>, VIRTUAL_HEIGHT / <span class="number">2</span> - <span class="number">2</span>, <span class="number">4</span>, <span class="number">4</span>)</span><br><span class="line"> gameState = <span class="string">'start'</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">--[[</span></span><br><span class="line"><span class="comment"> 更新窗口大小</span></span><br><span class="line"><span class="comment">]]</span></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">love.resize</span><span class="params">(w,h)</span></span></span><br><span class="line"> push:resize(w,h)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">love.update</span><span class="params">(dt)</span></span></span><br><span class="line"> <span class="keyword">if</span> gameState == <span class="string">'serve'</span> <span class="keyword">then</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 在开始之前,初始化球的上下移动速度</span></span><br><span class="line"> ball.dy = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">-70</span>, <span class="number">70</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment">--当需要ai时,为player2设置初始速度</span></span><br><span class="line"> player2.dy = <span class="number">-200</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">--根据servingPlayer,确定球本次发射的初始左右移动方向</span></span><br><span class="line"> <span class="keyword">if</span> servingPlayer == <span class="number">1</span> <span class="keyword">then</span></span><br><span class="line"> ball.dx = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">140</span>, <span class="number">180</span>)</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> ball.dx = -<span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">140</span>, <span class="number">180</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'play'</span> <span class="keyword">then</span></span><br><span class="line"></span><br><span class="line"> sounds[<span class="string">'background'</span>]:play()</span><br><span class="line"></span><br><span class="line"> <span class="comment">--发生碰撞,球的x轴移动方向反向</span></span><br><span class="line"> <span class="keyword">if</span> ball:collides(player1) <span class="keyword">then</span></span><br><span class="line"> ball.dx = -ball.dx</span><br><span class="line"> ball.x = player1.x + <span class="number">5</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ball.dy < <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> ball.dy = -<span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">10</span>,<span class="number">150</span>)</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> ball.dy = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">10</span>,<span class="number">150</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> sounds[<span class="string">'paddle_hit'</span>]:play()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ball:collides(player2) <span class="keyword">then</span></span><br><span class="line"> ball.dx = -ball.dx </span><br><span class="line"> ball.x = player2.x - <span class="number">4</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- keep velocity going in the same direction, but randomize it</span></span><br><span class="line"> <span class="keyword">if</span> ball.dy < <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> ball.dy = -<span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">10</span>, <span class="number">150</span>)</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> ball.dy = <span class="built_in">math</span>.<span class="built_in">random</span>(<span class="number">10</span>, <span class="number">150</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> sounds[<span class="string">'paddle_hit'</span>]:play()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 球碰到边界,y轴移动方向反向</span></span><br><span class="line"> <span class="keyword">if</span> ball.y <= <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> ball.y = <span class="number">0</span></span><br><span class="line"> ball.dy = -ball.dy</span><br><span class="line"> sounds[<span class="string">'wall_hit'</span>]:play()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ball.y >= VIRTUAL_HEIGHT - <span class="number">4</span> <span class="keyword">then</span></span><br><span class="line"> ball.y = VIRTUAL_HEIGHT - <span class="number">4</span></span><br><span class="line"> ball.dy = -ball.dy</span><br><span class="line"> sounds[<span class="string">'wall_hit'</span>]:play()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 如果球超出左右边界,则对应玩家得分</span></span><br><span class="line"> <span class="keyword">if</span> ball.x < <span class="number">0</span> <span class="keyword">then</span></span><br><span class="line"> servingPlayer = <span class="number">1</span></span><br><span class="line"> player2Score = player2Score + <span class="number">1</span></span><br><span class="line"> sounds[<span class="string">'score'</span>]:play()</span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 玩家得到2分,则游戏结束,取得胜利</span></span><br><span class="line"> <span class="keyword">if</span> player2Score == <span class="number">2</span> <span class="keyword">then</span></span><br><span class="line"> winningPlayer = <span class="number">2</span></span><br><span class="line"> gameState = <span class="string">'done'</span></span><br><span class="line"> sounds[<span class="string">'win'</span>]:play()</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> gameState = <span class="string">'serve'</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 将球重新置于中央</span></span><br><span class="line"> ball:reset()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ball.x > VIRTUAL_WIDTH <span class="keyword">then</span></span><br><span class="line"> servingPlayer = <span class="number">2</span></span><br><span class="line"> player1Score = player1Score + <span class="number">1</span></span><br><span class="line"> sounds[<span class="string">'score'</span>]:play()</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span> player1Score == <span class="number">2</span> <span class="keyword">then</span></span><br><span class="line"> winningPlayer = <span class="number">1</span></span><br><span class="line"> gameState = <span class="string">'done'</span></span><br><span class="line"> sounds[<span class="string">'win'</span>]:play()</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> gameState = <span class="string">'serve'</span></span><br><span class="line"> ball:reset()</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- player 1 movement</span></span><br><span class="line"> <span class="keyword">if</span> love.keyboard.isDown(<span class="string">'w'</span>) <span class="keyword">then</span></span><br><span class="line"> player1.dy = -PADDLE_SPEED</span><br><span class="line"> <span class="keyword">elseif</span> love.keyboard.isDown(<span class="string">'s'</span>) <span class="keyword">then</span></span><br><span class="line"> player1.dy = PADDLE_SPEED</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> player1.dy = <span class="number">0</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- player 2 movement</span></span><br><span class="line"> <span class="keyword">if</span> love.keyboard.isDown(<span class="string">'up'</span>) <span class="keyword">then</span></span><br><span class="line"> player2.dy = -PADDLE_SPEED</span><br><span class="line"> <span class="keyword">elseif</span> love.keyboard.isDown(<span class="string">'down'</span>) <span class="keyword">then</span></span><br><span class="line"> player2.dy = PADDLE_SPEED</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="comment">--AI状态下注释下一行 ,使得player2不会速度一直为0</span></span><br><span class="line"> player2.dy = <span class="number">0</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- AI movement</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(player2.y > VIRTUAL_HEIGHT - <span class="number">50</span>) <span class="keyword">then</span></span><br><span class="line"> player2.y = VIRTUAL_HEIGHT - <span class="number">50</span></span><br><span class="line"> player2.dy = - player2.dy</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(player2.y < <span class="number">5</span>) <span class="keyword">then</span></span><br><span class="line"> player2.y = <span class="number">5</span></span><br><span class="line"> player2.dy = -player2.dy</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(gameState == <span class="string">'play'</span>) <span class="keyword">then</span></span><br><span class="line"> ball:update(dt)</span><br><span class="line"> player2:update(dt) </span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> player1:update(dt)</span><br><span class="line"> <span class="comment">--ai状态下需要注释掉此行</span></span><br><span class="line"> <span class="comment">--player2:update(dt) </span></span><br><span class="line"> </span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">love.keypressed</span><span class="params">(key)</span></span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> key == <span class="string">'escape'</span> <span class="keyword">then</span> <span class="comment">--如果键盘按下esc,则退出love</span></span><br><span class="line"></span><br><span class="line"> love.event.quit()</span><br><span class="line"> <span class="comment">-- 回车控制游戏的状态变化,进入游戏的下一个状态</span></span><br><span class="line"> <span class="keyword">elseif</span> key == <span class="string">'enter'</span> <span class="keyword">or</span> key == <span class="string">'return'</span> <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">if</span> gameState == <span class="string">'start'</span> <span class="keyword">then</span></span><br><span class="line"> gameState = <span class="string">'serve'</span></span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'serve'</span> <span class="keyword">then</span></span><br><span class="line"> gameState = <span class="string">'play'</span></span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'done'</span> <span class="keyword">then</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 胜利之后,进行serve状态,游戏重新等待开始</span></span><br><span class="line"> gameState = <span class="string">'serve'</span></span><br><span class="line"></span><br><span class="line"> ball:reset()</span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 得分重置</span></span><br><span class="line"> player1Score = <span class="number">0</span></span><br><span class="line"> player2Score = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">-- 切换发球方向</span></span><br><span class="line"> <span class="keyword">if</span> winningPlayer == <span class="number">1</span> <span class="keyword">then</span></span><br><span class="line"> servingPlayer = <span class="number">2</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> servingPlayer = <span class="number">1</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">love.draw</span><span class="params">()</span></span></span><br><span class="line"></span><br><span class="line"> push:apply(<span class="string">'start'</span>)</span><br><span class="line"></span><br><span class="line"> love.graphics.clear(<span class="number">40</span>/<span class="number">255</span>, <span class="number">45</span>/<span class="number">255</span>, <span class="number">52</span>/<span class="number">255</span>, <span class="number">255</span>/<span class="number">255</span>) <span class="comment">--清空面板,并且设置颜色</span></span><br><span class="line"> </span><br><span class="line"> love.graphics.setFont(smallFont) <span class="comment">--使用小字体</span></span><br><span class="line"></span><br><span class="line"> displayScore()</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> gameState == <span class="string">'start'</span> <span class="keyword">then</span></span><br><span class="line"> love.graphics.setFont(smallFont)</span><br><span class="line"> love.graphics.printf(<span class="string">'Welcome to Pong!'</span>, <span class="number">0</span>, <span class="number">10</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> love.graphics.printf(<span class="string">'Press Enter to begin!'</span>, <span class="number">0</span>, <span class="number">20</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'serve'</span> <span class="keyword">then</span></span><br><span class="line"> love.graphics.setFont(smallFont)</span><br><span class="line"> love.graphics.printf(<span class="string">'Player '</span> .. <span class="built_in">tostring</span>(servingPlayer) .. <span class="string">"'s serve!"</span>, </span><br><span class="line"> <span class="number">0</span>, <span class="number">10</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> love.graphics.printf(<span class="string">'Press Enter to serve!'</span>, <span class="number">0</span>, <span class="number">20</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'play'</span> <span class="keyword">then</span></span><br><span class="line"> <span class="comment">-- play状态下没有UI信息</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">elseif</span> gameState == <span class="string">'done'</span> <span class="keyword">then</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- UI messages</span></span><br><span class="line"> love.graphics.setFont(largeFont)</span><br><span class="line"> love.graphics.printf(<span class="string">'Player '</span> .. <span class="built_in">tostring</span>(winningPlayer) .. <span class="string">' wins!'</span>,</span><br><span class="line"> <span class="number">0</span>, <span class="number">10</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> love.graphics.setFont(smallFont)</span><br><span class="line"> love.graphics.printf(<span class="string">'Press Enter to restart!'</span>, <span class="number">0</span>, <span class="number">30</span>, VIRTUAL_WIDTH, <span class="string">'center'</span>)</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 渲染浆,使用他们类的函数</span></span><br><span class="line"> player1:render()</span><br><span class="line"> player2:render()</span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 渲染球同理</span></span><br><span class="line"> ball:render()</span><br><span class="line"></span><br><span class="line"> displayFPS() <span class="comment">--显示fps</span></span><br><span class="line"></span><br><span class="line"> push:apply(<span class="string">'end'</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">displayFPS</span><span class="params">()</span></span></span><br><span class="line"> </span><br><span class="line"> love.graphics.setFont(smallFont)</span><br><span class="line"> love.graphics.setColor(<span class="number">0</span>,<span class="number">255</span>/<span class="number">255</span>,<span class="number">0</span>,<span class="number">255</span>/<span class="number">255</span>)</span><br><span class="line"> love.graphics.<span class="built_in">print</span>(<span class="string">'FPS: '</span> .. <span class="built_in">tostring</span>(love.timer.getFPS()), <span class="number">10</span>, <span class="number">10</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">function</span> <span class="title">displayScore</span><span class="params">()</span></span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">-- 显示玩家的分数</span></span><br><span class="line"> love.graphics.setFont(scoreFont)</span><br><span class="line"> love.graphics.<span class="built_in">print</span>(<span class="built_in">tostring</span>(player1Score), VIRTUAL_WIDTH / <span class="number">2</span> - <span class="number">50</span>, </span><br><span class="line"> VIRTUAL_HEIGHT / <span class="number">3</span>)</span><br><span class="line"> love.graphics.<span class="built_in">print</span>(<span class="built_in">tostring</span>(player2Score), VIRTUAL_WIDTH / <span class="number">2</span> + <span class="number">30</span>,</span><br><span class="line"> VIRTUAL_HEIGHT / <span class="number">3</span>)</span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> cs50games </category>
</categories>
<tags>
<tag> 游戏 </tag>
<tag> 项目 </tag>
</tags>
</entry>
<entry>
<title>Hexo 将博客部署到vercel实现加速</title>
<link href="/2020/08/27/vercel/"/>
<url>/2020/08/27/vercel/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h3><p>博客搭建之后,光秃秃的不好看,先是花了不少精力将主题换成了好看的butterfly,遇到了不少坑,但是发现访问速度异常之慢,于是决定将博客部署到Vercel进行提速,效果确实明显,加载速度快到泪目</p><h3 id="导入-GitHub-仓库"><a href="#导入-GitHub-仓库" class="headerlink" title="导入 GitHub 仓库"></a>导入 GitHub 仓库</h3><p>Vercel 是一个静态网页部署网站,并不托管代码。因此,我们通过 GitHub 来托管 hexo deploy 生成的网页文件,并设置自动导入。当你的源代码仓库有变动后,Vercel 会第一时间检测到并重新部署网站,部署完成后会通过邮件提醒。</p><p><a href="https://vercel.com/signup">点击进入vercel官网</a>点击 Continue with GitHub<br><img src= "/img/loading.gif" data-lazy-src="/2020/08/27/vercel/3.png"></p><p><strong>注意:如果出现下图,需要将github绑定的邮箱中的qq邮箱先删除,等博客部署到vercel之后再将qq邮箱重新绑定github</strong><br><img src= "/img/loading.gif" data-lazy-src="/2020/08/27/vercel/4.png"></p><p>授权完成后,选择 Import Git Repository,点击 Continue,进入如下界面。输入你的仓库 url(https),就是github上博客项目的项目url。<br><img src= "/img/loading.gif" data-lazy-src="/2020/08/27/vercel/5.png"></p><p>然后按照默认设置Install Vercel就行</p><p>然后还有自定义域名和重定向的功能,就不一一细说啦</p><p><img src= "/img/loading.gif" data-lazy-src="/2020/08/27/vercel/2.png"></p>]]></content>
<categories>
<category> 博客 </category>
</categories>
<tags>
<tag> 博客 </tag>
</tags>
</entry>
<entry>
<title>leetcode 438. 找到字符串中所有字母异位词</title>
<link href="/2020/08/26/leetcode-438/"/>
<url>/2020/08/26/leetcode-438/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>思路同经典的76.最小覆盖子串,<a href="https://leetcode-cn.com/problems/minimum-window-substring/solution/c-hua-dong-chuang-kou-z-by-zrita/">https://leetcode-cn.com/problems/minimum-window-substring/solution/c-hua-dong-chuang-kou-z-by-zrita/</a></p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">findAnagrams</span><span class="params">(<span class="built_in">string</span> s, <span class="built_in">string</span> p)</span> </span>{</span><br><span class="line"> <span class="built_in">vector</span><<span class="keyword">int</span>> res;</span><br><span class="line"> <span class="keyword">int</span> m[<span class="number">128</span>] = {<span class="number">0</span>};</span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>, right = <span class="number">0</span>, need = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : p)</span><br><span class="line"> ++m[c];</span><br><span class="line"> <span class="keyword">while</span>(right < s.size())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(m[s[right]] > <span class="number">0</span>) ++need;</span><br><span class="line"> --m[s[right]];</span><br><span class="line"> ++right;</span><br><span class="line"> <span class="keyword">while</span>(need == p.size())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(right - left == p.size()) res.push_back(left); <span class="comment">//通过长度判断异位词,加入res中</span></span><br><span class="line"> <span class="keyword">if</span>(m[s[left]] == <span class="number">0</span>) --need;</span><br><span class="line"> ++m[s[left]];</span><br><span class="line"> ++left;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 字符串 </tag>
<tag> 滑动窗口 </tag>
</tags>
</entry>
<entry>
<title>leetcode 76. 最小覆盖子串</title>
<link href="/2020/08/26/leetcode-76/"/>
<url>/2020/08/26/leetcode-76/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">string</span> <span class="title">minWindow</span><span class="params">(<span class="built_in">string</span> s, <span class="built_in">string</span> t)</span> </span>{</span><br><span class="line"> <span class="built_in">string</span> res = <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">int</span> m[<span class="number">128</span>] = { <span class="number">0</span> }; <span class="comment">//哈希数组</span></span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>, right = <span class="number">0</span>, need = t.size(), minstart = <span class="number">0</span>, minlen = INT_MAX;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> c : t) </span><br><span class="line"> ++m[c]; <span class="comment">//记录t中字符出现次数</span></span><br><span class="line"> <span class="keyword">while</span>(right < s.size())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(m[s[right]] > <span class="number">0</span>) --need; <span class="comment">//窗口右移,每包含一个t中的字符,need--</span></span><br><span class="line"> --m[s[right]];</span><br><span class="line"> ++right;</span><br><span class="line"> <span class="keyword">while</span>(need == <span class="number">0</span>) <span class="comment">//当t中的字符全部被包含在[left,right]时</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(right - left < minlen)</span><br><span class="line"> {</span><br><span class="line"> minstart = left;</span><br><span class="line"> minlen = right - left;</span><br><span class="line"> }</span><br><span class="line"> ++m[s[left]]; <span class="comment">//窗口左移</span></span><br><span class="line"> <span class="keyword">if</span>(m[s[left]] > <span class="number">0</span>) ++need;</span><br><span class="line"> ++left;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(minlen != INT_MAX) res = s.substr(minstart , minlen);</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 字符串 </tag>
<tag> 滑动窗口 </tag>
</tags>
</entry>
<entry>
<title>leetcode 289. 生命游戏</title>
<link href="/2020/08/26/leetcode-289/"/>
<url>/2020/08/26/leetcode-289/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p><strong>1.我们用最低位保存当前的状态,1为活,0为死,用倒数第二位保存更新后的状态<br>2.board[i][j] & 1获取当前的状态<br>3.board[i][j] >> 1获取下一个状态<br>4.board[i][j] |= 2表示将倒数第二位置为1,表示更新后的状态是活</strong></p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">gameOfLife</span><span class="params">(<span class="built_in">vector</span><<span class="built_in">vector</span><<span class="keyword">int</span>>>& board)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> DX[] = {<span class="number">-1</span>,<span class="number">0</span>,<span class="number">1</span>,<span class="number">-1</span>,<span class="number">1</span>,<span class="number">-1</span>,<span class="number">0</span>,<span class="number">1</span>};</span><br><span class="line"> <span class="keyword">int</span> DY[] = {<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">0</span>,<span class="number">0</span>,<span class="number">-1</span>,<span class="number">-1</span>,<span class="number">-1</span>};</span><br><span class="line"> <span class="keyword">int</span> m = board.size(), n = board[<span class="number">0</span>].size();</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < m; ++i)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">0</span>; j < n; ++j)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> live = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> k = <span class="number">0</span>; k < <span class="number">8</span>; ++k) <span class="comment">//统计现在周围的活细胞数量</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> x = i + DX[k];</span><br><span class="line"> <span class="keyword">int</span> y = j + DY[k];</span><br><span class="line"> <span class="keyword">if</span>(x < <span class="number">0</span> || x >= m || y < <span class="number">0</span> || y >= n) <span class="keyword">continue</span>; <span class="comment">//判断越界</span></span><br><span class="line"> live += board[x][y] & <span class="number">1</span>; </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(live == <span class="number">3</span>) board[i][j] |= <span class="number">2</span>; <span class="comment">//更新后要想存活只存在两种情况</span></span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span>(live == <span class="number">2</span> && board[i][j] == <span class="number">1</span>) board[i][j] |= <span class="number">2</span>; </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < m; ++i)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">0</span>; j < n; ++j)</span><br><span class="line"> board[i][j] >>= <span class="number">1</span>; <span class="comment">//更新状态</span></span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 数组 </tag>
<tag> 复合状态 </tag>
</tags>
</entry>
<entry>
<title>leetcode 22. 括号生成</title>
<link href="/2020/08/26/leetcode-22/"/>
<url>/2020/08/26/leetcode-22/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="built_in">string</span>> <span class="title">generateParenthesis</span><span class="params">(<span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> <span class="built_in">vector</span><<span class="built_in">string</span>> res;</span><br><span class="line"> dfs(res, <span class="string">""</span>, n, n);</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">void</span> <span class="title">dfs</span><span class="params">(<span class="built_in">vector</span><<span class="built_in">string</span>> & res, <span class="built_in">string</span> str,<span class="keyword">int</span> left,<span class="keyword">int</span> right)</span></span></span><br><span class="line"><span class="function"> </span>{</span><br><span class="line"> <span class="keyword">if</span>(left == <span class="number">0</span> && right == <span class="number">0</span>) res.push_back(str); </span><br><span class="line"> <span class="keyword">if</span>(left > <span class="number">0</span>) dfs(res, str + <span class="string">"("</span>, left - <span class="number">1</span>, right);</span><br><span class="line"> <span class="keyword">if</span>(right > left) dfs(res, str + <span class="string">")"</span>, left, right - <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><p>看见一个图片很直观,这里直接放出来了 图片来源:ChineseKawhi</p><p><img src= "/img/loading.gif" data-lazy-src="https://pic.leetcode-cn.com/1f18f8cae809764acdeca72f8049a8fca15e1c462643273063bb19bc2f166512-QQ%E5%9B%BE%E7%89%8720200409115535.png" alt="QQ图片20200409115535.png"></p>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 字符串 </tag>
<tag> 回溯算法 </tag>
<tag> DFS </tag>
</tags>
</entry>
<entry>
<title>leetcode 21. 合并两个有序链表</title>
<link href="/2020/08/26/leetcode-21/"/>
<url>/2020/08/26/leetcode-21/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="迭代"><a href="#迭代" class="headerlink" title="迭代"></a>迭代</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">ListNode* <span class="title">mergeTwoLists</span><span class="params">(ListNode* n1, ListNode* n2)</span> </span>{</span><br><span class="line"> <span class="function">ListNode <span class="title">dummy</span> <span class="params">(<span class="number">0</span>)</span> </span>; </span><br><span class="line"> ListNode* start= &dummy ; </span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span>(n1 && n2)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(n1->val <= n2->val) </span><br><span class="line"> {</span><br><span class="line"> start->next = n1;</span><br><span class="line"> n1 = n1->next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> </span><br><span class="line"> {</span><br><span class="line"> start->next = n2;</span><br><span class="line"> n2 = n2->next;</span><br><span class="line"> }</span><br><span class="line"> start = start->next;</span><br><span class="line"> }</span><br><span class="line"> start->next = n1 ? n1 : n2 ; <span class="comment">//剩余部分的加入</span></span><br><span class="line"> <span class="keyword">return</span> dummy.next;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="递归"><a href="#递归" class="headerlink" title="递归"></a>递归</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">ListNode* <span class="title">mergeTwoLists</span><span class="params">(ListNode* l1, ListNode* l2)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(l1 == <span class="literal">NULL</span>) <span class="keyword">return</span> l2;</span><br><span class="line"> <span class="keyword">if</span>(l2 == <span class="literal">NULL</span>) <span class="keyword">return</span> l1;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span>(l1->val < l2->val) l1->next = mergeTwoLists(l1->next, l2);</span><br><span class="line"> <span class="keyword">else</span> l2->next = mergeTwoLists(l1,l2->next);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> l1->val < l2->val ? l1 : l2 ; </span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 链表 </tag>
</tags>
</entry>
<entry>
<title>leetcode 20. 有效的括号</title>
<link href="/2020/08/26/leetcode-20/"/>
<url>/2020/08/26/leetcode-20/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">isValid</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="built_in">stack</span> <<span class="keyword">char</span>> t;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> n : s)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span> (n == <span class="string">'('</span>) t.push(<span class="string">')'</span>);</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (n == <span class="string">'{'</span>) t.push(<span class="string">'}'</span>);</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (n == <span class="string">'['</span>) t.push(<span class="string">']'</span>);</span><br><span class="line"> <span class="keyword">else</span> </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(t.empty() || t.top() != n) <span class="keyword">return</span> <span class="literal">false</span>; <span class="comment">//此时n为三种右括号之一,而栈顶也是三种右括号之一</span></span><br><span class="line"> <span class="keyword">else</span> t.pop(); </span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> t.empty();</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="使用map的代码"><a href="#使用map的代码" class="headerlink" title="使用map的代码"></a>使用map的代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">isValid</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="built_in">unordered_map</span><<span class="keyword">char</span>, <span class="keyword">char</span>> mp = { { <span class="string">'}'</span>,<span class="string">'{'</span> }, { <span class="string">')'</span>,<span class="string">'('</span> }, { <span class="string">']'</span>,<span class="string">'['</span> } };</span><br><span class="line"> <span class="built_in">stack</span> <<span class="keyword">char</span>> t;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">char</span> n : s)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(n == <span class="string">'('</span> || n == <span class="string">'['</span> || n == <span class="string">'{'</span>) t.push(n);</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(t.empty() || t.top() != mp[n]) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">else</span> t.pop();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> t.empty();</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="不使用栈(效率很低)"><a href="#不使用栈(效率很低)" class="headerlink" title="不使用栈(效率很低)"></a>不使用栈(效率很低)</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">bool</span> <span class="title">isValid</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="built_in">unordered_map</span><<span class="keyword">char</span>, <span class="keyword">char</span>> mp = { { <span class="string">'{'</span>,<span class="string">'}'</span> }, { <span class="string">'('</span>,<span class="string">')'</span> }, { <span class="string">'['</span>,<span class="string">']'</span> } };</span><br><span class="line"> <span class="keyword">int</span> i = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(i < s.size())</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(mp[s[i]] == s[i+<span class="number">1</span>] && s[i+<span class="number">1</span>] !=<span class="string">'\0'</span>)</span><br><span class="line"> {</span><br><span class="line"> s.erase(i,<span class="number">2</span>);</span><br><span class="line"> i = <span class="number">-1</span>;</span><br><span class="line"> }</span><br><span class="line"> i++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> !s.size();</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 哈希表 </tag>
<tag> 字符串 </tag>
<tag> 栈 </tag>
</tags>
</entry>
<entry>
<title>leetcode 19. 删除链表的倒数第N个节点</title>
<link href="/2020/08/26/leetcode-19/"/>
<url>/2020/08/26/leetcode-19/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="快慢指针1(带头结点)"><a href="#快慢指针1(带头结点)" class="headerlink" title="快慢指针1(带头结点)"></a>快慢指针1(带头结点)</h3><p>让快慢指针相差n个位置,当快指针到最后一个元素时,慢指针的下一个元素正好就是要删除的元素<br>ps:不用特殊考虑删除头结点的情况</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">ListNode* <span class="title">removeNthFromEnd</span><span class="params">(ListNode* head, <span class="keyword">int</span> n)</span> </span>{ </span><br><span class="line"></span><br><span class="line"> ListNode *start = <span class="keyword">new</span> ListNode(<span class="number">-1</span>); <span class="comment">//建立一个新的头结点</span></span><br><span class="line"> start->next = head;</span><br><span class="line"> ListNode *slow = start , *fast = start , *temp; </span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i <= n ; i++) fast = fast->next;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">while</span>(fast->next)</span><br><span class="line"> {</span><br><span class="line"> slow = slow->next;</span><br><span class="line"> fast = fast->next;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> temp=slow->next;</span><br><span class="line"> slow->next=slow->next->next;</span><br><span class="line"> <span class="keyword">delete</span> temp;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> start->next; <span class="comment">//head可能被删除了,所以用start->next表示新的头结点</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="快慢指针2(不带头结点)"><a href="#快慢指针2(不带头结点)" class="headerlink" title="快慢指针2(不带头结点)"></a>快慢指针2(不带头结点)</h3><p>让快慢指针相差n个位置,当快指针到最后一个元素时,慢指针的下一个元素正好就是要删除的元素<br>ps:特殊考虑了n为链表元素个数的情况,此时要删除的是头结点,让头结点的下一个节点作为新的头结点</p><h3 id="代码-1"><a href="#代码-1" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">ListNode* <span class="title">removeNthFromEnd</span><span class="params">(ListNode* head, <span class="keyword">int</span> n)</span> </span>{</span><br><span class="line"> ListNode *slow = head , *fast = head; </span><br><span class="line"> ListNode *temp;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">1</span>; i <= n ; i++) fast = fast->next;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">if</span>(fast == <span class="literal">NULL</span>) <span class="comment">//只有当要删除头结点时,fast==NULL,n恰好等于链表的元素个数</span></span><br><span class="line"> {</span><br><span class="line"> temp = head->next;</span><br><span class="line"> <span class="keyword">delete</span> head;</span><br><span class="line"> <span class="keyword">return</span> temp; <span class="comment">//返回新的头结点</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">while</span>(fast->next)</span><br><span class="line"> {</span><br><span class="line"> slow = slow->next;</span><br><span class="line"> fast = fast->next;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> temp=slow->next;</span><br><span class="line"> slow->next=slow->next->next;</span><br><span class="line"> <span class="keyword">delete</span> temp;</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="方法3-递归【转载】"><a href="#方法3-递归【转载】" class="headerlink" title="方法3 递归【转载】"></a>方法3 递归【转载】</h3><p>在讨论区看到的一位大佬的解答,感觉很棒</p><p>ps:递归cur每次++表示当前是倒数第几个节点,如果为n的话,让上一个节点指向自己的下一个节点,则达到删除当前节点的效果<br><a href="/u/smart067/">@smart067</a></p><h3 id="代码-2"><a href="#代码-2" class="headerlink" title="代码"></a>代码</h3><pre><code class="cpp">class Solution {public: int cur=0; ListNode* removeNthFromEnd(ListNode* head, int n) { if(!head) return NULL; head->next = removeNthFromEnd(head->next,n); if(n == ++cur) return head->next; return head; }};</code></pre>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 双指针 </tag>
<tag> 链表 </tag>
</tags>
</entry>
<entry>
<title>leetcode 18. 四数之和</title>
<link href="/2020/08/26/leetcode-18/"/>
<url>/2020/08/26/leetcode-18/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><p>跟三数之和类似思路,外层再嵌套一个循环</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="built_in">vector</span><<span class="keyword">int</span>>> <span class="title">fourSum</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> sort(nums.begin(),nums.end());</span><br><span class="line"> <span class="built_in">vector</span> <<span class="built_in">vector</span><<span class="keyword">int</span>>> res;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i + <span class="number">3</span> < nums.size(); ++i)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(i > <span class="number">0</span> && nums[i] == nums[i<span class="number">-1</span>]) <span class="keyword">continue</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = i+<span class="number">1</span>; j + <span class="number">2</span> < nums.size(); ++j)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(j > i+<span class="number">1</span> && nums[j] == nums[j<span class="number">-1</span>]) <span class="keyword">continue</span>; </span><br><span class="line"> <span class="comment">//此处不能为j>0,循环至少进行一轮后才能continue,确保当前情况的数字组合已经判断过</span></span><br><span class="line"> <span class="keyword">int</span> ttarget = target - nums[i] - nums[j] ;</span><br><span class="line"> <span class="keyword">int</span> l = j+<span class="number">1</span>, r = nums.size()<span class="number">-1</span>;</span><br><span class="line"> <span class="keyword">while</span>(l < r)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> sum = nums[l] + nums[r]; <span class="comment">//注意-号</span></span><br><span class="line"> <span class="keyword">if</span>(ttarget == sum)</span><br><span class="line"> {</span><br><span class="line"> res.push_back({nums[i],nums[j],nums[l],nums[r]});</span><br><span class="line"> l++;</span><br><span class="line"> r--;</span><br><span class="line"> <span class="keyword">while</span>(l < r && nums[l] == nums[l<span class="number">-1</span>]) l++;</span><br><span class="line"> <span class="keyword">while</span>(l < r && nums[r] == nums[r+<span class="number">1</span>]) r--;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(ttarget > sum) l++;</span><br><span class="line"> <span class="keyword">if</span>(ttarget < sum) r--;</span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 数组 </tag>
<tag> 双指针 </tag>
</tags>
</entry>
<entry>
<title>leetcode 15. 三数之和</title>
<link href="/2020/08/26/leetcode-15/"/>
<url>/2020/08/26/leetcode-15/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="built_in">vector</span><<span class="keyword">int</span>>> <span class="title">threeSum</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums)</span> </span>{</span><br><span class="line"> <span class="built_in">vector</span><<span class="built_in">vector</span><<span class="keyword">int</span>>> res; </span><br><span class="line"> sort(nums.begin(),nums.end());</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i + <span class="number">2</span> < nums.size() ; ++i) <span class="comment">//注意如果是i < nums.size()-2,数组为空时会发生下溢</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(nums[i] > <span class="number">0</span>) <span class="keyword">break</span>; <span class="comment">//后面的数字均大于0,故不存在符合条件的结果</span></span><br><span class="line"> <span class="keyword">if</span>(i > <span class="number">0</span> && nums[i] == nums[i<span class="number">-1</span>]) <span class="keyword">continue</span>; <span class="comment">//以nums[i-1]开头的3个数的组合已经判断过</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">int</span> target = - nums[i];</span><br><span class="line"> <span class="keyword">int</span> l = i + <span class="number">1</span>, r = nums.size() - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span>(l < r)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> sum = nums[l] + nums[r];</span><br><span class="line"> <span class="keyword">if</span>(sum == target)</span><br><span class="line"> {</span><br><span class="line"> res.push_back({nums[i],nums[l],nums[r]});</span><br><span class="line"> l++;</span><br><span class="line"> r--;</span><br><span class="line"> <span class="keyword">while</span>(l < r && nums[l] == nums[l<span class="number">-1</span>]) l++;</span><br><span class="line"> <span class="keyword">while</span>(l < r && nums[r] == nums[r+<span class="number">1</span>]) r--;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(sum < target) l++;</span><br><span class="line"> <span class="keyword">if</span>(sum > target) r--;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 数组 </tag>
<tag> 双指针 </tag>
</tags>
</entry>
<entry>
<title>leetcode 14. 最长公共前缀</title>
<link href="/2020/08/26/leetcode-14/"/>
<url>/2020/08/26/leetcode-14/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p><strong>ps:i表示每个字符串对应的同一个索引,j表示对应第几个字符串,只有所有元素都是共有的才能执行完循环到最后一步,即可返回任意的字符串</strong></p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">string</span> <span class="title">longestCommonPrefix</span><span class="params">(<span class="built_in">vector</span><<span class="built_in">string</span>>& strs)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(strs.size()==<span class="number">0</span>) <span class="keyword">return</span> <span class="string">""</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i<strs[<span class="number">0</span>].size();i++)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j=<span class="number">1</span>;j<strs.size();j++) </span><br><span class="line"> <span class="keyword">if</span>(strs[j][i]!=strs[<span class="number">0</span>][i]) </span><br><span class="line"> <span class="keyword">return</span> strs[<span class="number">0</span>].substr(<span class="number">0</span>,i); </span><br><span class="line"> <span class="comment">//substr取前i个元素,因为终止循环的索引i对应的是第i+1个元素不是共有的,所以前i个元素是共有前缀</span></span><br><span class="line"> <span class="keyword">return</span> strs[<span class="number">0</span>];</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 字符串 </tag>
<tag> 双指针 </tag>
</tags>
</entry>
<entry>
<title>leetcode 13. 罗马数字转整数</title>
<link href="/2020/08/26/leetcode-13/"/>
<url>/2020/08/26/leetcode-13/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="map"><a href="#map" class="headerlink" title="map"></a>map</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">romanToInt</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="built_in">unordered_map</span><<span class="keyword">char</span>,<span class="keyword">int</span>> m = {{<span class="string">'I'</span>,<span class="number">1</span>}, {<span class="string">'V'</span>,<span class="number">5</span>}, {<span class="string">'X'</span>,<span class="number">10</span>},{<span class="string">'L'</span>,<span class="number">50</span>},{<span class="string">'C'</span>,<span class="number">100</span>}, {<span class="string">'D'</span>,<span class="number">500</span>},{<span class="string">'M'</span>,<span class="number">1000</span>}};</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span> ; i < s.size(); ++i)</span><br><span class="line"> m[s[i]] < m[s[i+<span class="number">1</span>]] ? sum -= m[s[i]]: sum += m[s[i]];</span><br><span class="line"> <span class="keyword">return</span> sum;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="数组-效率很高"><a href="#数组-效率很高" class="headerlink" title="数组(效率很高)"></a>数组(效率很高)</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">romanToInt</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> m[<span class="number">90</span>] = {};</span><br><span class="line"> m[<span class="string">'I'</span>] = <span class="number">1</span>;</span><br><span class="line"> m[<span class="string">'V'</span>] = <span class="number">5</span>;</span><br><span class="line"> m[<span class="string">'X'</span>] = <span class="number">10</span>;</span><br><span class="line"> m[<span class="string">'L'</span>] = <span class="number">50</span>;</span><br><span class="line"> m[<span class="string">'C'</span>] = <span class="number">100</span>;</span><br><span class="line"> m[<span class="string">'D'</span>] = <span class="number">500</span>;</span><br><span class="line"> m[<span class="string">'M'</span>] = <span class="number">1000</span>;</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>; </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span> ; i < s.size(); ++i)</span><br><span class="line"> m[s[i]] < m[s[i+<span class="number">1</span>]] ? sum -= m[s[i]]: sum += m[s[i]];</span><br><span class="line"> <span class="keyword">return</span> sum;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 哈希表 </tag>
<tag> 数学 </tag>
<tag> 字符串 </tag>
<tag> map </tag>
</tags>
</entry>
<entry>
<title>leetcode 11. 盛最多水的容器</title>
<link href="/2020/08/26/leetcode-11/"/>
<url>/2020/08/26/leetcode-11/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>1.设定双指针left和right<br>2.v = (right - left) * min(h[left],h[right]),因为无论移动哪个指针,right-left都会变小,要想得到v的最大值,我们只能使min(h[left],h[right])增大,所以需要不断移动高度较小的那个指针。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">maxArea</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& h)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> left = <span class="number">0</span>,right = h.size()<span class="number">-1</span>,res = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(left < right)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">int</span> v = (right - left) * min(h[left],h[right]); <span class="comment">//此时能盛水的体积</span></span><br><span class="line"> res = max(res,v);</span><br><span class="line"> h[left] < h[right] ? ++left : --right; <span class="comment">//移动高度较小的指针</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 数组 </tag>
<tag> 双指针 </tag>
</tags>
</entry>
<entry>
<title>leetcode 7.整数反转</title>
<link href="/2020/08/26/leetcode-7/"/>
<url>/2020/08/26/leetcode-7/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h3><p>神奇的一道题,debug n次</p><p>ps: if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7))<br> 官方的第二个判断条件中判断了pop的值,来判断是否越界,但是由于题目给定的是int型的数据,范围为-2147483648到2147483647,所以逆序输出的时候,当rev == INT_MAX,rev== INT_MIN,第十位的数字加入的即是原来的首位,pop只能在-2到2之间,就不会大于7或者小于-8,造成越界了。</p><p>所以在本题中省略了第二个判断条件,情况较为特殊,一般情况下还是要考虑第二个条件。</p><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">reverse</span><span class="params">(<span class="keyword">int</span> x)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> res = <span class="number">0</span>; <span class="comment">//res表示结果</span></span><br><span class="line"> <span class="keyword">while</span>(x != <span class="number">0</span>) </span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(res > INT_MAX / <span class="number">10</span>) <span class="keyword">return</span> <span class="number">0</span>; <span class="comment">//判断是否将要发生越界</span></span><br><span class="line"> <span class="keyword">if</span>(res < INT_MIN / <span class="number">10</span>) <span class="keyword">return</span> <span class="number">0</span>; </span><br><span class="line"> res *= <span class="number">10</span>; </span><br><span class="line"> res = res + x % <span class="number">10</span>; </span><br><span class="line"> x = x / <span class="number">10</span>; </span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 数学 </tag>
</tags>
</entry>
<entry>
<title>leetcode 5. 最长回文子串</title>
<link href="/2020/08/23/leetcode-5/"/>
<url>/2020/08/23/leetcode-5/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="1中心扩散"><a href="#1中心扩散" class="headerlink" title="1中心扩散"></a>1中心扩散</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">class Solution {</span><br><span class="line">public:</span><br><span class="line"> void help(const string &s, int left, int right, int& start, int& maxlen){ //中心扩散</span><br><span class="line"> while(left >= 0 && right < s.size())</span><br><span class="line"> {</span><br><span class="line"> if(s[left] != s[right]) break; </span><br><span class="line"> --left;</span><br><span class="line"> ++right; </span><br><span class="line"> } </span><br><span class="line"> if(right - left - 1 > maxlen ) //退出循环时,串的区间实际上是[left+1,right-1]</span><br><span class="line"> { //区间长度,为(right - 1) - (left + 1) + 1 = right -left - 1</span><br><span class="line"> start = left + 1;</span><br><span class="line"> maxlen = right -left - 1;</span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> string longestPalindrome(string s) {</span><br><span class="line"> int start = 0, maxlen = 0;</span><br><span class="line"> for(int i = 0; i < s.size(); ++i)</span><br><span class="line"> {</span><br><span class="line"> help(s,i,i,start,maxlen); </span><br><span class="line"> help(s,i,i+1,start,maxlen);</span><br><span class="line"> }</span><br><span class="line"> return s.substr(start,maxlen);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="2动态规划"><a href="#2动态规划" class="headerlink" title="2动态规划"></a>2动态规划</h3><p>dp[i][j] 表示对应 i 到 j 的区间是否是回文串</p><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">string</span> <span class="title">longestPalindrome</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="keyword">if</span>(s.size() < <span class="number">2</span>) <span class="keyword">return</span> s;</span><br><span class="line"> <span class="keyword">int</span> start = <span class="number">0</span>, maxlen = <span class="number">1</span>, n = s.size();</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="built_in">vector</span><<span class="keyword">int</span>>> <span class="title">dp</span> <span class="params">(n,<span class="built_in">vector</span><<span class="keyword">int</span>>(n))</span></span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < n; ++i)</span><br><span class="line"> dp[i][i] = <span class="literal">true</span>; <span class="comment">//对角线均为true,因为一个元素肯定是回文子串</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = <span class="number">1</span>; j < n; ++j)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < j; ++i)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(s[i] != s[j]) dp[i][j] = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>((j<span class="number">-1</span>) - (i+<span class="number">1</span>) + <span class="number">1</span> < <span class="number">2</span>) dp[i][j] = <span class="literal">true</span>; <span class="comment">//如果内部区间长度小于等于1</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(dp[i+<span class="number">1</span>][j<span class="number">-1</span>]) dp[i][j] = <span class="literal">true</span>; <span class="comment">//看内部区间是否是回文</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(dp[i][j] && j - i + <span class="number">1</span> > maxlen) </span><br><span class="line"> {</span><br><span class="line"> start = i;</span><br><span class="line"> maxlen = j - i + <span class="number">1</span>; </span><br><span class="line"> } </span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> s.substr(start,maxlen);</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 字符串 </tag>
<tag> 动态规划 </tag>
</tags>
</entry>
<entry>
<title>leetcode 3. 无重复字符的最长子串</title>
<link href="/2020/08/23/leetcode-3/"/>
<url>/2020/08/23/leetcode-3/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>基本思想就是将串分段进行遍历,变更start的位置</p><h3 id="代码1"><a href="#代码1" class="headerlink" title="代码1"></a>代码1</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">lengthOfLongestSubstring</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> m[<span class="number">128</span>] = {<span class="number">0</span>}, len = <span class="number">0</span>, start = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < s.size(); ++i)</span><br><span class="line"> {</span><br><span class="line"> ++m[s[i]];</span><br><span class="line"> <span class="keyword">while</span>(m[s[i]] == <span class="number">2</span>) <span class="comment">//当出现重复时,不断右移start,直至上次出现s[i]的右边,就为新的子串起点</span></span><br><span class="line"> --m[s[start++]]; <span class="comment">//右移的同时,对map中的值依次-1</span></span><br><span class="line"> len = max(len,i - start + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> len;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="代码2"><a href="#代码2" class="headerlink" title="代码2"></a>代码2</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="keyword">int</span> <span class="title">lengthOfLongestSubstring</span><span class="params">(<span class="built_in">string</span> s)</span> </span>{</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">map</span><span class="params">(<span class="number">128</span>, <span class="number">-1</span>)</span></span>; <span class="comment">//int map[128] = {-1}会出错;这只让第一个值为-1,其余的还是为0</span></span><br><span class="line"> <span class="keyword">int</span> len = <span class="number">0</span>,start = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < s.size(); i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(<span class="built_in">map</span>[s[i]] >= start) <span class="comment">//此时还未进行本轮赋值,如果大于start,表示s[i]已经赋值过,在本段中出现过</span></span><br><span class="line"> start = <span class="built_in">map</span>[s[i]] + <span class="number">1</span>; <span class="comment">//map[s[i]]记录上次出现本字符的位置,+1更新start为新的子串起始位置</span></span><br><span class="line"> <span class="built_in">map</span>[s[i]] = i; </span><br><span class="line"> len = max(len,i - start + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> len;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 哈希表 </tag>
<tag> 字符串 </tag>
<tag> 双指针 </tag>
<tag> 滑动窗口 </tag>
</tags>
</entry>
<entry>
<title>leetcode 2. 两数相加</title>
<link href="/2020/08/23/leetcode-2/"/>
<url>/2020/08/23/leetcode-2/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><h3 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function">ListNode* <span class="title">addTwoNumbers</span><span class="params">(ListNode* l1, ListNode* l2)</span> </span>{</span><br><span class="line"> <span class="function">ListNode <span class="title">dummy</span> <span class="params">(<span class="number">0</span>)</span></span>;</span><br><span class="line"> ListNode* p = &dummy;</span><br><span class="line"> <span class="keyword">int</span> sum = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span>(l1 || l2 || sum)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(l1) </span><br><span class="line"> { </span><br><span class="line"> sum += l1->val;</span><br><span class="line"> l1 = l1->next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(l2) </span><br><span class="line"> {</span><br><span class="line"> sum += l2->val;</span><br><span class="line"> l2 = l2->next;</span><br><span class="line"> }</span><br><span class="line"> p->next = <span class="keyword">new</span> ListNode(sum % <span class="number">10</span>); <span class="comment">//sum % 10为当前位的值</span></span><br><span class="line"> p = p->next;</span><br><span class="line"> sum /= <span class="number">10</span>; <span class="comment">//sum/10为进位的值,并用做下一次求和的初值</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dummy.next;</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 链表 </tag>
</tags>
</entry>
<entry>
<title>leetcode 1. 两数之和</title>
<link href="/2020/08/23/leetcode-1/"/>
<url>/2020/08/23/leetcode-1/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>ps:对于存在重复元素的情况,用一遍哈希和两遍哈希确实会得到不同的结果,但是都是符合题目要求的。 题目描述确实有点含糊,但是这个题目的本意是让我们练习哈希表,题目说到You may assume that each input would have exactly one solution,即您可以假设每个输入都只有一个解决方案。</p><h3 id="两遍哈希"><a href="#两遍哈希" class="headerlink" title="两遍哈希"></a>两遍哈希</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">twoSum</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="built_in">unordered_map</span><<span class="keyword">int</span>,<span class="keyword">int</span>> m;</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i<nums.size(); i++)</span><br><span class="line"> m[nums[i]] = i; <span class="comment">//向map中添加元素 </span></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i<nums.size(); i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(m.find(target-nums[i]) != m.end() && m[target-nums[i]] != i) <span class="comment">//如果m中存在对应的键值,且不为i</span></span><br><span class="line"> <span class="keyword">return</span> {i, m[target-nums[i]]};</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> {};</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="一遍哈希"><a href="#一遍哈希" class="headerlink" title="一遍哈希"></a>一遍哈希</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">twoSum</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="built_in">unordered_map</span><<span class="keyword">int</span>,<span class="keyword">int</span>> m; </span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < nums.size(); i++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(m.find(target-nums[i]) != m.end()) <span class="keyword">return</span> {m[target-nums[i]], i}; </span><br><span class="line"> <span class="comment">// m[target-nums[i]]为已经加入map的元素的索引,所以小于本轮循环中的i,放在前面</span></span><br><span class="line"> m[nums[i]] = i; <span class="comment">//向map中添加元素</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> {};</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure><h3 id="暴力解法"><a href="#暴力解法" class="headerlink" title="暴力解法"></a>暴力解法</h3><figure class="highlight cpp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span> {</span></span><br><span class="line"><span class="keyword">public</span>:</span><br><span class="line"> <span class="function"><span class="built_in">vector</span><<span class="keyword">int</span>> <span class="title">twoSum</span><span class="params">(<span class="built_in">vector</span><<span class="keyword">int</span>>& nums, <span class="keyword">int</span> target)</span> </span>{</span><br><span class="line"> <span class="keyword">int</span> len = nums.size();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> i = <span class="number">0</span>; i < len<span class="number">-1</span>; i++)</span><br><span class="line"> <span class="keyword">for</span>(<span class="keyword">int</span> j = i + <span class="number">1</span>; j < len; j++)</span><br><span class="line"> {</span><br><span class="line"> <span class="keyword">if</span>(nums[i] + nums[j] == target)</span><br><span class="line"> <span class="keyword">return</span> {i,j};</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> {};</span><br><span class="line"> }</span><br><span class="line">};</span><br></pre></td></tr></table></figure>]]></content>
<categories>
<category> leetcode </category>
</categories>
<tags>
<tag> 哈希表 </tag>
</tags>
</entry>
<entry>
<title>Hello World</title>
<link href="/2020/08/22/hello-world/"/>
<url>/2020/08/22/hello-world/</url>
<content type="html"><![CDATA[<link rel="stylesheet" class="aplayer-secondary-style-marker" href="\assets\css\APlayer.min.css"><script src="\assets\js\APlayer.min.js" class="aplayer-secondary-script-marker"></script><p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.</p><h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/writing.html">Writing</a></p><h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/server.html">Server</a></p><h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/generating.html">Generating</a></p><h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure><p>More info: <a href="https://hexo.io/docs/one-command-deployment.html">Deployment</a></p>]]></content>
</entry>
</search>