mirror of
https://github.com/youngyangyang04/leetcode-master.git
synced 2025-07-07 15:45:40 +08:00
Merge branch 'youngyangyang04:master' into remote
This commit is contained in:
@ -346,69 +346,56 @@ class Solution {
|
||||
|
||||
### Go
|
||||
```Go
|
||||
import "strings"
|
||||
var res [][]string
|
||||
|
||||
func isValid(board [][]string, row, col int) (res bool){
|
||||
n := len(board)
|
||||
for i:=0; i < row; i++ {
|
||||
if board[i][col] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
for i := 0; i < n; i++{
|
||||
if board[row][i] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
for i ,j := row, col; i >= 0 && j >=0 ; i, j = i - 1, j- 1{
|
||||
if board[i][j] == "Q"{
|
||||
return false
|
||||
}
|
||||
}
|
||||
for i, j := row, col; i >=0 && j < n; i,j = i-1, j+1 {
|
||||
if board[i][j] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
func backtrack(board [][]string, row int) {
|
||||
size := len(board)
|
||||
if row == size{
|
||||
temp := make([]string, size)
|
||||
for i := 0; i<size;i++{
|
||||
temp[i] = strings.Join(board[i],"")
|
||||
}
|
||||
res =append(res,temp)
|
||||
return
|
||||
}
|
||||
for col := 0; col < size; col++ {
|
||||
if !isValid(board, row, col){
|
||||
continue
|
||||
}
|
||||
board[row][col] = "Q"
|
||||
backtrack(board, row+1)
|
||||
board[row][col] = "."
|
||||
}
|
||||
}
|
||||
|
||||
func solveNQueens(n int) [][]string {
|
||||
res = [][]string{}
|
||||
board := make([][]string, n)
|
||||
for i := 0; i < n; i++{
|
||||
board[i] = make([]string, n)
|
||||
}
|
||||
for i := 0; i < n; i++{
|
||||
for j := 0; j<n;j++{
|
||||
board[i][j] = "."
|
||||
}
|
||||
}
|
||||
backtrack(board, 0)
|
||||
var res [][]string
|
||||
chessboard := make([][]string, n)
|
||||
for i := 0; i < n; i++ {
|
||||
chessboard[i] = make([]string, n)
|
||||
}
|
||||
for i := 0; i < n; i++ {
|
||||
for j := 0; j < n; j++ {
|
||||
chessboard[i][j] = "."
|
||||
}
|
||||
}
|
||||
var backtrack func(int)
|
||||
backtrack = func(row int) {
|
||||
if row == n {
|
||||
temp := make([]string, n)
|
||||
for i, rowStr := range chessboard {
|
||||
temp[i] = strings.Join(rowStr, "")
|
||||
}
|
||||
res = append(res, temp)
|
||||
return
|
||||
}
|
||||
for i := 0; i < n; i++ {
|
||||
if isValid(n, row, i, chessboard) {
|
||||
chessboard[row][i] = "Q"
|
||||
backtrack(row + 1)
|
||||
chessboard[row][i] = "."
|
||||
}
|
||||
}
|
||||
}
|
||||
backtrack(0)
|
||||
return res
|
||||
}
|
||||
|
||||
return res
|
||||
func isValid(n, row, col int, chessboard [][]string) bool {
|
||||
for i := 0; i < row; i++ {
|
||||
if chessboard[i][col] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
for i, j := row-1, col-1; i >= 0 && j >= 0; i, j = i-1, j-1 {
|
||||
if chessboard[i][j] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
for i, j := row-1, col+1; i >= 0 && j < n; i, j = i-1, j+1 {
|
||||
if chessboard[i][j] == "Q" {
|
||||
return false
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
```
|
||||
### Javascript
|
||||
|
@ -266,46 +266,33 @@ Go:
|
||||
|
||||
```go
|
||||
func uniquePathsWithObstacles(obstacleGrid [][]int) int {
|
||||
m,n:= len(obstacleGrid),len(obstacleGrid[0])
|
||||
m, n := len(obstacleGrid), len(obstacleGrid[0])
|
||||
// 定义一个dp数组
|
||||
dp := make([][]int,m)
|
||||
for i,_ := range dp {
|
||||
dp[i] = make([]int,n)
|
||||
dp := make([][]int, m)
|
||||
for i, _ := range dp {
|
||||
dp[i] = make([]int, n)
|
||||
}
|
||||
// 初始化
|
||||
for i:=0;i<m;i++ {
|
||||
// 如果是障碍物, 后面的就都是0, 不用循环了
|
||||
if obstacleGrid[i][0] == 1 {
|
||||
break
|
||||
}
|
||||
dp[i][0]=1
|
||||
// 初始化, 如果是障碍物, 后面的就都是0, 不用循环了
|
||||
for i := 0; i < m && obstacleGrid[i][0] == 0; i++ {
|
||||
dp[i][0] = 1
|
||||
}
|
||||
for i:=0;i<n;i++ {
|
||||
if obstacleGrid[0][i] == 1 {
|
||||
break
|
||||
}
|
||||
dp[0][i]=1
|
||||
for i := 0; i < n && obstacleGrid[0][i] == 0; i++ {
|
||||
dp[0][i] = 1
|
||||
}
|
||||
// dp数组推导过程
|
||||
for i:=1;i<m;i++ {
|
||||
for j:=1;j<n;j++ {
|
||||
// 如果obstacleGrid[i][j]这个点是障碍物, 那么我们的dp[i][j]保持为0
|
||||
if obstacleGrid[i][j] != 1 {
|
||||
for i := 1; i < m; i++ {
|
||||
for j := 1; j < n; j++ {
|
||||
// 如果obstacleGrid[i][j]这个点是障碍物, 那么dp[i][j]保持为0
|
||||
if obstacleGrid[i][j] != 1 {
|
||||
// 否则我们需要计算当前点可以到达的路径数
|
||||
dp[i][j] = dp[i-1][j]+dp[i][j-1]
|
||||
dp[i][j] = dp[i-1][j] + dp[i][j-1]
|
||||
}
|
||||
}
|
||||
}
|
||||
// debug遍历dp
|
||||
//for i,_ := range dp {
|
||||
// for j,_ := range dp[i] {
|
||||
// fmt.Printf("%.2v,",dp[i][j])
|
||||
// }
|
||||
// fmt.Println()
|
||||
//}
|
||||
return dp[m-1][n-1]
|
||||
}
|
||||
|
||||
|
||||
```
|
||||
|
||||
Javascript
|
||||
|
@ -730,5 +730,33 @@ bool isBalanced(struct TreeNode* root){
|
||||
}
|
||||
```
|
||||
|
||||
## Swift:
|
||||
|
||||
>递归
|
||||
```swift
|
||||
func isBalanced(_ root: TreeNode?) -> Bool {
|
||||
// -1 已经不是平衡二叉树
|
||||
return getHeight(root) == -1 ? false : true
|
||||
}
|
||||
func getHeight(_ root: TreeNode?) -> Int {
|
||||
guard let root = root else {
|
||||
return 0
|
||||
}
|
||||
let leftHeight = getHeight(root.left)
|
||||
if leftHeight == -1 {
|
||||
return -1
|
||||
}
|
||||
let rightHeight = getHeight(root.right)
|
||||
if rightHeight == -1 {
|
||||
return -1
|
||||
}
|
||||
if abs(leftHeight - rightHeight) > 1 {
|
||||
return -1
|
||||
} else {
|
||||
return 1 + max(leftHeight, rightHeight)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -553,6 +553,65 @@ function reverse(strArr, start, end) {
|
||||
}
|
||||
```
|
||||
|
||||
TypeScript:
|
||||
|
||||
```typescript
|
||||
function reverseWords(s: string): string {
|
||||
/** Utils **/
|
||||
// 删除多余空格, 如' hello world ' => 'hello world'
|
||||
function delExtraSpace(arr: string[]): void {
|
||||
let left: number = 0,
|
||||
right: number = 0,
|
||||
length: number = arr.length;
|
||||
while (right < length && arr[right] === ' ') {
|
||||
right++;
|
||||
}
|
||||
while (right < length) {
|
||||
if (arr[right] === ' ' && arr[right - 1] === ' ') {
|
||||
right++;
|
||||
continue;
|
||||
}
|
||||
arr[left++] = arr[right++];
|
||||
}
|
||||
if (arr[left - 1] === ' ') {
|
||||
arr.length = left - 1;
|
||||
} else {
|
||||
arr.length = left;
|
||||
}
|
||||
}
|
||||
// 翻转字符串,如:'hello' => 'olleh'
|
||||
function reverseWords(strArr: string[], start: number, end: number) {
|
||||
let temp: string;
|
||||
while (start < end) {
|
||||
temp = strArr[start];
|
||||
strArr[start] = strArr[end];
|
||||
strArr[end] = temp;
|
||||
start++;
|
||||
end--;
|
||||
}
|
||||
}
|
||||
|
||||
/** Main code **/
|
||||
let strArr: string[] = s.split('');
|
||||
delExtraSpace(strArr);
|
||||
let length: number = strArr.length;
|
||||
// 翻转整个字符串
|
||||
reverseWords(strArr, 0, length - 1);
|
||||
let start: number = 0,
|
||||
end: number = 0;
|
||||
while (start < length) {
|
||||
end = start;
|
||||
while (strArr[end] !== ' ' && end < length) {
|
||||
end++;
|
||||
}
|
||||
// 翻转单个单词
|
||||
reverseWords(strArr, start, end - 1);
|
||||
start = end + 1;
|
||||
}
|
||||
return strArr.join('');
|
||||
};
|
||||
```
|
||||
|
||||
Swift:
|
||||
|
||||
```swift
|
||||
|
@ -581,7 +581,72 @@ var binaryTreePaths = function(root) {
|
||||
};
|
||||
```
|
||||
|
||||
Swift:
|
||||
|
||||
> 递归/回溯
|
||||
```swift
|
||||
func binaryTreePaths(_ root: TreeNode?) -> [String] {
|
||||
var res = [String]()
|
||||
guard let root = root else {
|
||||
return res
|
||||
}
|
||||
var path = [Int]()
|
||||
_binaryTreePaths(root, path: &path, res: &res)
|
||||
return res
|
||||
}
|
||||
func _binaryTreePaths(_ root: TreeNode, path: inout [Int], res: inout [String]) {
|
||||
path.append(root.val)
|
||||
if root.left == nil && root.right == nil {
|
||||
var str = ""
|
||||
for i in 0 ..< path.count - 1 {
|
||||
str.append("\(path[i])->")
|
||||
}
|
||||
str.append("\(path.last!)")
|
||||
res.append(str)
|
||||
return
|
||||
}
|
||||
if let left = root.left {
|
||||
_binaryTreePaths(left, path: &path, res: &res)
|
||||
path.removeLast()
|
||||
}
|
||||
if let right = root.right {
|
||||
_binaryTreePaths(right, path: &path, res: &res)
|
||||
path.removeLast()
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
> 迭代
|
||||
```swift
|
||||
func binaryTreePaths(_ root: TreeNode?) -> [String] {
|
||||
var res = [String]()
|
||||
guard let root = root else {
|
||||
return res
|
||||
}
|
||||
var stackNode = [TreeNode]()
|
||||
stackNode.append(root)
|
||||
|
||||
var stackStr = [String]()
|
||||
stackStr.append("\(root.val)")
|
||||
|
||||
while !stackNode.isEmpty {
|
||||
let node = stackNode.popLast()!
|
||||
let str = stackStr.popLast()!
|
||||
if node.left == nil && node.right == nil {
|
||||
res.append(str)
|
||||
}
|
||||
if let left = node.left {
|
||||
stackNode.append(left)
|
||||
stackStr.append("\(str)->\(left.val)")
|
||||
}
|
||||
if let right = node.right {
|
||||
stackNode.append(right)
|
||||
stackStr.append("\(str)->\(right.val)")
|
||||
}
|
||||
}
|
||||
return res
|
||||
}
|
||||
```
|
||||
|
||||
-----------------------
|
||||
<div align="center"><img src=https://code-thinking.cdn.bcebos.com/pics/01二维码一.jpg width=500> </img></div>
|
||||
|
@ -289,7 +289,7 @@ func findTargetSumWays(nums []int, target int) int {
|
||||
for _, v := range nums {
|
||||
sum += v
|
||||
}
|
||||
if target > sum {
|
||||
if abs(target) > sum {
|
||||
return 0
|
||||
}
|
||||
if (sum+target)%2 == 1 {
|
||||
@ -311,49 +311,12 @@ func findTargetSumWays(nums []int, target int) int {
|
||||
}
|
||||
return dp[bag]
|
||||
}
|
||||
```
|
||||
> 更新版,上一个跑不通了,因为会存在bag 小于0的情况
|
||||
|
||||
```go
|
||||
func findTargetSumWays(nums []int, target int) int {
|
||||
//先转化为数学问题
|
||||
//a-b=target
|
||||
//a+b=sum
|
||||
//a=(target+sum)/2
|
||||
//求出sum
|
||||
var sum int
|
||||
for _,value:=range nums{
|
||||
sum+=value
|
||||
}
|
||||
//如果sum<target或者 sum+target不是偶数(因为a是int) 或者两者之和小于0了
|
||||
if sum<target||(sum+target)%2==1||(sum+target)<0{
|
||||
return 0
|
||||
}
|
||||
//开始dp初始化
|
||||
dp:=make([][]int,len(nums)+1)
|
||||
for i:=0;i<=len(nums);i++{
|
||||
tmp:=make([]int,(target+sum)/2+1)//背包容量
|
||||
dp[i]=tmp
|
||||
}
|
||||
dp[0][0]=1//当背包容量为0,且物品为0时,填满背包就1种方法
|
||||
for i:=0;i<len(nums)+1;i++{
|
||||
if i==0{
|
||||
continue
|
||||
}
|
||||
for j:=0;j<(target+sum)/2+1;j++{
|
||||
if nums[i-1]<=j{//如果背包装的下
|
||||
dp[i][j]=dp[i-1][j]+dp[i-1][j-nums[i-1]]
|
||||
}else{
|
||||
dp[i][j]=dp[i-1][j]
|
||||
}
|
||||
}
|
||||
}
|
||||
return dp[len(nums)][(target+sum)/2]
|
||||
func abs(x int) int {
|
||||
return int(math.Abs(float64(x)))
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
Javascript:
|
||||
```javascript
|
||||
const findTargetSumWays = (nums, target) => {
|
||||
|
Reference in New Issue
Block a user