博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[hiho]最大集合
阅读量:5897 次
发布时间:2019-06-19

本文共 1425 字,大约阅读时间需要 4 分钟。

题目

题目1 : 最大集合

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

给定一个1-N的排列A[1], A[2], ... A[N],定义集合S[K] = {A[K], A[A[K]], A[A[A[K]]] ... }。  

显然对于任意的K=1..N,S[K]都是有限集合。  

你能求出其中包含整数最多的S[K]的大小吗?

输入

第一行包含一个整数N。(1 <= N <= 100000)  

第二行包含N个两两不同的整数,A[1], A[2], ... A[N]。(1 <= A[i] <= N)

输出

最大的S[K]的大小。

样例输入
7  6 5 1 4 2 7 3
样例输出
4

暴力解法 结果超时了。

import java.util.HashSet;import java.util.Scanner;import java.util.Set;/** * Created by aolie on 2017/5/7. */public class Main {    public static void main(String args[]){        Scanner sc = new Scanner(System.in);        int N = sc.nextInt();        int [] A = new int[N];        for(int i=0;i
myset = new HashSet<>(); while(temp<=N&&temp>=1&&myset.add(temp)){ myset.add(temp); temp = A[temp-1]; } res = Math.max(res,myset.size()); } return res; }}

 优化: 用set来记录遍历的状态,若发现遍历过了 即刻返回 

public static int  help(int N,int [] A){       Set
myset = new HashSet<>(); int res=0; for(int i=1;i<=N;i++){ int j=i; if(myset.contains(j)) continue; Set
temp = new HashSet<>(); while(A[j]<=N){ if(temp.contains(j)||myset.contains(j)) break; temp.add(j); j =A[j]; } Iterator inte = temp.iterator(); for(int k=0;k

  

转载于:https://www.cnblogs.com/CongLollipop/p/6839516.html

你可能感兴趣的文章
TextView-setCompondDrawables用法
查看>>
由扭结理论中的琼斯多项式的证明想到的
查看>>
淘宝Hadoop集群的概况
查看>>
webservice接口读取xml文件内容
查看>>
Centos7安装rabbitmq server 3.6.0
查看>>
关于eclipse的ADT(插件)对xml的android:text属性检查修改
查看>>
linux生成自验证ssl证书的具体命令和步骤
查看>>
Mvc 提交表单的4种方法全程详解
查看>>
iostat命令学习
查看>>
SQL 三种分页方式
查看>>
查看linux是ubuntu还是centos
查看>>
html video的url更新,自动清缓存
查看>>
IOS Xib使用——为控制器添加Xib文件
查看>>
CentOS 7.0默认使用的是firewall作为防火墙,这里改为iptables防火墙步骤
查看>>
react 取消 eslint
查看>>
codeforces 960C Subsequence Counting
查看>>
分布式缓存中三种负载均衡的方法
查看>>
【11】ajax请求后台接口数据与返回值处理js写法
查看>>
[迭代思想]求下面分数序列的前13项之和
查看>>
【STM32】STM32 GPIO模式理解
查看>>