顺时针旋转矩阵
在Go语言中,实现矩阵顺时针旋转90度的算法可以通过逐层遍历矩阵并交换元素位置来完成。以下是一个简单的Go语言实现:
package main
import "fmt"
// RotateMatrix 顺时针旋转矩阵90度
func RotateMatrix(matrix [][]int) [][]int {
rows := len(matrix)
cols := len(matrix[0])
// 确保矩阵是正方形的
if rows != cols {
panic("Input matrix must be square")
}
// 采用原地旋转的方式,首先进行转置,然后反转每行
transpose(matrix)
reverseEachRow(matrix)
return matrix
}
// transpose 矩阵转置
func transpose(matrix [][]int) {
for i := 0; i < len(matrix); i++ {
for j := i + 1; j < len(matrix[0]); j++ {
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
}
}
}
// reverseEachRow 反转每行
func reverseEachRow(matrix [][]int) {
for row := range matrix {
for left, right := 0, len(matrix[row])-1; left < right; left, right = left+1, right-1 {
matrix[row][left], matrix[row][right] = matrix[row][right], matrix[row][left]
}
}
}
func main() {
input := [][]int{
{1, 2, 3},
{4, 5, 6},
{7, 8, 9},
}
rotated := RotateMatrix(input)
fmt.Println(rotated)
}
这段代码首先定义了一个名为RotateMatrix
的函数,它接收一个整数矩阵作为输入,然后通过两个辅助函数来实现旋转操作:
transpose
函数用于矩阵转置,即将矩阵的行变为列,列变为行。reverseEachRow
函数用于反转矩阵的每一行,使得矩阵顺时针旋转90度。
最后,main
函数中给出了一个3x3矩阵作为示例,并展示了旋转后的结果。运行该程序,会得到一个顺时针旋转90度后的矩阵。
合并区间
合并区间是指在给定一系列的区间后,将有交集或者连续的区间合并成一个大的区间。这个问题通常可以采用排序和遍历的方式来解决,以下是一个简单的Go语言实现:
package main
import (
"fmt"
"sort"
)
type Interval struct {
Start int
End int
}
// compareIntervals 用于对区间进行排序的比较函数
func compareIntervals(a, b *Interval) bool {
return a.Start < b.Start
}
// mergeIntervals 合并区间
func mergeIntervals(intervals []*Interval) []*Interval {
// 先对区间按起点进行排序
sort.Slice(intervals, func(i, j int) bool {
return intervals[i].Start < intervals[j].Start
})
result := make([]*Interval, 0, len(intervals))
curr := intervals[0]
for _, interval := range intervals[1:] {
// 如果当前区间与新区间有交集,则扩大当前区间的终点
if curr.End >= interval.Start {
curr.End = max(curr.End, interval.End)
} else {
// 如果没有交集,则将当前区间加入结果集,并将新区间设为当前区间
result = append(result, curr)
curr = interval
}
}
// 最后加入最后一个区间
result = append(result, curr)
return result
}
func max(a, b int) int {
if a > b {
return a
}
return b
}
func main() {
intervals := []*Interval{
{1, 3},
{2, 6},
{8, 10},
{15, 18},
}
fmt.Println("Before merging:")
for _, interval := range intervals {
fmt.Printf("[%d, %d]\n", interval.Start, interval.End)
}
merged := mergeIntervals(intervals)
fmt.Println("\nAfter merging:")
for _, interval := range merged {
fmt.Printf("[%d, %d]\n", interval.Start, interval.End)
}
}
在这个示例中,首先对输入的区间列表按照起始点进行排序,然后遍历排序后的区间,将有交集的区间合并在一起,最后得到的就是合并后的区间列表。注意,这个示例假设输入的区间都是左闭右闭的形式,即 [start, end]
。如果有特殊边界条件,比如左开右闭等,需要根据实际情况调整。
最后编辑: kuteng 文档更新时间: 2024-04-02 09:53 作者:kuteng