题目大意:
给定一个只有0和1的矩阵,找出矩阵中能组成全是1的最大正方形。
思路:
要求矩阵的最大面积,可以转化为求解矩阵的最大边长。定义一个二维的dp数组,dp[i][j]表示以(i,j)为右下角的正方形的最大边长。对于dp数组应该如何求解呢?
遍历到当前位置(i,j)的时候,需要考虑(i-1,j),(i,j-1),(i-1,j-1)三个位置,因为要得到的是一个正方形,故需要取这三个位置中的最小值。
得到如何状态转移方程:
dp[i][j] = 1 + min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))
答案也就顺其自然出来了:
func maximalSquare(matrix [][]byte) int {
m, n := len(matrix), len(matrix[0])
//存储的是边长
dp := make([][]int, m+1)
for i:=0; i<=m;i++{
dp[i] = make([]int, n+1)
}
ans := 0
for i := 1; i<=m;i++{
for j:=1;j<=n;j++{
if matrix[i-1][j-1] == '1'{
dp[i][j] = 1 + min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1]))
if dp[i][j] > ans{
ans = dp[i][j]
}
}
}
}
return ans * ans
}
func min(a, b int) int{
if a < b{
return a
}
return b
}
这是上周的mini项目考试原题,考完之后才发现题目理解错了,只能说大寄!真的哭死
题目大意:
给定一组区间,其中有的区间互相重复了,要求合并区间,使得剩下的区间互不重复并且恰好覆盖原来的区间。
思路:
要求将区间合并且恰好覆盖原来的区间,那么需要贪心。可以对原数组中的所有区间按照左边界从小到大进行排序,如果当前区间的右边界大于上一个区间的右边界,说明有重叠的部分,那么需要合并这两个区间为一个区间。
func merge(intervals [][]int) [][]int {
n:= len(intervals)
if n ==1{
return intervals
}
//左边界从小到大排序
sort.Slice(intervals, func(a, b int) bool{
return intervals[a][0] < intervals[b][0]
})
res := [][]int{}
res = append(res, intervals[0])
for i:= 1;i<n;i++{
//上一个数组的右区间大于当前数组的左区间,说明有重叠部分,那么就取两者右边界的最大值来合并
if res[len(res)-1][1] >= intervals[i][0]{
res[len(res)-1][1] = max( intervals[i][1], res[len(res)-1][1])
}else{
res = append(res, intervals[i])
}
}
return res
}
func max(a, b int) int{
if a > b{
return a
}
return b
}