ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

仓库管理-逆向输入转并查集

2022-07-02 17:01:52  阅读:175  来源: 互联网

标签:逆向 仓库 sum 查集 pos rootP int rootQ 节点


题目链接meituan-002. 小美的仓库整理 - 力扣(LeetCode)

 

思路,正序每次删除一个节点,将货物多拆出来一堆,反过来看,对于一个空数组,每次向内部插入一个节点,根据节点的位置,使用并查集查找根节点的方式查看是否是连续的。

在插入新节点的时候,最大值只可能被新节点加入到的集合中改变,因此每次加入的时候判断左侧或者右侧是否有值,有的话分别和两侧进行合并,在合并的过程中,修改树的重量即可。

 1 import java.util.*;
 2 class Solution{
 3     // 逆向 并查集
 4     public static void main(String[] args){
 5         Scanner scan = new Scanner(System.in);
 6         int n = scan.nextInt();
 7         int[] w = new int[n];
 8         for(int i=0;i<n;i++){
 9             w[i] = scan.nextInt();
10         }
11         int[] pick = new int[n]; // 当前选择的
12         for(int i=0;i<n;i++){
13             pick[i] = scan.nextInt()-1;
14         }
15         int max = -1;
16         UnionFind uf = new UnionFind(n);
17         int[] ans = new int[n];
18      
19         for(int i=n-1;i>=0;i--){  
20             int pos = pick[i]; // 逆序
21             // 在pos
22             uf.parent[pos] = pos;// 插入后自己指向自己
23             uf.sum[pos] = w[pos];// 插入后以自己为头的重量
24             if(pos>0 && uf.parent[pos-1] != -1){ // 左边还有节点
25                 uf.union(pos,pos-1);
26             }
27             if(pos<n-1 && uf.parent[pos+1] !=-1){ // 右边还有节点
28                 uf.union(pos,pos+1);
29             }
30             max = Math.max(max,uf.sum[uf.find(pos)]); // 新加入的点,可能和某个树组成的最大和
31             ans[i] = max;
32         }
33         for(int i=1;i<n;i++){
34             System.out.println(ans[i]);        
35         }
36         System.out.println(0);        
37     }
38 }
39 
40 class UnionFind{
41     int[] parent;
42     int[] sum;
43     int[] size;
44     public UnionFind(int n){
45         this.size = new int[n];
46         this.sum = new int[n]; // 以i为根节点的重量
47         this.parent = new int[n]; // 父节点
48         for(int i=0;i<n;i++){
49             parent[i] = -1;// 代表当前节点还没有加入
50             sum[i] = 0; // 当前总和为0
51             size[i] = 1;
52         }
53     }
54     //找到当前节点的根节点
55     public int find(int p){
56         while(parent[p] != p){
57             parent[p] = parent[parent[p]];
58             p = parent[p];
59         }
60         return p;
61     }
62     //连接
63     public void union(int p,int q){
64         int rootP = find(p);
65         int rootQ = find(q);
66         if(rootP==rootQ){
67             return;
68         }
69         if(size[rootP]>size[rootQ]){
70             parent[rootQ] = rootP; // 合并根节点
71             size[rootP] += size[rootQ]; // 修改元素数量
72             sum[rootP] += sum[rootQ]; // 修改总和
73          }else{
74              parent[rootP] = rootQ;
75              size[rootQ] += size[rootP];
76              sum[rootQ] += sum[rootP];
77          }
78     }
79 }

 

标签:逆向,仓库,sum,查集,pos,rootP,int,rootQ,节点
来源: https://www.cnblogs.com/jsuxk/p/16437886.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有