Skip to content

Commit f00b06e

Browse files
authored
Merge branch 'youngyangyang04:master' into master
2 parents 3d0ce43 + 451fbe1 commit f00b06e

14 files changed

+433
-40
lines changed

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

Lines changed: 37 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -390,52 +390,49 @@ class Solution:
390390

391391
```go
392392
func searchRange(nums []int, target int) []int {
393-
leftBorder := searchLeftBorder(nums, target)
394-
rightBorder := searchRightBorder(nums, target)
395-
396-
if leftBorder == -2 || rightBorder == -2 { // 情况一
397-
return []int{-1, -1}
398-
} else if rightBorder-leftBorder > 1 { // 情况三
399-
return []int{leftBorder + 1, rightBorder - 1}
400-
} else { // 情况二
401-
return []int{-1, -1}
402-
}
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}
403405
}
404406

405-
func searchLeftBorder(nums []int, target int) int {
406-
left, right := 0, len(nums)-1
407-
leftBorder := -2 // 记录一下leftBorder没有被赋值的情况
408-
for left <= right {
409-
middle := (left + right) / 2
410-
if target == nums[middle] {
411-
right = middle - 1
412-
// 左边界leftBorder更新
413-
leftBorder = right
414-
} else if target > nums[middle] {
415-
left = middle + 1
416-
} else {
417-
right = middle - 1
418-
}
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
419417
}
420-
return leftBorder
418+
}
419+
return border
421420
}
422421

423-
func searchRightBorder(nums []int, target int) int {
424-
left, right := 0, len(nums)-1
425-
rightBorder := -2 // 记录一下rightBorder没有被赋值的情况
426-
for left <= right {
427-
middle := (left + right) / 2
428-
if target == nums[middle] {
429-
left = middle + 1
430-
// 右边界rightBorder更新
431-
rightBorder = left
432-
} else if target > nums[middle] {
433-
left = middle + 1
434-
} else {
435-
right = middle - 1
436-
}
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
437432
}
438-
return rightBorder
433+
}
434+
return border
435+
439436
}
440437
```
441438

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>

problems/0142.环形链表II.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,30 @@ var detectCycle = function(head) {
294294
};
295295
```
296296

297+
TypeScript:
298+
299+
```typescript
300+
function detectCycle(head: ListNode | null): ListNode | null {
301+
let slowNode: ListNode | null = head,
302+
fastNode: ListNode | null = head;
303+
while (fastNode !== null && fastNode.next !== null) {
304+
slowNode = (slowNode as ListNode).next;
305+
fastNode = fastNode.next.next;
306+
if (slowNode === fastNode) {
307+
slowNode = head;
308+
while (slowNode !== fastNode) {
309+
slowNode = (slowNode as ListNode).next;
310+
fastNode = (fastNode as ListNode).next;
311+
}
312+
return slowNode;
313+
}
314+
}
315+
return null;
316+
};
317+
```
318+
297319
Swift:
320+
298321
```swift
299322
class Solution {
300323
func detectCycle(_ head: ListNode?) -> ListNode? {

problems/0202.快乐数.md

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,27 @@ var isHappy = function(n) {
232232
};
233233
```
234234

235+
TypeScript:
236+
237+
```typescript
238+
function isHappy(n: number): boolean {
239+
// Utils
240+
// 计算val各位的平方和
241+
function calcSum(val: number): number {
242+
return String(val).split("").reduce((pre, cur) => (pre + Number(cur) * Number(cur)), 0);
243+
}
244+
245+
let storeSet: Set<number> = new Set();
246+
while (n !== 1 && !storeSet.has(n)) {
247+
storeSet.add(n);
248+
n = calcSum(n);
249+
}
250+
return n === 1;
251+
};
252+
```
253+
235254
Swift:
255+
236256
```swift
237257
// number 每个位置上的数字的平方和
238258
func getSum(_ number: Int) -> Int {

problems/0242.有效的字母异位词.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,23 @@ var isAnagram = function(s, t) {
214214
};
215215
```
216216

217+
TypeScript:
218+
219+
```typescript
220+
function isAnagram(s: string, t: string): boolean {
221+
if (s.length !== t.length) return false;
222+
let helperArr: number[] = new Array(26).fill(0);
223+
let pivot: number = 'a'.charCodeAt(0);
224+
for (let i = 0, length = s.length; i < length; i++) {
225+
helperArr[s.charCodeAt(i) - pivot]++;
226+
helperArr[t.charCodeAt(i) - pivot]--;
227+
}
228+
return helperArr.every(i => i === 0);
229+
};
230+
```
231+
217232
Swift:
233+
218234
```Swift
219235
func isAnagram(_ s: String, _ t: String) -> Bool {
220236
if s.count != t.count {

0 commit comments

Comments
 (0)