277. Find the Celebrity
knows(i, j):
By comparing a pair(i, j), we are able to discard one of them
1. True: i 必定不是Celebrity, 因为Celebrity不认识任何人
2. False: j 必定不是Celebrity, 因为Celebrity要被其他人认识。
第一轮:找出一个可能是Celebrity的Candidate,因为在之前的人都不是Celebrity,Candidate不认识后面的人,后面的人也不是Celebrity,但是前面的人可能不认识这个Candidate。
第二轮:验证这个Candidate是不是Celebrity。
public class Solution extends Relation {
public int findCelebrity(int n) {
int candidate = 0;
//1. Find a candidate by one pass:(make sure other people are not a celebrity)
for(int i = 1; i < n; i++){
if(knows(candidate, i)){
candidate = i;
}
}
//2. Make sure if the candidate is a celebrity by one pass
for(int i = 0; i < n; i++){
if(i == candidate){
continue;
}
if(!knows(i, candidate) || knows(candidate, i)){
return -1;
}
}
return candidate;
}
}
243. Shortest Word Distance
用index a和b来记录xia
class Solution {
public int shortestDistance(String[] words, String word1, String word2) {
int a = -1;
int b = -1;
int result = Integer.MAX_VALUE;
for(int i = 0; i < words.length; i++){
if(word1.equals(words[i])){
a = i;
}else if(word2.equals(words[i])){
b = i;
}
if(a != -1 && b != -1){
result = Math.min(result, Math.abs(a - b));
}
}
return result;
}
}
244. Shortest Word Distance II
用HashMap来记录每个单词和他的索引,然后再计算距离的最小值。
class WordDistance {
Map<String, List<Integer>> map = new HashMap<>(); public WordDistance(String[] words) {
for(int i = 0; i < words.length; i++){
if(map.containsKey(words[i])){
map.get(words[i]).add(i);
}else{
List<Integer> list = new ArrayList<>();
list.add(i);
map.put(words[i], list);
}
}
} public int shortest(String word1, String word2) {
List<Integer> l1 = map.get(word1);
List<Integer> l2 = map.get(word2);
int i = 0, j = 0;
int result = Integer.MAX_VALUE; while(i < l1.size() && j < l2.size()){
if(l1.get(i) < l2.get(j)){
result = Math.min(result, l2.get(j) - l1.get(i));
i++;
}else{
result = Math.min(result, l1.get(i) - l2.get(j));
j++;
}
} return result;
}
}
245. Shortest Word Distance III
用b来记录上一个相同string的位置,到第二个位置的时候赋值给a。
class Solution {
public int shortestWordDistance(String[] words, String word1, String word2) {
int a = words.length, b = -words.length;
int result = Integer.MAX_VALUE;
for(int i = 0; i < words.length; i++){
if(words[i].equals(word1)){
a = i;
}
if(words[i].equals(word2)){
if(word1.equals(word2))
a = b;
b = i;
}
if(a != -1 && b != -1){
result = Math.min(result, Math.abs(a - b));
}
}
return result;
}
}