leetCode185富有和安静

package com.douyin;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;

/*
https://blog.csdn.net/weixin_43175029/article/details/92842259

题意:
在一组N个人(0,1,2,,,,N-1),每个人都有不同的钱以及不同的安静值,我们将
编号为x的人称为person x, richer[i]=[x,y],表示x比y富有
person x的安静程度为q,我们会说:quiet[x]=q.

answer[x]=y的前提是,在所有比x富有的人中,y是最安静的。

输入:
richer=[[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], quiet=[3,2,5,4,6,1,7,0]
输出:[5,5,2,5,4,5,6,7]

0  1  2  3  4  5  6  7  ---编号人
3  2  5  4  6  1  7  0  ---安静值
answer[0]=5,其中编号为0的人,比其富有的人有直接有1,间接有2,3,在间接有4,5 ,最安静的为5

*/

public class SearchRicherQuiet {
    
    private ArrayList vertexList;//存储点的链表
    private static int[][] edges;//邻接矩阵,用来存储边
    private int numOfEdges;//边的个数
    
    //初始化
    public SearchRicherQuiet(int n){
        vertexList=new ArrayList(n);
        edges=new int[n][n];
        numOfEdges=0;
    }
    
    //返回V1,V2的权值
    public int getWeight(int v1,int v2){
        return edges[v1][v2];
    }
    
    //插入边
    public void insertEdge(int v1,int v2,int weight){
        edges[v1][v2]=weight;
        numOfEdges++;
    }
    //删除边
    public void deleteEdge(int v1,int v2){
        edges[v1][v2]=0;
        numOfEdges--;
        
    }
    
    
    private static void getRicherAndQuiet(int person, boolean[] visited,Set<Integer> set,int n) {
        
       //得到该节点临近节点
       Set<Integer> newSet=getNeighbour(person,n,visited);
       set.addAll(newSet);
       for(int tmp:newSet){
           getRicherAndQuiet(tmp,visited,set,n);
       }
       
    }
    
    
    private static Set<Integer> getNeighbour(int person,int n,boolean[] visited) {
        Set<Integer> set=new HashSet<Integer>();
        for(int i=0;i<n;i++){
          if(visited[i]==false&&edges[person][i]==1){
              set.add(i);
              visited[i]=true;
          }       
        }
        return set;
    }

    
    public static void main(String[] args) {
        
        //richer=[[1,0],[2,1],[3,1],[3,7],[4,3],[5,3],[6,3]], 
        //quiet=[3,2,5,4,6,1,7,0]
        //输出:[5,5,2,5,4,5,6,7]
        
        int[] quiet={3,2,5,4,6,1,7,0};
        int[][] richers={{1,0},{2,1},{3,1},{3,7},{4,3},{5,3},{6,3}};
        int n=quiet.length;
        SearchRicherQuiet srq=new SearchRicherQuiet(n);
        
        //直接输入
        edges[0][1]=1;
        edges[1][2]=1;
        edges[1][3]=1;
        edges[7][3]=1;
        edges[3][4]=1;
        edges[3][5]=1;
        edges[3][6]=1;
        
        int[] results=new int[n];
        for(int i=0;i<n;i++){
            //System.out.println("i="+i);
            int person=i;//编号为0的人
            //查找比person富的人,找其中最安静的
            boolean[] visited=new boolean[n];
            visited[person]=true;
            Set<Integer> set=new HashSet<Integer>();
            getRicherAndQuiet(person,visited,set,n);
            //System.out.println(set);
            //获取最安静的人
            int result=getRealIndex(set,quiet,person);
            results[person]=result;
            System.out.println("answer["+person+"]="+result);
        }
        
        System.out.println("");
        for(int i=0;i<results.length;i++){
            System.out.print(" "+results[i]);
        }
        System.out.println("");
    
        
    }

    
    private static int getRealIndex(Set<Integer> set, int[] quiet,int person) {
        
        if(set.isEmpty()){
            return person;
        }
        
        int result=person;
        int min=quiet[person];
        
        for(int tmp:set){
            int tmpValue=quiet[tmp];
            
            if(tmpValue<min){
                result=tmp;
                min=tmpValue;
            }
            
        }
        
        return result;
    }


}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值