MediaPlayer使用setVolume調整音量大小無效的解決方法
阿新 • • 發佈:2021-01-21
給你一個points陣列,表示 2D 平面上的一些點,其中points[i] = [xi, yi]。
連線點[xi, yi] 和點[xj, yj]的費用為它們之間的 曼哈頓距離:|xi - xj| + |yi - yj|,其中|val|表示val的絕對值。
請你返回將所有點連線的最小總費用。只有任意兩點之間 有且僅有一條簡單路徑時,才認為所有點都已連線。
示例 1:
輸入:points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
輸出:20
解釋:我們可以按照上圖所示連線所有點得到最小總費用,總費用為 20 。
注意到任意兩個點之間只有唯一一條路徑互相到達。
示例 2:
輸入:points = [[3,12],[-2,5],[-4,1]]
輸出:18
示例 3:
輸入:points = [[0,0],[1,1],[1,0],[-1,1]]
輸出:4
示例 4:
輸入:points = [[-1000000,-1000000],[1000000,1000000]]
輸出:4000000
示例 5:
輸入:points = [[0,0]]
輸出:0
提示:
1 <= points.length <= 1000
-106<= xi, yi <= 106
所有點(xi, yi)兩兩不同。
基本思路:並查集+Kruskal
class UF{ private: vector<int> parent,psize; public: UF(int len){ parent.resize(len,0); psize.resize(len,1); for(int i=0;i<len;i++){ parent[i]=i; } } int find(int x){ return x==parent[x]?x:parent[x]=find(parent[x]); } bool connect(int x,int y){ int px=find(x); int py=find(y); if(px==py) return false; if(psize[px]<psize[py]){ swap(px,py); } parent[py]=px; psize[px]+=psize[py]; return true; } }; struct Edge{ int len,x,y; Edge(int _len,int _x,int _y):len(_len),x(_x),y(_y){}; }; class Solution { public: int minCostConnectPoints(vector<vector<int>>& points) { auto calDist=[&](int x,int y)->int { return abs(points[x][0]-points[y][0])+abs(points[x][1]-points[y][1]); }; int len=points.size(); UF *uf=new UF(len); vector<Edge> edges; for(int i=0;i<len;i++){ for(int j=i+1;j<len;j++){ edges.emplace_back(calDist(i,j),i,j); } } sort(edges.begin(),edges.end(),[](Edge &a,Edge &b){ return a.len<b.len; }); int ans=0,cnt=1; for(auto &[d,x,y]:edges){ if(uf->connect(x,y)){ ans+=d; cnt++; if(cnt==len) break; } } return ans; }