mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-08 00:43:04 +08:00
Merge branch 'youngyangyang04:master' into master
This commit is contained in:
@ -181,7 +181,71 @@ var removeNthFromEnd = function(head, n) {
|
||||
return ret.next;
|
||||
};
|
||||
```
|
||||
TypeScript:
|
||||
|
||||
版本一(快慢指针法):
|
||||
|
||||
```typescript
|
||||
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
|
||||
let newHead: ListNode | null = new ListNode(0, head);
|
||||
let slowNode: ListNode | null = newHead,
|
||||
fastNode: ListNode | null = newHead;
|
||||
for (let i = 0; i < n; i++) {
|
||||
fastNode = fastNode.next;
|
||||
}
|
||||
while (fastNode.next) {
|
||||
fastNode = fastNode.next;
|
||||
slowNode = slowNode.next;
|
||||
}
|
||||
slowNode.next = slowNode.next.next;
|
||||
return newHead.next;
|
||||
};
|
||||
```
|
||||
|
||||
版本二(计算节点总数法):
|
||||
|
||||
```typescript
|
||||
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
|
||||
let curNode: ListNode | null = head;
|
||||
let listSize: number = 0;
|
||||
while (curNode) {
|
||||
curNode = curNode.next;
|
||||
listSize++;
|
||||
}
|
||||
if (listSize === n) {
|
||||
head = head.next;
|
||||
} else {
|
||||
curNode = head;
|
||||
for (let i = 0; i < listSize - n - 1; i++) {
|
||||
curNode = curNode.next;
|
||||
}
|
||||
curNode.next = curNode.next.next;
|
||||
}
|
||||
return head;
|
||||
};
|
||||
```
|
||||
|
||||
版本三(递归倒退n法):
|
||||
|
||||
```typescript
|
||||
function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
|
||||
let newHead: ListNode | null = new ListNode(0, head);
|
||||
let cnt = 0;
|
||||
function recur(node) {
|
||||
if (node === null) return;
|
||||
recur(node.next);
|
||||
cnt++;
|
||||
if (cnt === n + 1) {
|
||||
node.next = node.next.next;
|
||||
}
|
||||
}
|
||||
recur(newHead);
|
||||
return newHead.next;
|
||||
};
|
||||
```
|
||||
|
||||
Kotlin:
|
||||
|
||||
```Kotlin
|
||||
fun removeNthFromEnd(head: ListNode?, n: Int): ListNode? {
|
||||
val pre = ListNode(0).apply {
|
||||
|
@ -250,6 +250,38 @@ var swapPairs = function (head) {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function swapPairs(head: ListNode | null): ListNode | null {
|
||||
/**
|
||||
* 初始状态:
|
||||
* curNode -> node1 -> node2 -> tmepNode
|
||||
* 转换过程:
|
||||
* curNode -> node2
|
||||
* curNode -> node2 -> node1
|
||||
* curNode -> node2 -> node1 -> tempNode
|
||||
* curNode = node1
|
||||
*/
|
||||
let retNode: ListNode | null = new ListNode(0, head),
|
||||
curNode: ListNode | null = retNode,
|
||||
node1: ListNode | null = null,
|
||||
node2: ListNode | null = null,
|
||||
tempNode: ListNode | null = null;
|
||||
|
||||
while (curNode && curNode.next && curNode.next.next) {
|
||||
node1 = curNode.next;
|
||||
node2 = curNode.next.next;
|
||||
tempNode = node2.next;
|
||||
curNode.next = node2;
|
||||
node2.next = node1;
|
||||
node1.next = tempNode;
|
||||
curNode = node1;
|
||||
}
|
||||
return retNode.next;
|
||||
};
|
||||
```
|
||||
|
||||
Kotlin:
|
||||
|
||||
```kotlin
|
||||
|
@ -389,6 +389,51 @@ class Solution:
|
||||
### Go
|
||||
|
||||
```go
|
||||
func searchRange(nums []int, target int) []int {
|
||||
leftBorder := getLeft(nums, target)
|
||||
rightBorder := getRight(nums, target)
|
||||
// 情况一
|
||||
if leftBorder == -2 || rightBorder == -2 {
|
||||
return []int{-1, -1}
|
||||
}
|
||||
// 情况三
|
||||
if rightBorder - leftBorder > 1 {
|
||||
return []int{leftBorder + 1, rightBorder - 1}
|
||||
}
|
||||
// 情况二
|
||||
return []int{-1, -1}
|
||||
}
|
||||
|
||||
func getLeft(nums []int, target int) int {
|
||||
left, right := 0, len(nums)-1
|
||||
border := -2 // 记录border没有被赋值的情况;这里不能赋值-1,target = num[0]时,会无法区分情况一和情况二
|
||||
for left <= right { // []闭区间
|
||||
mid := left + ((right - left) >> 1)
|
||||
if nums[mid] >= target { // 找到第一个等于target的位置
|
||||
right = mid - 1
|
||||
border = right
|
||||
} else {
|
||||
left = mid + 1
|
||||
}
|
||||
}
|
||||
return border
|
||||
}
|
||||
|
||||
func getRight(nums []int, target int) int {
|
||||
left, right := 0, len(nums) - 1
|
||||
border := -2
|
||||
for left <= right {
|
||||
mid := left + ((right - left) >> 1)
|
||||
if nums[mid] > target {
|
||||
right = mid - 1
|
||||
} else { // 找到第一个大于target的位置
|
||||
left = mid + 1
|
||||
border = left
|
||||
}
|
||||
}
|
||||
return border
|
||||
|
||||
}
|
||||
```
|
||||
|
||||
### JavaScript
|
||||
|
@ -287,6 +287,51 @@ var generateMatrix = function(n) {
|
||||
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function generateMatrix(n: number): number[][] {
|
||||
let loopNum: number = Math.floor(n / 2);
|
||||
const resArr: number[][] = new Array(n).fill(1).map(i => new Array(n));
|
||||
let chunkNum: number = n - 1;
|
||||
let startX: number = 0;
|
||||
let startY: number = 0;
|
||||
let value: number = 1;
|
||||
let x: number, y: number;
|
||||
while (loopNum--) {
|
||||
x = startX;
|
||||
y = startY;
|
||||
while (x < startX + chunkNum) {
|
||||
resArr[y][x] = value;
|
||||
x++;
|
||||
value++;
|
||||
}
|
||||
while (y < startY + chunkNum) {
|
||||
resArr[y][x] = value;
|
||||
y++;
|
||||
value++;
|
||||
}
|
||||
while (x > startX) {
|
||||
resArr[y][x] = value;
|
||||
x--;
|
||||
value++;
|
||||
}
|
||||
while (y > startY) {
|
||||
resArr[y][x] = value;
|
||||
y--;
|
||||
value++;
|
||||
}
|
||||
startX++;
|
||||
startY++;
|
||||
chunkNum -= 2;
|
||||
}
|
||||
if (n % 2 === 1) {
|
||||
resArr[startX][startY] = value;
|
||||
}
|
||||
return resArr;
|
||||
};
|
||||
```
|
||||
|
||||
Go:
|
||||
|
||||
```go
|
||||
|
@ -347,6 +347,42 @@ var uniquePaths = function(m, n) {
|
||||
};
|
||||
```
|
||||
|
||||
### C
|
||||
```c
|
||||
//初始化dp数组
|
||||
int **initDP(int m, int n) {
|
||||
//动态开辟dp数组
|
||||
int **dp = (int**)malloc(sizeof(int *) * m);
|
||||
int i, j;
|
||||
for(i = 0; i < m; ++i) {
|
||||
dp[i] = (int *)malloc(sizeof(int) * n);
|
||||
}
|
||||
|
||||
//从0,0到i,0只有一种走法,所以dp[i][0]都是1,同理dp[0][j]也是1
|
||||
for(i = 0; i < m; ++i)
|
||||
dp[i][0] = 1;
|
||||
for(j = 0; j < n; ++j)
|
||||
dp[0][j] = 1;
|
||||
return dp;
|
||||
}
|
||||
|
||||
int uniquePaths(int m, int n){
|
||||
//dp数组,dp[i][j]代表从dp[0][0]到dp[i][j]有几种走法
|
||||
int **dp = initDP(m, n);
|
||||
|
||||
int i, j;
|
||||
//到达dp[i][j]只能从dp[i-1][j]和dp[i][j-1]出发
|
||||
//dp[i][j] = dp[i-1][j] + dp[i][j-1]
|
||||
for(i = 1; i < m; ++i) {
|
||||
for(j = 1; j < n; ++j) {
|
||||
dp[i][j] = dp[i-1][j] + dp[i][j-1];
|
||||
}
|
||||
}
|
||||
int result = dp[m-1][n-1];
|
||||
free(dp);
|
||||
return result;
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -333,6 +333,60 @@ var uniquePathsWithObstacles = function(obstacleGrid) {
|
||||
};
|
||||
```
|
||||
|
||||
C
|
||||
```c
|
||||
//初始化dp数组
|
||||
int **initDP(int m, int n, int** obstacleGrid) {
|
||||
int **dp = (int**)malloc(sizeof(int*) * m);
|
||||
int i, j;
|
||||
//初始化每一行数组
|
||||
for(i = 0; i < m; ++i) {
|
||||
dp[i] = (int*)malloc(sizeof(int) * n);
|
||||
}
|
||||
|
||||
//先将第一行第一列设为0
|
||||
for(i = 0; i < m; ++i) {
|
||||
dp[i][0] = 0;
|
||||
}
|
||||
for(j = 0; j < n; ++j) {
|
||||
dp[0][j] = 0;
|
||||
}
|
||||
|
||||
//若碰到障碍,之后的都走不了。退出循环
|
||||
for(i = 0; i < m; ++i) {
|
||||
if(obstacleGrid[i][0]) {
|
||||
break;
|
||||
}
|
||||
dp[i][0] = 1;
|
||||
}
|
||||
for(j = 0; j < n; ++j) {
|
||||
if(obstacleGrid[0][j])
|
||||
break;
|
||||
dp[0][j] = 1;
|
||||
}
|
||||
return dp;
|
||||
}
|
||||
|
||||
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize){
|
||||
int m = obstacleGridSize, n = *obstacleGridColSize;
|
||||
//初始化dp数组
|
||||
int **dp = initDP(m, n, obstacleGrid);
|
||||
|
||||
int i, j;
|
||||
for(i = 1; i < m; ++i) {
|
||||
for(j = 1; j < n; ++j) {
|
||||
//若当前i,j位置有障碍
|
||||
if(obstacleGrid[i][j])
|
||||
//路线不同
|
||||
dp[i][j] = 0;
|
||||
else
|
||||
dp[i][j] = dp[i-1][j] + dp[i][j-1];
|
||||
}
|
||||
}
|
||||
//返回最后终点的路径个数
|
||||
return dp[m-1][n-1];
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -296,6 +296,48 @@ var climbStairs = function(n) {
|
||||
};
|
||||
```
|
||||
|
||||
### C
|
||||
```c
|
||||
int climbStairs(int n){
|
||||
//若n<=2,返回n
|
||||
if(n <= 2)
|
||||
return n;
|
||||
//初始化dp数组,数组大小为n+1
|
||||
int *dp = (int *)malloc(sizeof(int) * (n + 1));
|
||||
dp[0] = 0, dp[1] = 1, dp[2] = 2;
|
||||
|
||||
//从前向后遍历数组,dp[i] = dp[i-1] + dp[i-2]
|
||||
int i;
|
||||
for(i = 3; i <= n; ++i) {
|
||||
dp[i] = dp[i - 1] + dp[i - 2];
|
||||
}
|
||||
//返回dp[n]
|
||||
return dp[n];
|
||||
}
|
||||
```
|
||||
|
||||
优化空间复杂度:
|
||||
```c
|
||||
int climbStairs(int n){
|
||||
//若n<=2,返回n
|
||||
if(n <= 2)
|
||||
return n;
|
||||
//初始化dp数组,数组大小为3
|
||||
int *dp = (int *)malloc(sizeof(int) * 3);
|
||||
dp[1] = 1, dp[2] = 2;
|
||||
|
||||
//只记录前面两个台阶的状态
|
||||
int i;
|
||||
for(i = 3; i <= n; ++i) {
|
||||
int sum = dp[1] + dp[2];
|
||||
dp[1] = dp[2];
|
||||
dp[2] = sum;
|
||||
}
|
||||
//返回dp[2]
|
||||
return dp[2];
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -574,7 +574,87 @@ var isSymmetric = function(root) {
|
||||
};
|
||||
```
|
||||
|
||||
## Swift:
|
||||
|
||||
> 递归
|
||||
```swift
|
||||
func isSymmetric(_ root: TreeNode?) -> Bool {
|
||||
return _isSymmetric(root?.left, right: root?.right)
|
||||
}
|
||||
func _isSymmetric(_ left: TreeNode?, right: TreeNode?) -> Bool {
|
||||
// 首先排除空节点情况
|
||||
if left == nil && right == nil {
|
||||
return true
|
||||
} else if left == nil && right != nil {
|
||||
return false
|
||||
} else if left != nil && right == nil {
|
||||
return false
|
||||
} else if left!.val != right!.val {
|
||||
// 进而排除数值不相等的情况
|
||||
return false
|
||||
}
|
||||
|
||||
// left 和 right 都不为空, 且数值也相等就递归
|
||||
let inSide = _isSymmetric(left!.right, right: right!.left)
|
||||
let outSide = _isSymmetric(left!.left, right: right!.right)
|
||||
return inSide && outSide
|
||||
}
|
||||
```
|
||||
|
||||
> 迭代 - 使用队列
|
||||
```swift
|
||||
func isSymmetric2(_ root: TreeNode?) -> Bool {
|
||||
guard let root = root else {
|
||||
return true
|
||||
}
|
||||
var queue = [TreeNode?]()
|
||||
queue.append(root.left)
|
||||
queue.append(root.right)
|
||||
while !queue.isEmpty {
|
||||
let left = queue.removeFirst()
|
||||
let right = queue.removeFirst()
|
||||
if left == nil && right == nil {
|
||||
continue
|
||||
}
|
||||
if left == nil || right == nil || left?.val != right?.val {
|
||||
return false
|
||||
}
|
||||
queue.append(left!.left)
|
||||
queue.append(right!.right)
|
||||
queue.append(left!.right)
|
||||
queue.append(right!.left)
|
||||
}
|
||||
return true
|
||||
}
|
||||
```
|
||||
|
||||
> 迭代 - 使用栈
|
||||
```swift
|
||||
func isSymmetric3(_ root: TreeNode?) -> Bool {
|
||||
guard let root = root else {
|
||||
return true
|
||||
}
|
||||
var stack = [TreeNode?]()
|
||||
stack.append(root.left)
|
||||
stack.append(root.right)
|
||||
while !stack.isEmpty {
|
||||
let left = stack.removeLast()
|
||||
let right = stack.removeLast()
|
||||
|
||||
if left == nil && right == nil {
|
||||
continue
|
||||
}
|
||||
if left == nil || right == nil || left?.val != right?.val {
|
||||
return false
|
||||
}
|
||||
stack.append(left!.left)
|
||||
stack.append(right!.right)
|
||||
stack.append(left!.right)
|
||||
stack.append(right!.left)
|
||||
}
|
||||
return true
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -653,5 +653,82 @@ int maxDepth(struct TreeNode* root){
|
||||
}
|
||||
```
|
||||
|
||||
## Swift
|
||||
|
||||
>二叉树最大深度
|
||||
```swift
|
||||
// 递归 - 后序
|
||||
func maxDepth1(_ root: TreeNode?) -> Int {
|
||||
return _maxDepth1(root)
|
||||
}
|
||||
func _maxDepth1(_ root: TreeNode?) -> Int {
|
||||
if root == nil {
|
||||
return 0
|
||||
}
|
||||
let leftDepth = _maxDepth1(root!.left)
|
||||
let rightDepth = _maxDepth1(root!.right)
|
||||
return 1 + max(leftDepth, rightDepth)
|
||||
}
|
||||
|
||||
// 层序
|
||||
func maxDepth(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var queue = [TreeNode]()
|
||||
queue.append(root)
|
||||
var res: Int = 0
|
||||
while !queue.isEmpty {
|
||||
res += 1
|
||||
for _ in 0 ..< queue.count {
|
||||
let node = queue.removeFirst()
|
||||
if let left = node.left {
|
||||
queue.append(left)
|
||||
}
|
||||
if let right = node.right {
|
||||
queue.append(right)
|
||||
}
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
>N叉树最大深度
|
||||
```swift
|
||||
// 递归
|
||||
func maxDepth(_ root: Node?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var depth = 0
|
||||
for node in root.children {
|
||||
depth = max(depth, maxDepth(node))
|
||||
}
|
||||
return depth + 1
|
||||
}
|
||||
|
||||
// 迭代-层序遍历
|
||||
func maxDepth1(_ root: Node?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var depth = 0
|
||||
var queue = [Node]()
|
||||
queue.append(root)
|
||||
while !queue.isEmpty {
|
||||
let size = queue.count
|
||||
depth += 1
|
||||
for _ in 0 ..< size {
|
||||
let node = queue.removeFirst()
|
||||
for child in node.children {
|
||||
queue.append(child)
|
||||
}
|
||||
}
|
||||
}
|
||||
return depth
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -404,8 +404,51 @@ var minDepth = function(root) {
|
||||
};
|
||||
```
|
||||
|
||||
## Swift
|
||||
|
||||
> 递归
|
||||
```Swift
|
||||
func minDepth(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
if root.left == nil && root.right != nil {
|
||||
return 1 + minDepth(root.right)
|
||||
}
|
||||
if root.left != nil && root.right == nil {
|
||||
return 1 + minDepth(root.left)
|
||||
}
|
||||
return 1 + min(minDepth(root.left), minDepth(root.right))
|
||||
}
|
||||
```
|
||||
|
||||
> 迭代
|
||||
```Swift
|
||||
func minDepth(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var res = 0
|
||||
var queue = [TreeNode]()
|
||||
queue.append(root)
|
||||
while !queue.isEmpty {
|
||||
res += 1
|
||||
for _ in 0 ..< queue.count {
|
||||
let node = queue.removeFirst()
|
||||
if node.left == nil && node.right == nil {
|
||||
return res
|
||||
}
|
||||
if let left = node.left {
|
||||
queue.append(left)
|
||||
}
|
||||
if let right = node.right {
|
||||
queue.append(right)
|
||||
}
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -294,7 +294,30 @@ var detectCycle = function(head) {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function detectCycle(head: ListNode | null): ListNode | null {
|
||||
let slowNode: ListNode | null = head,
|
||||
fastNode: ListNode | null = head;
|
||||
while (fastNode !== null && fastNode.next !== null) {
|
||||
slowNode = (slowNode as ListNode).next;
|
||||
fastNode = fastNode.next.next;
|
||||
if (slowNode === fastNode) {
|
||||
slowNode = head;
|
||||
while (slowNode !== fastNode) {
|
||||
slowNode = (slowNode as ListNode).next;
|
||||
fastNode = (fastNode as ListNode).next;
|
||||
}
|
||||
return slowNode;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
};
|
||||
```
|
||||
|
||||
Swift:
|
||||
|
||||
```swift
|
||||
class Solution {
|
||||
func detectCycle(_ head: ListNode?) -> ListNode? {
|
||||
|
@ -314,6 +314,54 @@ var reverseList = function(head) {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
// 双指针法
|
||||
function reverseList(head: ListNode | null): ListNode | null {
|
||||
let preNode: ListNode | null = null,
|
||||
curNode: ListNode | null = head,
|
||||
tempNode: ListNode | null;
|
||||
while (curNode) {
|
||||
tempNode = curNode.next;
|
||||
curNode.next = preNode;
|
||||
preNode = curNode;
|
||||
curNode = tempNode;
|
||||
}
|
||||
return preNode;
|
||||
};
|
||||
|
||||
// 递归(从前往后翻转)
|
||||
function reverseList(head: ListNode | null): ListNode | null {
|
||||
function recur(preNode: ListNode | null, curNode: ListNode | null): ListNode | null {
|
||||
if (curNode === null) return preNode;
|
||||
let tempNode: ListNode | null = curNode.next;
|
||||
curNode.next = preNode;
|
||||
preNode = curNode;
|
||||
curNode = tempNode;
|
||||
return recur(preNode, curNode);
|
||||
}
|
||||
return recur(null, head);
|
||||
};
|
||||
|
||||
// 递归(从后往前翻转)
|
||||
function reverseList(head: ListNode | null): ListNode | null {
|
||||
if (head === null) return null;
|
||||
let newHead: ListNode | null;
|
||||
function recur(node: ListNode | null, preNode: ListNode | null): void {
|
||||
if (node.next === null) {
|
||||
newHead = node;
|
||||
newHead.next = preNode;
|
||||
} else {
|
||||
recur(node.next, node);
|
||||
node.next = preNode;
|
||||
}
|
||||
}
|
||||
recur(head, null);
|
||||
return newHead;
|
||||
};
|
||||
```
|
||||
|
||||
Ruby:
|
||||
|
||||
```ruby
|
||||
|
@ -522,5 +522,73 @@ int countNodes(struct TreeNode* root){
|
||||
}
|
||||
```
|
||||
|
||||
## Swift:
|
||||
|
||||
> 递归
|
||||
```swift
|
||||
func countNodes(_ root: TreeNode?) -> Int {
|
||||
return _countNodes(root)
|
||||
}
|
||||
func _countNodes(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
let leftCount = _countNodes(root.left)
|
||||
let rightCount = _countNodes(root.right)
|
||||
return 1 + leftCount + rightCount
|
||||
}
|
||||
```
|
||||
|
||||
> 层序遍历
|
||||
```Swift
|
||||
func countNodes(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var res = 0
|
||||
var queue = [TreeNode]()
|
||||
queue.append(root)
|
||||
while !queue.isEmpty {
|
||||
let size = queue.count
|
||||
for _ in 0 ..< size {
|
||||
let node = queue.removeFirst()
|
||||
res += 1
|
||||
if let left = node.left {
|
||||
queue.append(left)
|
||||
}
|
||||
if let right = node.right {
|
||||
queue.append(right)
|
||||
}
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
> 利用完全二叉树性质
|
||||
```Swift
|
||||
func countNodes(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
var leftNode = root.left
|
||||
var rightNode = root.right
|
||||
var leftDepth = 0
|
||||
var rightDepth = 0
|
||||
while leftNode != nil {
|
||||
leftNode = leftNode!.left
|
||||
leftDepth += 1
|
||||
}
|
||||
while rightNode != nil {
|
||||
rightNode = rightNode!.right
|
||||
rightDepth += 1
|
||||
}
|
||||
if leftDepth == rightDepth {
|
||||
return (2 << leftDepth) - 1
|
||||
}
|
||||
return countNodes(root.left) + countNodes(root.right) + 1
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -214,7 +214,23 @@ var isAnagram = function(s, t) {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function isAnagram(s: string, t: string): boolean {
|
||||
if (s.length !== t.length) return false;
|
||||
let helperArr: number[] = new Array(26).fill(0);
|
||||
let pivot: number = 'a'.charCodeAt(0);
|
||||
for (let i = 0, length = s.length; i < length; i++) {
|
||||
helperArr[s.charCodeAt(i) - pivot]++;
|
||||
helperArr[t.charCodeAt(i) - pivot]--;
|
||||
}
|
||||
return helperArr.every(i => i === 0);
|
||||
};
|
||||
```
|
||||
|
||||
Swift:
|
||||
|
||||
```Swift
|
||||
func isAnagram(_ s: String, _ t: String) -> Bool {
|
||||
if s.count != t.count {
|
||||
|
@ -89,9 +89,33 @@ Python:
|
||||
for i in range(slow, len(nums)):
|
||||
nums[i] = 0
|
||||
```
|
||||
交换前后变量,避免补零
|
||||
```python
|
||||
def moveZeroes(self, nums: List[int]) -> None:
|
||||
slow, fast = 0, 0
|
||||
while fast < len(nums):
|
||||
if nums[fast] != 0:
|
||||
nums[slow], nums[fast] = nums[fast], nums[slow]
|
||||
slow += 1 # 保持[0, slow)区间是没有0的
|
||||
fast += 1
|
||||
```
|
||||
|
||||
Go:
|
||||
|
||||
```go
|
||||
func moveZeroes(nums []int) {
|
||||
slow := 0
|
||||
for fast := 0; fast < len(nums); fast ++ {
|
||||
if nums[fast] != 0 {
|
||||
temp := nums[slow]
|
||||
nums[slow] = nums[fast]
|
||||
nums[fast] = temp
|
||||
slow++
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
JavaScript:
|
||||
```javascript
|
||||
var moveZeroes = function(nums) {
|
||||
|
@ -239,5 +239,30 @@ int findMinArrowShots(int** points, int pointsSize, int* pointsColSize){
|
||||
}
|
||||
```
|
||||
|
||||
### Rust
|
||||
```Rust
|
||||
use std::cmp;
|
||||
impl Solution {
|
||||
pub fn find_min_arrow_shots(mut points: Vec<Vec<i32>>) -> i32 {
|
||||
if points.is_empty() {
|
||||
return 0;
|
||||
}
|
||||
points.sort_by_key(|point| point[0]);
|
||||
|
||||
let size = points.len();
|
||||
let mut count = 1;
|
||||
|
||||
for i in 1..size {
|
||||
if points[i][0] > points[i-1][1] {
|
||||
count += 1;
|
||||
} else {
|
||||
points[i][1] = cmp::min(points[i][1], points[i-1][1]);
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
}
|
||||
```
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -245,6 +245,38 @@ var fib = function(n) {
|
||||
};
|
||||
```
|
||||
|
||||
### C
|
||||
动态规划:
|
||||
```c
|
||||
int fib(int n){
|
||||
//当n <= 1时,返回n
|
||||
if(n <= 1)
|
||||
return n;
|
||||
//动态开辟一个int数组,大小为n+1
|
||||
int *dp = (int *)malloc(sizeof(int) * (n + 1));
|
||||
//设置0号位为0,1号为为1
|
||||
dp[0] = 0;
|
||||
dp[1] = 1;
|
||||
|
||||
//从前向后遍历数组(i=2; i <= n; ++i),下标为n时的元素为dp[i-1] + dp[i-2]
|
||||
int i;
|
||||
for(i = 2; i <= n; ++i) {
|
||||
dp[i] = dp[i - 1] + dp[i - 2];
|
||||
}
|
||||
return dp[n];
|
||||
}
|
||||
```
|
||||
|
||||
递归实现:
|
||||
```c
|
||||
int fib(int n){
|
||||
//若n小于等于1,返回n
|
||||
if(n <= 1)
|
||||
return n;
|
||||
//否则返回fib(n-1) + fib(n-2)
|
||||
return fib(n-1) + fib(n-2);
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
-----------------------
|
||||
|
@ -266,5 +266,21 @@ var minCostClimbingStairs = function(cost) {
|
||||
};
|
||||
```
|
||||
|
||||
### C
|
||||
```c
|
||||
int minCostClimbingStairs(int* cost, int costSize){
|
||||
//开辟dp数组,大小为costSize
|
||||
int *dp = (int *)malloc(sizeof(int) * costSize);
|
||||
//初始化dp[0] = cost[0], dp[1] = cost[1]
|
||||
dp[0] = cost[0], dp[1] = cost[1];
|
||||
|
||||
int i;
|
||||
for(i = 2; i < costSize; ++i) {
|
||||
dp[i] = (dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2]) + cost[i];
|
||||
}
|
||||
//选出倒数2层楼梯中较小的
|
||||
return dp[i-1] < dp[i-2] ? dp[i-1] : dp[i-2];
|
||||
}
|
||||
```
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -239,6 +239,43 @@ var getIntersectionNode = function(headA, headB) {
|
||||
};
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function getIntersectionNode(headA: ListNode | null, headB: ListNode | null): ListNode | null {
|
||||
let sizeA: number = 0,
|
||||
sizeB: number = 0;
|
||||
let curA: ListNode | null = headA,
|
||||
curB: ListNode | null = headB;
|
||||
while (curA) {
|
||||
sizeA++;
|
||||
curA = curA.next;
|
||||
}
|
||||
while (curB) {
|
||||
sizeB++;
|
||||
curB = curB.next;
|
||||
}
|
||||
curA = headA;
|
||||
curB = headB;
|
||||
if (sizeA < sizeB) {
|
||||
[sizeA, sizeB] = [sizeB, sizeA];
|
||||
[curA, curB] = [curB, curA];
|
||||
}
|
||||
let gap = sizeA - sizeB;
|
||||
while (gap-- && curA) {
|
||||
curA = curA.next;
|
||||
}
|
||||
while (curA && curB) {
|
||||
if (curA === curB) {
|
||||
return curA;
|
||||
}
|
||||
curA = curA.next;
|
||||
curB = curB.next;
|
||||
}
|
||||
return null;
|
||||
};
|
||||
```
|
||||
|
||||
C:
|
||||
|
||||
```c
|
||||
|
Reference in New Issue
Block a user