T1:访问所有点的最小时间
思路:该题需要按照数组顺序来规定遍历路径(ps:开始以为是最短路的问题😥 ),且每一个点能够向上下左右和对角线走,那其实就直接判断两个点之间的横坐标与纵坐标的绝对值,取大者即可。
public int minTimeToVisitAllPoints(int[][] points) {
int res=0;
for (int i = 0; i < points.length - 1; i++) {
int a=points[i][0]-points[i+1][0];
int b=points[i][1]-points[i+1][1];
res+= Math.max(Math.abs(a),Math.abs(b));
}
return res;
}
T2: 统计参与通信的服务器
思路:直接判断同行同列中是否服务器,累加即可
public int countServers(int[][] grid) {
int res = 0;
for (int i = 0; i < grid.length; i++) {
int flag = 0;
for (int j = 0; j < grid[i].length; j++) {
if (grid[i][j]==0)continue;
for (int k = 0; k < j; k++) {
if (grid[i][k]==1){
flag=1;
break;
}
}
for (int k = j+1; k < grid[i].length; k++) {
if (flag ==1 ||grid[i][k]==1){
flag=1;
break;
}
}
for (int k = 0; k < i; k++) {
if (flag ==1 || grid[k][j]==1){
flag=1;
break;
}
}
for (int k = i+1; k < grid.length; k++) {
if (flag ==1 ||grid[k][j]==1){
flag=1;
break;
}
}
if (flag==1){
flag=0;
res++;
}
}
}
return res;
}
T3:搜索推荐系统
思路:看题目意思就是模拟百度搜索,每次打出一个字母,弹出相关推荐,也就是前缀树的操作,循环遍历查找字符串中的值,然后在前缀树中查找是否存在该前缀,如果不存在则返回一个空的List,如果存在则利用dfs,找出字典序最小的3个并返回。ps:可以存在相同单词🤣!
class Trie {
class TrieNode{
TrieNode[] child;//记录孩子节点
int is_end;//记录当前节点是不是一个单词的结束字母
public TrieNode(){//
child = new TrieNode[26];//子节点数组长度26,0:‘a’,1:‘b’.....
is_end = 0;
}
}
TrieNode root;
/** Initialize your data structure here. */
public Trie() {
root=new TrieNode();
}
/** Inserts a word into the trie. */
public void insert(String word) {
TrieNode p=root;
for(char a:word.toCharArray()){
int d=a-'a';
if(p.child[d]==null){
p.child[d]=new TrieNode();
}
p=p.child[d];
}
p.is_end++;
}
/** Returns if the word is in the trie. */
public List search(String word) {
TrieNode p=root;
for(char a:word.toCharArray()){
int d=a-'a';
if(p.child[d]==null)return new ArrayList<>();
p=p.child[d];
}
StringBuilder sb = new StringBuilder();
sb.append(word);
List list = new ArrayList<>();
dfs(p,list,sb);
return list;
}
public void dfs(TrieNode p, List list,StringBuilder sb){
if (list.size()==3 )return;
if (p.is_end>0){
for (int i = 0; i < p.is_end; i++) {
if(list.size()<3)
list.add(new String(sb.toString()));
}
}
for (int i = 0; i < 26; i++) {
if (p.child[i] != null) {
sb.append((char) (i + 'a'));
dfs(p.child[i], list, sb);
sb.delete(sb.length()-1,sb.length());
}
}
}
/** Returns if there is any word in the trie that starts with the given prefix. */
public boolean startsWith(String prefix) {
TrieNode p=root;
for(char a:prefix.toCharArray()){
int d=a-'a';
if(p.child[d]==null)return false;
p=p.child[d];
}
return true;
}
}
public List> suggestedProducts(String[] products, String searchWord) {
List> res = new ArrayList<>();
Trie t = new Trie();
for (int i = 0; i < products.length; i++) {
t.insert(products[i]);
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < searchWord.length(); i++) {
sb.append(searchWord.charAt(i));
if (!t.startsWith(sb.toString())){
res.add(new ArrayList<>());
}else res.add(t.search(sb.toString()));
}
return res;
}