Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Published

...

Code Block
languagego
type NumMatrix struct {
    sums [][]int
}


func Constructor(matrix [][]int) NumMatrix {
    sums := make([][]int, len(matrix)+1)
    sums[0] = make([]int, len(matrix[0])+1)
    for i := range matrix {
        sums[i+1] = make([]int, len(matrix[0])+1)

        for j := range matrix[i] {
            sums[i+1][j+1] = sums[i+1][j] + matrix[i][j]
        }
    }
    // fmt.Println(sums)
    for i := range matrix {
        for j := range matrix[i] {
            sums[i+1][j+1] += sums[i][j+1]
        }
    }

    // for i := range sums {
    //     for j := range sums[i] {
    //         fmt.Printf("%2d ", sums[i][j])
    //     }
    //     fmt.Println()
    // }

    return NumMatrix { sums }
}


func (this *NumMatrix) SumRegion(row1 int, col1 int, row2 int, col2 int) int {
    return this.sums[row2+1][col2+1] - this.sums[row1][col2+1] - this.sums[row2+1][col1]  +  this.sums[row1][col1]
}


/**
 * Your NumMatrix object will be instantiated and called as such:
 * obj := Constructor(matrix);
 * param_1 := obj.SumRegion(row1,col1,row2,col2);
 */

双指针数组

LC 88. Merge Sorted Array 合并两个有序数组

https://leetcode.com/problems/merge-sorted-array/ & More

Code Block
languagego
func merge(nums1 []int, m int, nums2 []int, n int)  {
    i, j := m-1, n-1
    p := m+n-1
    for i >= 0 && j >= 0 {
        if nums1[i] >= nums2[j] {
            nums1[p] = nums1[i]
            p--
            i--
        } else {
            nums1[p] = nums2[j]
            p--
            j--
        }
    }
    for i >= 0 {
        nums1[p] = nums1[i]
        p--
        i--
    }
    for j >= 0 {
        nums1[p] = nums2[j]
        p--
        j--
    }
}

LC 977. Squares of a Sorted Array 有序数组的平方

https://leetcode.com/problems/squares-of-a-sorted-array/description/

Status
colourBlue
title待复习

Code Block
languagego
func sortedSquares(nums []int) []int {
    n := len(nums)
    i, j := 0, n-1
    result := make([]int, n)
    p := n-1

    for i <= j {
        a := nums[i] * nums[i]
        b := nums[j] * nums[j]
        if a >= b {
            result[p] = a
            p--
            i++
        } else {
            result[p] = b
            p--
            j--
        }
    }
    
    return result
}

LC 360. 有序转化数组 [Premium]

https://leetcode.com/problems/sort-transformed-array/description/

Status
title未完成

LC 1329. 将矩阵按对角线排序

https://leetcode.com/problems/sort-the-matrix-diagonally/description/

Status
colourBlue
title待复习

Code Block
languagego
func diagonalSort(mat [][]int) [][]int {
    m, n := len(mat), len(mat[0])
    diagonals := make(map[int][]int, m+n-1)

    for i := range mat {
        for j, v := range mat[i] {
            diagonals[j-i] = append(diagonals[j-i], v)
        }
    }

    for _, v := range diagonals {
        sort.Slice(v, func(i, j int) bool {
            return v[i] >= v[j]
        })
    }

    for i := range mat {
        for j := range mat[i] {
            v := diagonals[j-i][len(diagonals[j-i])-1]
            diagonals[j-i] = diagonals[j-i][:len(diagonals[j-i])-1]
            
            mat[i][j] = v
        }
    }

    return mat
}

LC 1260. Shift 2D Grid 二维网格迁移

https://leetcode.com/problems/shift-2d-grid/

Code Block
languagego
func shiftGrid(grid [][]int, k int) [][]int {
    m, n := len(grid), len(grid[0])

    total := m*n
    all := make([]int, total)

    for i := range grid {
        for j, v := range grid[i] {
            all[(i*n+j+k) % total] = v
        }
    }

    for i := range grid {
        for j := range grid[i] {
            grid[i][j] = all[i*n+j]
        }
    }

    return grid
}

不引入额外空间做法

Status
colourBlue
title待复习

Code Block
languagego
func shiftGrid(grid [][]int, k int) [][]int {
    m, n := len(grid), len(grid[0])

    k = k % (m*n)

    reverse(grid, 0, m*n-1)
    reverse(grid, 0,k-1)
    reverse(grid, k, m*n-1)

    return grid
}

func reverse(grid [][]int, start, end int) {
    i, j := start, end
    for i < j {
        a := get(grid, i)
        b := get(grid, j)
        set(grid, j, a)
        set(grid, i, b)

        i++
        j--
    }
}

func set(grid [][]int, index int, newValue int) {
    n := len(grid[0])
    i, j := index / n, index % n
    grid[i][j] = newValue
}

func get(grid [][]int, index int) int {
    n := len(grid[0])
    i, j := index / n, index % n
    return grid[i][j]
}