JAVA学习总结

题目

一、

思路:

根据并查集的模版写出并查集的初始化,查找和合并函数,之后根据要求使用相应的函数。

方法:

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)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值