20201023:力扣第37场双周赛(上)

力扣第37场双周赛(上)

题目

    1. 删除某些元素后的数组均值
      在这里插入图片描述
      在这里插入图片描述
    1. 网络信号最好的坐标
      在这里插入图片描述
      在这里插入图片描述

思路与算法

  1. 第二题直接暴力就可以了,计算每个点的所有偏移量存入list,即以(0,0)为圆心,半径为radius,求这个圆内能覆盖的整数点,存入list,这就是每个坐标的可能偏移量,然后代入每个点计算符合题目要求的点即可,注意计算的时候不要把欧几里得距离转化为整型,使其保持双精度进行比较。
  2. 要学的太多,周赛有时间就写题解,没时间也没办法。诸君共勉,身体为重。效率至上

代码实现

    1. 删除某些元素后的数组均值
class Solution {
    
    
    public double trimMean(int[] arr) {
    
    
        int len = arr.length;
        int len1 = (int) (len * 0.05);
        Arrays.sort(arr);
        double sum = 0;
        for (int i = len1; i < len - len1; i++) {
    
    
            sum += arr[i];
        }
        return sum / (len - 2 * len1) ;
    }
}
    1. 网络信号最好的坐标
class Solution {
    
    
	public int[] bestCoordinate(int[][] towers, int radius) {
    
    
		int[] res = new int[2];
		int max_x = 0;
		int max_y = 0;
		// 遍历towers数组找到最大的x和y坐标,即最上边和最右边的点
		for (int[] t : towers) {
    
    
			if (t[0] > max_x) {
    
    
				max_x = t[0];
			}
			if (t[1] > max_y) {
    
    
				max_y = t[1];
			}
		}
		
		// 将所有塔能覆盖的点以坐标为索引存入二维数组
		int[][] sig = new int[max_x + radius + 1][max_y + radius + 1];
		
		// 计算偏移量
		List<int[]> points = new ArrayList<>();
		for (int i = 0 - radius; i <= radius; i++) {
    
    
			for (int j = 0 - radius; j <= radius; j++) {
    
    
				if (distance(i,j) <= radius) {
    
    
					points.add(new int[] {
    
    i,j});
				}
			}
		}
		
		// 覆盖范围内的点计算signal强度并存入sig
		for (int[] t : towers) {
    
    
			for (int[] p : points) {
    
    
				// 经过偏移后的坐标值(x,y)
				int x = t[0] + p[0];
				int y = t[1] + p[1];
				if ( x >= 0 && y >= 0) {
    
    
					sig[x][y] += signal(t[2],p[0],p[1]);
				}
			}
		}
		
		// 找到sig最大的值,倒序找确保字典序最小的最后被找到
		int max_signal = 0;
		for (int i = sig.length - 1; i >= 0; i--) {
    
    
			for (int j = sig[0].length - 1; j >= 0; j--) {
    
    
				if (sig[i][j] >= max_signal) {
    
    
					max_signal = sig[i][j];
					res[0] = i;
					res[1] = j;
				}
			}
		}
		
		return res;
	}

	private double distance(int i, int j) {
    
    
		return Math.sqrt(i * i + j * j);
	}
	private int signal(int q,int x,int y) {
    
    
		return (int) (q / (1 + distance(x,y)));
	}
}

写在最后

冲!

猜你喜欢

转载自blog.csdn.net/qq_36828395/article/details/109236848