题目
一、
思路:
根据并查集的模版写出并查集的初始化,查找和合并函数,之后根据要求使用相应的函数。
方法:
1、根据要求输入元素个数N和操作个数M。
2、循环M次,每次先输入Z,判断。若Z=1,则将x和y进行合并,若Z=2,则判断x和y的根节点是否相同,相同则输出“Y”,不同则输出“N”。
代码实现:
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
int fa[10000];
//初始化
void init(int n){
int i;
for(i=0;i<=n;i++)
{
fa[i]=i;
}
}
//查找
int find(int x){
if(fa[x]==x){
return x;
}else{
fa[x]=find(fa[x]);
return fa[x];
}
}
//合并
void unionn(int i,int j){
int i_fa=find(i);
int j_fa=find(j);
fa[i_fa]=j_fa;
}
int main(){
int N,M,i,Z,x,y;
scanf("%d",&N);
init(N);
scanf("%d",&M);
for(i=0;i<M;i++){
scanf("%d",&Z);
scanf("%d%d",&x,&y);
if(Z==1){
unionn(x,y);
}
if(Z==2){
if(find(x)==find(y)){
printf("Y\n");
}if(find(x)!=find(y)){
printf("N\n");
}
}
}
return 0;
}
二、
思路:
因为上和下,左和右的视图形状相同,方向相反,所以只考虑左和下即可。增加的高度不改变视图,就得使其高度小于它所在行的最大值,列的最大值,即小于二者较小的那个,之后遍历全部元素使其增加的最大值相加即可。
方法:
创建数组h存放每一行最大值,创建数组l存放每一列最大值
通过循环比较出最大值并将其存入数组中
遍历每一个元素,找出其所在行和列最大值较小的那一个,用它减去元素值就是该元素最大增加量,将每个元素增加量相加,得出结果。
代码实现:
class Solution {
public int maxIncreaseKeepingSkyline(int[][] grid) {
int[] h=new int[grid.length];//每行最大数
int[] l=new int[grid.length];//每列最大数
int result=0;
int max=0;
for (int i = 0; i < grid.length; i++) {
for (int i1 = 0; i1 < grid[0].length; i1++) {
if(grid[i][i1]>max){
max=grid[i][i1];
}
}
h[i]=max;
max=0;
}
for (int i = 0; i < grid.length; i++) {
for (int i1 = 0; i1 < grid[0].length; i1++) {
if(grid[i1][i]>max){
max=grid[i1][i];
}
}
l[i]=max;
max=0;
}
for (int i = 0; i < grid.length; i++) {
for (int i1 = 0; i1 < grid[0].length; i1++) {
result+=Math.min(h[i],l[i1])-grid[i][i1];
}
}
return result;
}
}
知识点总结:
接口应用:
若参数为借口,则接口的实现类对象均可作为参数
适配器的设计模式:(解决接口与实现类之间的矛盾)
在实现类和接口之间添加一个抽象类
内部类:
特点:
内部类可直接访问外部类成员,包括私有
外部类要访问内部类成员,必须创建对象
场景:
B事物是A事物的一部分,且单独存在没有意义
成员内部类(可被修饰):
获取内部类对象:
私有:编写方法,对外提供内部类对象
非私有:外部类名.内部类名.对象名=外部类对象.内部类对象
注:Outer.this.变量名 用于重名时,内部类访问外部类
静态内部类:
1、只访问外部类中静态成员变量
2、若访问非静态则需创建对象
3、创建静态内部类格式:Outer.Inner oi=new Outer.Inner;
4、调用静态方法
局部内部类(在方法内):
匿名内部类(隐藏了名字):
格式:new 类名/接口名(){
重写方法;
};
1、实现或继承
2、方法重写
3、创建对象
场景:可直接将其放在参数中
注:可写在成员位置和局部位置
常用API
一、Math类
常用:
public static int abs (int a) 绝对值
double ceil(double a) 向上取整
double floor(double a) 向下取整
int rount() 四舍五入
int max() 最大值
double pow (a,b) a的b次幂
double random() 返回随机值[(0,0),(1,0)]