573. 松鼠模拟
作者:互联网
ID: 573
TITLE: 松鼠模拟
TAG: C++
方法一:简单的解决方法
算法:
- 我们知道,任意两点(树、松鼠、坚果)之间的距离是对应的
x
坐标和对应的y
坐标之间差的绝对值的和。 - 现在,为了确定所需的最小距离,我们需要观察几个点。首先,挑选坚果的顺序不会影响最终结果,除了需要先从松鼠的起始位置访问的一个坚果。对于剩下的坚果,必须从树爬到坚果,然后再回来。
- 对于第一次访问的坚果,节省的距离
d
表示树与当前坚果之间的距离与当前坚果与松鼠之间的距离之差。这是因为对于这个坚果,我们不需要从树到坚果,而是需要从松鼠的原始位置到坚果再移动一段距离。 - 对于第一次访问的坚果,
d
是树和当前坚果之间的距离与当前坚果和松鼠之间的距离的差。 - 这是因为对于这个坚果,我们不需要从树到坚果,而是需要从松鼠的原始位置到坚果再移动一段距离回到树。
- 在遍历
nuts
数组并添加来回距离时,如果松鼠先去当前的坚果,可以得到节省量d
。在所有的nuts
中,我们找出最大节约量d
对应的坚果位置,然后从所有坚果的往返距离之和中扣除d
。
code author:陈乐乐
class Solution {
public:
int minDistance(int height, int width, vector<int>& tree, vector<int>& squirrel, vector<vector<int>>& nuts) {
int d=INT_MIN;//存放最大节省量
int sum=0;//路程
for(int i=0;i<nuts.size();i++)
{
int tree_nuts=abs(tree[0]-nuts[i][0])+abs(tree[1]-nuts[i][1]);//树到坚果的距离
int squ_nuts=abs(squirrel[0]-nuts[i][0])+abs(squirrel[1]-nuts[i][1]);//松鼠到坚果的距离
int difference= tree_nuts-squ_nuts;//差
d=max(d,difference);//取最大
sum+=2*tree_nuts;
}
return sum-d;
}
};
复杂度分析
- 时间复杂度:O(n)。我们需要遍历整个 nuts 数组一次。N 表示 nuts 数组的大小。
- 空间复杂度:O(1),使用了常数的空间
标签:573,复杂度,距离,坚果,int,vector,松鼠,模拟 来源: https://blog.csdn.net/weixin_39139505/article/details/100108871