数据结构算法记录

1. K-th临近

直接暴力穷举会超时,可以根据题目数据范围进行优化。
栗子:

  • 添加操作:add(x, y);0 <= x, y <= 4000;
    一般K临近算法又会有其他条件,例如说多近才算是临近,记临近范围为L;4 <= L < 100;
    tips:
  1. 设置一个数组收集所有临近节点
Node[][] nodeList = new Node[4001][4001];
  1. 然后根据L画圆,将圆内所有的点收集起来,然后排序即可
int beginX = Math.max(0, x-L); // 预防出界
int endX = Math.min(4000, x+L);
int beginY = Math.max(0, y-L);
int endY = Math.min(4000, y+L);

for (int i = beginX; i <= endX; i++) {
	for (int j = beginY; j < endY; j++) {
		
		// 收集圆内节点
		...
	
	}
}
  1. 继续优化
    第1、2步其实可以解出正确答案了,但是这个圆画的太大了,容易TLE;
    可以将数组整体缩小,例如100倍。同时所有输入的x、y也要缩小100倍;
ArrayList<Node>[][] nodeList = new ArrayList<Node>[4001 / 100][4001 / 100];

int beginX = (x - L) /100; // 预防出界
int endX = (x + L) / 100;
int beginY = (y - L) / 100;
int endY = (y + L) / 100;

for (int i = beginX; i <= endX; i++) {
	for (int j = beginY; j < endY; j++) {
		
		// 排除一些超越L距离的节点
		
		// 收集圆内节点
		...
	
	}
}

之前的Node[][]数组变成了ArrayList[][],因为/100,用int接收,可能会重叠,所有用ArrayList去接收重叠的整体节点;
由于L没有整除100,所以会多收集一些超过L的节点,因此在搜索的过程中要排除一下。
可以发现整体缩小后,两层for循环减少了平方复杂度,解决了TLE的问题!

你可能感兴趣的:(算法,数据结构,java)