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阿明

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章