LeetCode 573. 松鼠模拟(数学)*

文章目录

1. 题目

现在有一棵树,一只松鼠和一些坚果。位置由二维网格的单元格表示。
你的目标是找到松鼠收集所有坚果的最小路程,且坚果是一颗接一颗地被放在树下。
松鼠一次最多只能携带一颗坚果,松鼠可以向上,向下,向左和向右四个方向移动到相邻的单元格。移动次数表示路程。

输入 1:

输入: 
高度 : 5
宽度 : 7
树的位置 : [2,2]
松鼠 : [4,4]
坚果 : [[3,0], [2,5]]
输出: 12

解释:
​​​​​在这里插入图片描述

注意:
所有给定的位置不会重叠。
松鼠一次最多只能携带一颗坚果。
给定的坚果位置没有顺序。
高度和宽度是正整数。 3 <= 高度 * 宽度 <= 10,000。
给定的网格至少包含一颗坚果,唯一的一棵树和一只松鼠。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/squirrel-simulation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 所有的果子到树的距离*2,记为 sum
  • 现在松鼠挑选任意一个果子 i 开始捡,sum+dis(松鼠、i)-dis(树、i)记为从 i 开始捡的距离
  • 遍历所有的 i ,取出最小距离
class Solution {
public:
    int minDistance(int height, int width, vector<int>& tree, vector<int>& squirrel, vector<vector<int>>& nuts) {
    	int sum = 0, mindis = INT_MAX, i;
    	for(i = 0; i < nuts.size(); ++i)
    		sum += 2*dis(tree[0],tree[1],nuts[i][0],nuts[i][1]);
    	for(i = 0; i < nuts.size(); ++i)
    		mindis = min(mindis, sum-dis(tree[0],tree[1],nuts[i][0],nuts[i][1])
                                +dis(squirrel[0],squirrel[1],nuts[i][0],nuts[i][1]));
    	return mindis;
    }
    int dis(int a, int b, int c, int d)
    {
    	return abs(a-c)+abs(b-d);
    }
};

48 ms 19 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!
Michael阿明

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Michael阿明

如果可以,请点赞留言支持我哦!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值