1. 程式人生 > 其它 >MediaPlayer使用setVolume調整音量大小無效的解決方法

MediaPlayer使用setVolume調整音量大小無效的解決方法

技術標籤:leetcode並查集

1584. 連線所有點的最小費用

給你一個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;

    }