Skip to content

Commit 85bd6fa

Browse files
authored
Merge branch 'youngyangyang04:master' into master
2 parents 1a99325 + 728fe17 commit 85bd6fa

19 files changed

+807
-0
lines changed

problems/0019.删除链表的倒数第N个节点.md

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,7 +181,71 @@ var removeNthFromEnd = function(head, n) {
181181
return ret.next;
182182
};
183183
```
184+
TypeScript:
185+
186+
版本一(快慢指针法):
187+
188+
```typescript
189+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
190+
let newHead: ListNode | null = new ListNode(0, head);
191+
let slowNode: ListNode | null = newHead,
192+
fastNode: ListNode | null = newHead;
193+
for (let i = 0; i < n; i++) {
194+
fastNode = fastNode.next;
195+
}
196+
while (fastNode.next) {
197+
fastNode = fastNode.next;
198+
slowNode = slowNode.next;
199+
}
200+
slowNode.next = slowNode.next.next;
201+
return newHead.next;
202+
};
203+
```
204+
205+
版本二(计算节点总数法):
206+
207+
```typescript
208+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
209+
let curNode: ListNode | null = head;
210+
let listSize: number = 0;
211+
while (curNode) {
212+
curNode = curNode.next;
213+
listSize++;
214+
}
215+
if (listSize === n) {
216+
head = head.next;
217+
} else {
218+
curNode = head;
219+
for (let i = 0; i < listSize - n - 1; i++) {
220+
curNode = curNode.next;
221+
}
222+
curNode.next = curNode.next.next;
223+
}
224+
return head;
225+
};
226+
```
227+
228+
版本三(递归倒退n法):
229+
230+
```typescript
231+
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
232+
let newHead: ListNode | null = new ListNode(0, head);
233+
let cnt = 0;
234+
function recur(node) {
235+
if (node === null) return;
236+
recur(node.next);
237+
cnt++;
238+
if (cnt === n + 1) {
239+
node.next = node.next.next;
240+
}
241+
}
242+
recur(newHead);
243+
return newHead.next;
244+
};
245+
```
246+
184247
Kotlin:
248+
185249
```Kotlin
186250
fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? {
187251
val pre = ListNode(0).apply {

problems/0024.两两交换链表中的节点.md

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,38 @@ var swapPairs = function (head) {
250250
};
251251
```
252252

253+
TypeScript:
254+
255+
```typescript
256+
function swapPairs(head: ListNode | null): ListNode | null {
257+
/**
258+
* 初始状态:
259+
* curNode -> node1 -> node2 -> tmepNode
260+
* 转换过程:
261+
* curNode -> node2
262+
* curNode -> node2 -> node1
263+
* curNode -> node2 -> node1 -> tempNode
264+
* curNode = node1
265+
*/
266+
let retNode: ListNode | null = new ListNode(0, head),
267+
curNode: ListNode | null = retNode,
268+
node1: ListNode | null = null,
269+
node2: ListNode | null = null,
270+
tempNode: ListNode | null = null;
271+
272+
while (curNode && curNode.next && curNode.next.next) {
273+
node1 = curNode.next;
274+
node2 = curNode.next.next;
275+
tempNode = node2.next;
276+
curNode.next = node2;
277+
node2.next = node1;
278+
node1.next = tempNode;
279+
curNode = node1;
280+
}
281+
return retNode.next;
282+
};
283+
```
284+
253285
Kotlin:
254286

255287
```kotlin

problems/0034.在排序数组中查找元素的第一个和最后一个位置.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,51 @@ class Solution:
389389
### Go
390390

391391
```go
392+
func searchRange(nums []int, target int) []int {
393+
leftBorder := getLeft(nums, target)
394+
rightBorder := getRight(nums, target)
395+
// 情况一
396+
if leftBorder == -2 || rightBorder == -2 {
397+
return []int{-1, -1}
398+
}
399+
// 情况三
400+
if rightBorder - leftBorder > 1 {
401+
return []int{leftBorder + 1, rightBorder - 1}
402+
}
403+
// 情况二
404+
return []int{-1, -1}
405+
}
406+
407+
func getLeft(nums []int, target int) int {
408+
left, right := 0, len(nums)-1
409+
border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二
410+
for left <= right { // []闭区间
411+
mid := left + ((right - left) >> 1)
412+
if nums[mid] >= target { // 找到第一个等于target的位置
413+
right = mid - 1
414+
border = right
415+
} else {
416+
left = mid + 1
417+
}
418+
}
419+
return border
420+
}
421+
422+
func getRight(nums []int, target int) int {
423+
left, right := 0, len(nums) - 1
424+
border := -2
425+
for left <= right {
426+
mid := left + ((right - left) >> 1)
427+
if nums[mid] > target {
428+
right = mid - 1
429+
} else { // 找到第一个大于target的位置
430+
left = mid + 1
431+
border = left
432+
}
433+
}
434+
return border
435+
436+
}
392437
```
393438

394439
### JavaScript

problems/0059.螺旋矩阵II.md

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,6 +287,51 @@ var generateMatrix = function(n) {
287287

288288
```
289289

290+
TypeScript:
291+
292+
```typescript
293+
function generateMatrix(n: number): number[][] {
294+
let loopNum: number = Math.floor(n / 2);
295+
const resArr: number[][] = new Array(n).fill(1).map(i => new Array(n));
296+
let chunkNum: number = n - 1;
297+
let startX: number = 0;
298+
let startY: number = 0;
299+
let value: number = 1;
300+
let x: number, y: number;
301+
while (loopNum--) {
302+
x = startX;
303+
y = startY;
304+
while (x < startX + chunkNum) {
305+
resArr[y][x] = value;
306+
x++;
307+
value++;
308+
}
309+
while (y < startY + chunkNum) {
310+
resArr[y][x] = value;
311+
y++;
312+
value++;
313+
}
314+
while (x > startX) {
315+
resArr[y][x] = value;
316+
x--;
317+
value++;
318+
}
319+
while (y > startY) {
320+
resArr[y][x] = value;
321+
y--;
322+
value++;
323+
}
324+
startX++;
325+
startY++;
326+
chunkNum -= 2;
327+
}
328+
if (n % 2 === 1) {
329+
resArr[startX][startY] = value;
330+
}
331+
return resArr;
332+
};
333+
```
334+
290335
Go:
291336

292337
```go

problems/0062.不同路径.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,42 @@ var uniquePaths = function(m, n) {
347347
};
348348
```
349349

350+
### C
351+
```c
352+
//初始化dp数组
353+
int **initDP(int m, int n) {
354+
//动态开辟dp数组
355+
int **dp = (int**)malloc(sizeof(int *) * m);
356+
int i, j;
357+
for(i = 0; i < m; ++i) {
358+
dp[i] = (int *)malloc(sizeof(int) * n);
359+
}
360+
361+
//从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1
362+
for(i = 0; i < m; ++i)
363+
dp[i][0] = 1;
364+
for(j = 0; j < n; ++j)
365+
dp[0][j] = 1;
366+
return dp;
367+
}
368+
369+
int uniquePaths(int m, int n){
370+
//dp数组,dp[i][j]代表从dp[0][0]到dp[i][j]有几种走法
371+
int **dp = initDP(m, n);
372+
373+
int i, j;
374+
//到达dp[i][j]只能从dp[i-1][j]和dp[i][j-1]出发
375+
//dp[i][j] = dp[i-1][j] + dp[i][j-1]
376+
for(i = 1; i < m; ++i) {
377+
for(j = 1; j < n; ++j) {
378+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
379+
}
380+
}
381+
int result = dp[m-1][n-1];
382+
free(dp);
383+
return result;
384+
}
385+
```
350386
351387
-----------------------
352388
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0063.不同路径II.md

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,60 @@ var uniquePathsWithObstacles = function(obstacleGrid) {
333333
};
334334
```
335335

336+
C
337+
```c
338+
//初始化dp数组
339+
int **initDP(int m, int n, int** obstacleGrid) {
340+
int **dp = (int**)malloc(sizeof(int*) * m);
341+
int i, j;
342+
//初始化每一行数组
343+
for(i = 0; i < m; ++i) {
344+
dp[i] = (int*)malloc(sizeof(int) * n);
345+
}
346+
347+
//先将第一行第一列设为0
348+
for(i = 0; i < m; ++i) {
349+
dp[i][0] = 0;
350+
}
351+
for(j = 0; j < n; ++j) {
352+
dp[0][j] = 0;
353+
}
354+
355+
//若碰到障碍,之后的都走不了。退出循环
356+
for(i = 0; i < m; ++i) {
357+
if(obstacleGrid[i][0]) {
358+
break;
359+
}
360+
dp[i][0] = 1;
361+
}
362+
for(j = 0; j < n; ++j) {
363+
if(obstacleGrid[0][j])
364+
break;
365+
dp[0][j] = 1;
366+
}
367+
return dp;
368+
}
369+
370+
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
371+
int m = obstacleGridSize, n = *obstacleGridColSize;
372+
//初始化dp数组
373+
int **dp = initDP(m, n, obstacleGrid);
374+
375+
int i, j;
376+
for(i = 1; i < m; ++i) {
377+
for(j = 1; j < n; ++j) {
378+
//若当前i,j位置有障碍
379+
if(obstacleGrid[i][j])
380+
//路线不同
381+
dp[i][j] = 0;
382+
else
383+
dp[i][j] = dp[i-1][j] + dp[i][j-1];
384+
}
385+
}
386+
//返回最后终点的路径个数
387+
return dp[m-1][n-1];
388+
}
389+
```
336390
337391
-----------------------
338392
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

problems/0070.爬楼梯.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,48 @@ var climbStairs = function(n) {
296296
};
297297
```
298298

299+
### C
300+
```c
301+
int climbStairs(int n){
302+
//若n<=2,返回n
303+
if(n <= 2)
304+
return n;
305+
//初始化dp数组,数组大小为n+1
306+
int *dp = (int *)malloc(sizeof(int) * (n + 1));
307+
dp[0] = 0, dp[1] = 1, dp[2] = 2;
308+
309+
//从前向后遍历数组,dp[i] = dp[i-1] + dp[i-2]
310+
int i;
311+
for(i = 3; i <= n; ++i) {
312+
dp[i] = dp[i - 1] + dp[i - 2];
313+
}
314+
//返回dp[n]
315+
return dp[n];
316+
}
317+
```
318+
319+
优化空间复杂度:
320+
```c
321+
int climbStairs(int n){
322+
//若n<=2,返回n
323+
if(n <= 2)
324+
return n;
325+
//初始化dp数组,数组大小为3
326+
int *dp = (int *)malloc(sizeof(int) * 3);
327+
dp[1] = 1, dp[2] = 2;
328+
329+
//只记录前面两个台阶的状态
330+
int i;
331+
for(i = 3; i <= n; ++i) {
332+
int sum = dp[1] + dp[2];
333+
dp[1] = dp[2];
334+
dp[2] = sum;
335+
}
336+
//返回dp[2]
337+
return dp[2];
338+
}
339+
```
340+
299341

300342
-----------------------
301343
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>

0 commit comments

Comments
 (0)