碰到一道经典的,Max Min Path

题目大概是这个意思:给定一个n*m的数组,找到每一条能从左上角探索到左下角的path,然后每一条path里找到最小值,所有这些最小值合在一起,看最大值是哪个。

举个例子:

[8, 4, 7]

[6, 5, 9]

有3条path:

8-4-7-9 min: 4

8-4-5-9 min: 4

8-6-5-9 min: 5

return: 5


这道题看地理大家激烈的讨论,说拿DP可以做?但是我觉得不行啊,DP的话只能new一个对应的数组,然后一边探索一边更新这个数组,而且注定要recursive。但是问题是,你怎么能一边一直取最小值,到最后一个点又取最大值呢?倒是维护一下也可以,但是地理几位仁兄提的直接dp的实在不敢苟同,他们的方法更像是每个dp的grid都记录之前点最小值中的最大值,那到最后一个grid的时候很多之前的min已经被覆盖了啊!我稍后会尝试做一下正确的dp能不能写出来,只dp到最后一个点的时候要加判断。

我觉得更concise的是用DFS,思路非常清晰,就是一直深度探索,遍历每一个点,然后一路下来保持最小值,到最后一个点与之前的最小值比谁大,谁大谁留下。

写了代码like this:

public int maxMin(int[][] matrix){
		if(matrix==null||matrix.length==0||matrix[0].length==0)
			return 0;
		max = Integer.MIN_VALUE;
		dfs(matrix,0,0,Integer.MAX_VALUE);
		return max;
		
	}
	
	private void dfs(int[][] mat, int i, int j, int minSoFar){
		int m = mat.length , n = mat[0].length;
		//base case: reach out of bottom right
		if(i==m||n==j)
			return;
		//every new step, evaluate current node and previous min
		minSoFar = Math.min(mat[i][j], minSoFar);
		//when reach final grid, return the bigger one 
		if(i==m-1 && j==n-1) {
            max = Math.max(minSoFar, max);
		} 
		
		dfs(mat, i+1, j, minSoFar);
		dfs(mat, i, j+1, minSoFar);
		
	}

这里写给自己DFS的关键思想:

1. 写base case,探索到最后了要怎么办。这道题目就是,return,再往下不用管了。

2. 写正常的非base case你要怎么操作。这道理里就是更新到这个点的最小值,是目前为止的最小值还是这个点更小。

3. 如果有特殊需求,加if写。在这道理里就是如果探索到最后一个点了,开始判断最大值。

4. DFS都是recursive,继续探索下面的level。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个函数的作用是在地图上绘制一条路径。它需要以下参数: - `map_path`:地图文件的路径 - `route_coordinates`:路径的坐标点列表,每个坐标点应该是一个元组或列表,包含经度和纬度 - `min_lat`:地图的最小纬度 - `max_lat`:地图的最大纬度 - `min_lon`:地图的最小经度 - `max_lon`:地图的最大经度 函数的实现可以参考以下步骤: 1. 使用Python的地图库(如folium)读取地图文件,设置地图中心点和缩放级别 2. 在地图上创建一个路线图层,将路径坐标点添加到路线图层中 3. 将路线图层添加到地图中 4. 将地图保存为HTML文件并打开 以下是一个示例实现: ```python import folium def draw_route_on_map(map_path, route_coordinates, min_lat, max_lat, min_lon, max_lon): # 使用folium库读取地图文件,设置地图中心点和缩放级别 map = folium.Map(location=[(min_lat+max_lat)/2, (min_lon+max_lon)/2], zoom_start=12) # 在地图上创建一个路线图层 route_layer = folium.FeatureGroup(name='Route') # 将路径坐标点添加到路线图层中 for coord in route_coordinates: folium.Marker(location=[coord[0], coord[1]], icon=None).add_to(route_layer) folium.PolyLine(route_coordinates, color='red').add_to(route_layer) # 将路线图层添加到地图中 map.add_child(route_layer) # 将地图保存为HTML文件并打开 map.save(map_path) webbrowser.open(map_path) ``` 你可以根据实际需求对代码进行修改和调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值