diff --git a/problems/0035.搜索插入位置.md b/problems/0035.搜索插入位置.md index dd15b36b..4d9ee74f 100644 --- a/problems/0035.搜索插入位置.md +++ b/problems/0035.搜索插入位置.md @@ -250,23 +250,23 @@ public int searchInsert(int[] nums, int target) { -Golang: +### Golang -```golang +```go // 第一种二分法 func searchInsert(nums []int, target int) int { - l, r := 0, len(nums) - 1 - for l <= r{ - m := l + (r - l)/2 - if nums[m] == target{ - return m - }else if nums[m] > target{ - r = m - 1 - }else{ - l = m + 1 - } - } - return r + 1 + left, right := 0, len(nums)-1 + for left <= right { + mid := left + (right-left)/2 + if nums[mid] == target { + return mid + } else if nums[mid] > target { + right = mid - 1 + } else { + left = mid + 1 + } + } + return len(nums) } ``` diff --git a/problems/0059.螺旋矩阵II.md b/problems/0059.螺旋矩阵II.md index 78336d5a..d9a656b9 100644 --- a/problems/0059.螺旋矩阵II.md +++ b/problems/0059.螺旋矩阵II.md @@ -300,6 +300,61 @@ function generateMatrix(n: number): number[][] { Go: +```go +package main + +import "fmt" + +func main() { + n := 3 + fmt.Println(generateMatrix(n)) +} + +func generateMatrix(n int) [][]int { + startx, starty := 0, 0 + var loop int = n / 2 + var center int = n / 2 + count := 1 + offset := 1 + res := make([][]int, n) + for i := 0; i < n; i++ { + res[i] = make([]int, n) + } + for loop > 0 { + i, j := startx, starty + + //行数不变 列数在变 + for j = starty; j < n-offset; j++ { + res[startx][j] = count + count++ + } + //列数不变是j 行数变 + for i = startx; i < n-offset; i++ { + res[i][j] = count + count++ + } + //行数不变 i 列数变 j-- + for ; j > starty; j-- { + res[i][j] = count + count++ + } + //列不变 行变 + for ; i > startx; i-- { + res[i][j] = count + count++ + } + startx++ + starty++ + offset++ + loop-- + } + if n%2 == 1 { + res[center][center] = n * n + } + return res +} +``` + ```go func generateMatrix(n int) [][]int { top, bottom := 0, n-1 diff --git a/problems/0707.设计链表.md b/problems/0707.设计链表.md index b82a645e..43ed2622 100644 --- a/problems/0707.设计链表.md +++ b/problems/0707.设计链表.md @@ -652,6 +652,106 @@ class MyLinkedList: Go: +```go +//单链表实现 +package main + +import "fmt" + +func main() { + var list = new(SingleLinkedList) + list.Init() + list.addAtHead(100) + list.addAtTail(242) + list.addAtTail(777) + list.addAtIndex(1, 99999) + list.printLinkedList() +} + +// 单链表写法 // + +type SingleNode struct { + Val int + Next *SingleNode +} + +type SingleLinkedList struct { + dummyHead *SingleNode + Size int +} + +// 初始化链表 +func (list *SingleLinkedList) Init() *SingleLinkedList { + list.Size = 0 + list.dummyHead = new(SingleNode) + return list +} + +// 获取第index个节点数值 +func (list *SingleLinkedList) get(index int) int { + if list != nil || index < 0 || index > list.Size { + return -1 + } + // 让cur等于真正头节点 + cur := list.dummyHead.Next + for i := 0; i < index; i++ { + cur = cur.Next + } + return cur.Val +} + +// 在链表最前面插入一个节点 +func (list *SingleLinkedList) addAtHead(val int) { + // 以下两行代码可用一行代替 + // newNode := new(SingleNode) + // newNode.Val = val + newNode := &SingleNode{Val: val} + + newNode.Next = list.dummyHead.Next + list.dummyHead.Next = newNode + list.Size++ +} + +// 在链表最后面插入一个节点 +func (list *SingleLinkedList) addAtTail(val int) { + newNode := &SingleNode{Val: val} + cur := list.dummyHead + for cur.Next != nil { + cur = cur.Next + } + cur.Next = newNode + list.Size++ +} + +// 打印链表 +func (list *SingleLinkedList) printLinkedList() { + cur := list.dummyHead + for cur.Next != nil { + fmt.Println(cur.Next.Val) + cur = cur.Next + } +} + +// 在第index个节点之前插入新节点 +func (list *SingleLinkedList) addAtIndex(index int, val int) { + if index < 0 { + index = 0 + } else if index > list.Size { + return + } + + newNode := &SingleNode{Val: val} + cur := list.dummyHead //用虚拟头节点不用考虑在头部插入的情况 + for i := 0; i < index; i++ { + cur = cur.Next + } + newNode.Next = cur.Next + cur.Next = newNode + list.Size++ +} + +``` + ```go //循环双链表 type MyLinkedList struct {