難度:Medium
描述:給一個名為 points 的數列,代表二維平面上一些點的整數座標,其中 points[i] = [xi, yi]。
連接兩個點 [xi, yi] 和 [xj, yj] 的成本是它們之間的曼哈頓距離:|xi - xj| + |yi - yj|,其中 |val| 表示 val 的絕對值。
返回使所有點連接的最小成本。
如果任意兩點之間僅存在一條簡單路徑,則所有點都是連接的。
方法:
最小成本生成樹(Minimum Spanning Tree,MST)
思路:
1.以0為起始點加入Set。
2.尋找Set 中Point連接的最短邊,將Point加入Set。
3.直到所有Point加入Set。
Time Complexity : O(n2)
Runtime : 166 ms (80.41%)
Memory : 27.64 MB (89.27%)
class Solution {
public:
int calculateCost(vector<int>& p1,vector<int>& p2){
return abs(p1[0]-p2[0]) + abs(p1[1]-p2[1]);
}
int minCostConnectPoints(vector<vector<int>>& points) {
int ans = 0;
vector<vector<int>> costTable(points.size(), vector<int>(points.size(), 0));
set<int> S;
for(int i=0;i<points.size();++i){
for(int j=i+1;j<points.size();++j){
costTable[i][j] = costTable[j][i] = calculateCost(points[i],points[j]);
}
}
S.insert(0);
vector<int>& Scost = costTable[0];
while(S.size()<points.size()){
for(int i=1;i<points.size();++i){
if(S.find(i)==S.end()){
int minE = INT_MAX;
int findNode = -1;
for(int j=0;j<points.size();++j){
if(S.find(j)!=S.end()){
continue;
}
if(Scost[j]<minE){
minE = Scost[j];
findNode = j;
}
}
S.insert(findNode);
ans += minE;
//update
for(int j=0;j<points.size();++j){
if(costTable[findNode][j]<Scost[j]){
Scost[j] = costTable[findNode][j];
}
}
}
}
}
return ans;
}
};
沒有留言:
張貼留言