一些很有用的小函数(自己写的)

1.求一个矩阵乘法和矩阵乘方

 /** 
	 * 矩阵乘法
	 * @param A x*y的矩阵
	 * @param B y*z的矩阵
	 * @return C x*z的矩阵
	 */
	public static int[][] multi(int A[][], int B[][]) {
		// A的行数
		int x = A.length;
		// A的列数 = B的行数
		int y = B.length;
		// B的列数
		int z = B[0].length;
		// 需要返回的数组
		int C[][] = new int[x][z];
		
		for (int i = 0; i < x; i++) {
			for (int j = 0; j < z; j++) {
				for (int k = 0; k < y; k++) {
					C[i][j] += A[i][k] * B[k][j];
				}
			}
		}
		return C;
	}
 /**
	 * 矩阵乘方
	 * @param A 需要进行乘方的x*x矩阵
	 * @param n 需要进行乘方的次数
	 * @return C 结果矩阵
	 */
	public static int[][] pow(int A[][], int n) {
		int x = A.length;
		int[][] C = A;
		// n次方只需要乘以n-1次
		for (int i = 0; i < n - 1; i++) {
			C = multi(C, A);
		}
		return C;
	}

2.进制转换函数,将一个数转换为2-16进制的数

 /**
	 * 进制抓换
	 * @param n 需要转换的数字
	 * @param r r代表转换为r进制,可以是2-16之间的数字
	 * @return 返回被转化进制之后的字符串
	 */
	public static String convert(int n,int r){
		StringBuilder sb = new StringBuilder();
		int remainder = n%r;
		//取余
		while(n !=0 ){
			switch(remainder){
			case 10:
				sb.append('A');
				break;
			case 11:
				sb.append('B');
				break;
			case 12:
				sb.append('C');
				break;
			case 13:
				sb.append('D');
				break;
			case 14:
				sb.append('E');
				break;
			case 15:
				sb.append('F');
				break;
			default:
				sb.append(String.valueOf(remainder));
			}
			n = n/r;
			remainder = n%r;
		}
		//余数倒序
		return sb.reverse().toString();
	}

3.求完全二叉树的公共祖先

/**
	 * 求完全二叉树的公共祖先,二叉树根结点下标为1
	 * @param a 第一个节点的下标
	 * @param b 第二个节点的下标
	 * @return 返回公共祖先的下标
	 */
	public int getLCA(int a, int b) {
		while (a != b) {
			if (a > b)
				//a变成a的父结点
				a = a / 2;
			else
				//b变成b的父结点
				b = b / 2;
		}
		return a;
	}

4.求一维数组的最大连续子序列的和和二维矩阵最大子矩阵的和

/**
     * 求一位数组的最大连续子序列的和
     * @param array 传递进去的一位数组
     * @param n 数组的长度
     * @return 返回连续最大连续子序列的和
     */
    public  int maxSubArray(int[] array,int n){
    	int sum = 0;
    	int max = Integer.MIN_VALUE;
    	for(int i = 0;i<n;i++){
            sum+=array[i];
            if(sum<0)
                sum=0;
        	if(sum>max)
        		max = sum;
    	}
    	return max;
    }
/**
     * 求矩阵的最大子矩阵的和
     * 思路是将二维的矩阵化为一维的数组,求一维数组的最大连续子序列的和
     * @param mat 二维矩阵n*n
     * @param n 矩阵的阶数
     * @return 返回最大子矩阵的和
     */
    public int sumOfSubMatrix(int[][] mat, int n) {
    	int[] temp = new int[n];
    	//初始化
        for(int i = 0;i<n;i++)
            temp[i] = 0;
        int max = Integer.MIN_VALUE;
        
        //从第一行开始往下加...从第二行开始往下加......从第n行开始往下加
         for(int i  = 0;i<n;i++){
        	 //temp只加了一行
        	 temp = mat[i];
        	 max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
        	 //temp开始往下加第二行,第三行...
             for(int j = i+1;j<n;j++){
            	 for(int k = 0;k<n;k++){
            		 temp[k] +=mat[j][k];
            	 }
            	 //每加完一行之后,比较一下最大值
            	 max = (maxSubArray(temp,n)>max)?maxSubArray(temp,n):max;
             }
         }
    	return max;
    }




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值