题目
-
- 删除某些元素后的数组均值
- 删除某些元素后的数组均值
-
- 网络信号最好的坐标
- 网络信号最好的坐标
思路与算法
- 第二题直接暴力就可以了,计算每个点的所有偏移量存入list,即以(0,0)为圆心,半径为radius,求这个圆内能覆盖的整数点,存入list,这就是每个坐标的可能偏移量,然后代入每个点计算符合题目要求的点即可,注意计算的时候不要把欧几里得距离转化为整型,使其保持双精度进行比较。
- 要学的太多,周赛有时间就写题解,没时间也没办法。诸君共勉,身体为重。效率至上
代码实现
-
- 删除某些元素后的数组均值
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) ;
}
}
-
- 网络信号最好的坐标
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)));
}
}
写在最后
冲!