每日一题Day48

1. 给定一个长度为N(N>1)的整型数组A,可以将A划分成左右两个部分,左部分A[0…K],右部分A[K+1…N-1],K可以取值的范围是[0,N-2]。求这么多划分方案中,左部分中的最大值减去右部分最大值的绝对值,最大是多少?

给定整数数组A和数组的大小n,请返回题目所求的答案。

测试样例:

[2,7,3,1,1],5

返回:6

这道题我有两种解法,第一种解法可能和本题分为两个部分没啥关系,直接在一个数组中将最大值和最小值求出,直接求出相差的值。代码如下:

import java.util.*;
public class Main {
    public int findMaxGap(int[] A, int n){
        int max = Integer.MIN_VALUE;
        for (int i = 0; i < A.length; i++){
            if (max < A[i]){
                max = A[i];
            }
        }
        return max - Math.min(A[0],A[A.length-1]);
    }
}

然后是第二种方法,第二种方法就是定义两个指针一个从左走,一个从右走,两个指针相遇即退出循环,然后两个指针分别找到最大值,然后进行最大值相减。

public class Main {
public int findMaxGap(int[] A, int n){
        int max1 = A[0];
        int max = Math.abs(A[0] - A[n-1]);
        for (int i = 0; i < n-1; i++){
            if(A[i] > max1){
                max1 = A[i];
            }
            int max2 = A[A.length -1];
            for (int j = n - 1; j > i; j--){
                if (A[j] > max2){
                    max2 = A[j];
                }
                if (Math.abs(max1 - max2) > max){
                    max = Math.abs(max1 - max2);
                }
            }
        }
        return max;
}

2. 对于一个矩阵,请设计一个算法从左上角(mat[0][0])开始,顺时针打印矩阵元素。

给定int矩阵mat,以及它的维数nxm,请返回一个数组,数组中的元素为矩阵元素的顺时针输出。

测试样例:

[[1,2],[3,4]],2,2

返回:[1,2,4,3]

解题思路就是将矩阵看成一个正方形,将他四条表逆时针转,将每个位置的矩阵一次放入一个一维数组,最后将数组返回。所以我们需要定义这个矩阵的位置,设矩阵左上开始的点为(x1,y1),矩阵最后一行的最右边坐标为(x2,y2).因此,代码如下:

public int[] clockwisePrint(int[][] mat, int n, int m){
        int x1 = 0;
        int x2 = n-1;
        int y1 = 0;
        int y2 = m -1;
        int[] arr = new int[n*m];
        int index = 0;
        while(x1 <= x2 && y1 <= y2){
            //先打印第一行 列坐标变化,横坐标不变
            for(int i = y1; i <= y2; i++){
                arr[index++] = mat[x1][i];
            }
            //再打印最后一列,横坐标变化,列坐标不变
            for (int i = x1+1; i <= x2; i++ ){
                arr[index++] = mat[i][y2];
            }
            //再打印最后一行,横坐标不变,列在变化
            if (x1 < x2){
                for (int i = y2-1 ; i >= y1; i--){
                    arr[index++] = mat[x2][i];
                }
            }
            //再打印第一列,纵坐标不变,横坐标变化
            if (y1 < y2){
                for (int i = x2 - 1; i >= x1 + 1; i--){
                    arr[index++] = mat[i][y1];
                }
            }
            x1++;
            y1++;
            x2--;
            y2--;
        }
        return arr;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值