题目描述
LCR 121. 寻找目标值 - 二维数组 - 力扣(LeetCode)
m
*n
的二维数组 plants
记录了园林景观的植物排布情况,具有以下特性:
- 每行中,每棵植物的右侧相邻植物不矮于该植物;
- 每列中,每棵植物的下侧相邻植物不矮于该植物。
请判断 plants
中是否存在目标高度值 target
。
示例 1:
输入:plants = [[2,3,6,8],[4,5,8,9],[5,9,10,12]], target = 8 输出:true
正常解法
正常解法就是用遍历,然后一个一个对比,缺点就是太慢了
func findTargetIn2DPlants(plants [][]int, target int) bool {
if len(plants) == 0 || len(plants[0]) == 0 {
return false
}
n, m := len(plants), len(plants[0]) //取出行和列的大小
遍历基础解法
for i:= 0; i<n; i++{
for j := 0; j < m; j++{
if plants[i][j] == target{
return true
}
}
}
return false
}
第二种解法
使用二分查找,分开来对比
func findTargetIn2DPlants(plants [][]int, target int) bool {
if len(plants) == 0 || len(plants[0]) == 0 {
return false
}
n, m := len(plants), len(plants[0]) //取出行和列的大小
//第二种做法 二分查找对比
for i := 0; i < n; i++ {
l, r := 0, m-1
for l < r {
mid := (l + r + 1) >> 1 // 取中间的数字
if plants[i][mid] <= target{
l = mid
}else {
r = mid - 1 // 为了控制mid的位置
}
}
if plants[i][l] == target{
return true
}
}
return false
}
有一个地方要注意,mid这里取值为 l + r +1,+1的原因是:
如果l和r相邻,这个时候 (l + r)>> 1,就会导致不断循环,l 的值一直小于 r。