Google – Adjacent Points of K dimensional
Given a point in k dimension vector, find all adjacent points.
For example:
(0, 0) is a point in 2-dimension, then the adjacent points are
[(0, -1), (0, 1), (1, -1), (1, 0), (1, 1), (-1, -1), (-1, 0), (-1, 1)]
[Solution]
这道题乍一看根本没有任何想法,但是知道答案之后又有种恍然大悟"其实也就这样吧"的感觉。。可是面试题往往就这样,难是不会难到哪里去的,重点就看思路能不能想到对的点上。
其实这道题就是一道普通的backtracking题,无论有多少dimension,它的邻接点无非就是每个坐标+1,-1和保持原样三种变化。直接backtracking就好了。
所以对于k dimension中的一个点,它的邻接点一共有3^k – 1个。
你说难么?不难啊!这种backtracking代码写写几分钟的事情。可是怎么从一道看似几何的题目想到传统的backtracking上呢?这种技能点还得多练练。
Read full article from Google – Adjacent Points of K dimensional
Given a point in k dimension vector, find all adjacent points.
For example:
(0, 0) is a point in 2-dimension, then the adjacent points are
[(0, -1), (0, 1), (1, -1), (1, 0), (1, 1), (-1, -1), (-1, 0), (-1, 1)]
[Solution]
这道题乍一看根本没有任何想法,但是知道答案之后又有种恍然大悟"其实也就这样吧"的感觉。。可是面试题往往就这样,难是不会难到哪里去的,重点就看思路能不能想到对的点上。
其实这道题就是一道普通的backtracking题,无论有多少dimension,它的邻接点无非就是每个坐标+1,-1和保持原样三种变化。直接backtracking就好了。
所以对于k dimension中的一个点,它的邻接点一共有3^k – 1个。
你说难么?不难啊!这种backtracking代码写写几分钟的事情。可是怎么从一道看似几何的题目想到传统的backtracking上呢?这种技能点还得多练练。
public
List<List<Integer>> adjacentPoints(List<Integer> point) {
List<List<Integer>> result =
new
LinkedList<>();
if
(point ==
null
|| point.isEmpty()) {
return
result;
}
List<Integer> tmp =
new
ArrayList<>(point);
dfs(point, tmp,
0
, result);
return
result;
}
private
boolean
isSame(List<Integer> a, List<Integer> b) {
if
(a.size() != b.size()) {
return
false
;
}
for
(
int
i =
0
; i < a.size(); i++) {
if
(a.get(i) != b.get(i)) {
return
false
;
}
}
return
true
;
}
private
void
dfs(List<Integer> point, List<Integer> tmp,
int
pos, List<List<Integer>> result) {
if
(pos == tmp.size()) {
if
(!isSame(point, tmp)) {
result.add(
new
ArrayList<>(tmp));
}
return
;
}
// 0
dfs(point, tmp, pos +
1
, result);
int
save = tmp.get(pos);
// -1
tmp.set(pos, save -
1
);
dfs(point, tmp, pos +
1
, result);
// +1
tmp.set(pos, save +
1
);
dfs(point, tmp, pos +
1
, result);
// recover
tmp.set(pos, save);
}