leecode624. 数组列表中的最大距离

624. 数组列表中的最大距离

题目
给定 m 个数组,每个数组都已经按照升序排好序了。

现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 |a-b| 。

返回最大距离。

示例 1:

输入:[[1,2,3],[4,5],[1,2,3]]
输出:4
解释:
一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5 。
示例 2:

输入:arrays = [[1],[1]]
输出:0
解题思路
  1. 暴力破解 O(n^2)
  2. 遍历的同时记录并更新最小值与最大值,实现一次遍历。O(n)
代码实现
  1. 暴力破解
func maxDistance(arrays [][]int) int {

	maxDistance := 0
	for i:=0;i<len(arrays);i++ {
		//fmt.Println(i)
		var minValue = getMinOfArr(arrays[i])
		var maxValue = getMaxOfArr(arrays[i])
		//fmt.Printf("minValue=%d,maxValue=%d\n",minValue,maxValue)
		for j:=0;j<len(arrays);j++ {
			if j == i {
				continue
			}
			//fmt.Printf("getMaxOfArr(arrays[j]) - minValue=%d\n",getMaxOfArr(arrays[j]) - minValue)
			if maxDistance < getMaxOfArr(arrays[j]) - minValue {
				maxDistance = getMaxOfArr(arrays[j]) - minValue
			}
			if maxDistance < maxValue -  getMinOfArr(arrays[j])  {
				maxDistance = maxValue -  getMinOfArr(arrays[j])
			}
		}
	}
	return maxDistance
}
  1. 一次遍历方法
func maxDistance(arrays [][]int) int {
	minValue := getMinOfArr(arrays[0])
	maxValue := getMaxOfArr(arrays[0])
	var maxDist = float64(0)
	for i:=1;i<len(arrays);i++ {
		// 计算maxDistance
		curMinValue := getMinOfArr(arrays[i])
		curMaxValue := getMaxOfArr(arrays[i])
		dis1:= math.Abs(float64(curMaxValue - minValue))
		dis2:= math.Abs(float64(curMinValue - maxValue))
		if dis1 > maxDist {
			maxDist = dis1
		}
		if dis2 > maxDist {
			maxDist = dis2
		}

		// 更新最大值与最小值
		if getMinOfArr(arrays[i]) < minValue {
			minValue = getMinOfArr(arrays[i])
		}
		if getMaxOfArr(arrays[i]) > maxValue {
			maxValue = getMaxOfArr(arrays[i])
		}
	}
	return int(maxDist)
}

你可能感兴趣的:(数据结构与算法,算法,数据结构)