6.15二维数组中的查找 - WisperDin/blog GitHub Wiki

描述

面试题4:二维数组中的查找 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

思路

其实这题是一个 二分查找 的变式,可以利用二分查找的思想快速排除有序序列中的不符合要求的元素,通过观察可知,将二维数组看成一个矩阵,从左往右递增,从上到下递增,可以从二维数组的右上角(第一行,最后一列 组成的一个递增序列)开始 此时序列的中点即右上角的元素,将此元素与查找元素比较

  • 相同 查找成功
  • 查找元素比右上角元素小 (后半段序列排除,即排除最后一列)
  • 查找元素比右上角元素大 (前半段序列排除,即排除第一行)

排除后的矩阵继续按此方法查找,当查找将要越界时退出循环,查找失败

第一行,最后一列组成的7字形序列,其中必定以顶角10为中点
1,2,7,10,11,13,17

		{1,2,7,10},
		{3,4,10,11},
		{4,5,12,13},
		{6,7,16,17},

代码

func Find(arr [][]int,target int)bool{
	if len(arr)<=0 || len(arr[0])<=0 {
		return false
	}
	//行
	row := 0
	//列
	col := len(arr[0])-1
	for row<len(arr[0]) && col>=0 {
		rightEle := arr[row][col]
		if rightEle == target {
			return true
		}
		if rightEle < target{
			row++
		}else {
			col--
		}
	}
	return false
}