Python实现104×68矩形36等分的坐标对应编号查询优化方案
优化解法:通过数学计算直接映射坐标到编号
要解决这个问题,最优雅且高效的方式是避免使用冗长的条件判断分支,而是通过数学计算直接将坐标映射到对应的小矩形编号。核心思路是先计算坐标所在的列和行索引,再通过索引推导编号,全程时间复杂度为O(1),完全没有循环或条件判断带来的性能损耗。
步骤分析
首先明确基础参数:
- 大矩形尺寸:104×68
- 小矩形总数:36 = 6列 × 6行
- 单个小矩形的宽度:
w = 104 / 6 ≈ 17.333 - 单个小矩形的高度:
h = 68 / 6 ≈ 11.333
根据题目编号规则:
- 列索引:x坐标从左到右划分,每列对应索引0-5(左起第一列为0)
- 行索引:y坐标从下到上划分,每行对应索引0-5(最下方行为0)
- 编号计算:编号 = 行索引 × 列数 + 列索引 + 1(因为编号从1开始)
Python实现代码
def get_rectangle_id(x: float, y: float) -> int: # 定义基础参数 total_width = 104 total_height = 68 cols = 6 rows = 6 # 计算单个小矩形的精确宽高(避免用题目里的近似值,减少误差) cell_width = total_width / cols cell_height = total_height / rows # 计算列索引,处理x恰好等于大矩形宽度的边界情况 col_idx = int(x // cell_width) col_idx = min(col_idx, cols - 1) # 计算行索引,处理y恰好等于大矩形高度的边界情况 row_idx = int(y // cell_height) row_idx = min(row_idx, rows - 1) # 推导最终编号 return row_idx * cols + col_idx + 1
验证示例
测试题目中的坐标(54, 35):
- 列索引:
54 // (104/6) ≈ 54 // 17.333 = 3 - 行索引:
35 // (68/6) ≈ 35 // 11.333 = 3 - 编号:
3*6 + 3 + 1 = 22,完全符合题目预期。
优化亮点
- 无分支判断:彻底告别一堆
if-elif的写法,代码简洁易维护 - 精确计算:使用精确的小矩形宽高(而非题目里的近似值17.3/11.3),避免区间边界的判断误差
- 边界处理:通过
min函数处理坐标恰好落在大矩形边缘的情况(比如x=104或y=68),确保索引不会超出范围 - 性能最优:数学计算直接得出结果,无论输入多少坐标,耗时都是恒定的
内容的提问来源于stack exchange,提问作者slothfulwave612
相关产品推荐
相关产品推荐

