LeetCode 第164场周赛

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;
    }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值