leetcode hashmap
187. Repeated DNA Sequences
求重复的DNA序列
public List<String> findRepeatedDnaSequences(String s) { Set seen = new HashSet(), repeated = new HashSet(); for (int i = 0; i + 9 < s.length(); i++) { String ten = s.substring(i, i + 10); if (!seen.add(ten)) repeated.add(ten); } return new ArrayList(repeated); }
hashset !seen.add(ten) 添加失败返回false
299 Bulls and Cows
有一个四位数字,你猜一个结果,然后根据你猜的结果和真实结果做对比,提示有多少个数字和位置都正确的叫做bulls,还提示有多少数字正确但位置不对的叫做cows,根据这些信息来引导我们继续猜测正确的数字。这道题并没有让我们实现整个游戏,而只用实现一次比较即可。给出两个字符串,让我们找出分别几个bulls和cows。这题需要用哈希表,来建立数字和其出现次数的映射。我最开始想的方法是用两次遍历,第一次遍历找出所有位置相同且值相同的数字,即bulls,并且记录secret中不是bulls的数字出现的次数。然后第二次遍历我们针对guess中不是bulls的位置,如果在哈希表中存在,cows自增1,然后映射值减1,参见如下代码:
class Solution { public: string getHint(string secret, string guess) { int m[256] = {0}, bulls = 0, cows = 0; for (int i = 0; i < secret.size(); ++i) { if (secret[i] == guess[i]) ++bulls; else ++m[secret[i]]; } for (int i = 0; i < secret.size(); ++i) { if (secret[i] != guess[i] && m[guess[i]]) { ++cows; --m[guess[i]]; } } return to_string(bulls) + "A" + to_string(cows) + "B"; } };
我们其实可以用一次循环就搞定的,在处理不是bulls的位置时,我们看如果secret当前位置数字的映射值小于0,则表示其在guess中出现过,cows自增1,然后映射值加1,如果guess当前位置的数字的映射值大于0,则表示其在secret中出现过,cows自增1,然后映射值减1,参见代码如下:
public String getHint(String secret, String guess) { int bulls = 0; int cows = 0; int[] numbers = new int[10]; for (int i = 0; i<secret.length(); i++) { int s = Character.getNumericValue(secret.charAt(i)); int g = Character.getNumericValue(guess.charAt(i)); if (s == g) bulls++; else { if (numbers[s] < 0) cows++; if (numbers[g] > 0) cows++; numbers[s] ++; numbers[g] --; } } return bulls + "A" + cows + "B"; }
49. Group Anagrams
hashmap操作
public class Solution { public List<List<String>> groupAnagrams(String[] strs) { if (strs == null || strs.length == 0) return new ArrayList<List<String>>(); Map<String, List<String>> map = new HashMap<String, List<String>>(); for (String s : strs) { char[] ca = s.toCharArray(); Arrays.sort(ca); String keyStr = String.valueOf(ca); if (!map.containsKey(keyStr)) map.put(keyStr, new ArrayList<String>()); map.get(keyStr).add(s); } return new ArrayList<List<String>>(map.values()); } }
743. Network Delay Time
- Use Map<Integer, Map<Integer, Integer>> to store the source node, target node and the distance between them.
- Offer the node K to a PriorityQueue.
- Then keep getting the closest nodes to the current node and calculate the distance from the source (K) to this node (absolute distance). Use a Map to store the shortest absolute distance of each node.
- Return the node with the largest absolute distance.
public int networkDelayTime(int[][] times, int N, int K) { if(times == null || times.length == 0){ return -1; } // store the source node as key. The value is another map of the neighbor nodes and distance. Map<Integer, Map<Integer, Integer>> path = new HashMap<>(); for(int[] time : times){ Map<Integer, Integer> sourceMap = path.get(time[0]); if(sourceMap == null){ sourceMap = new HashMap<>(); path.put(time[0], sourceMap); } Integer dis = sourceMap.get(time[1]); if(dis == null || dis > time[2]){ sourceMap.put(time[1], time[2]); } } //Use PriorityQueue to get the node with shortest absolute distance //and calculate the absolute distance of its neighbor nodes. Map<Integer, Integer> distanceMap = new HashMap<>(); distanceMap.put(K, 0); PriorityQueue<int[]> pq = new PriorityQueue<>((i1, i2) -> {return i1[1] - i2[1];}); pq.offer(new int[]{K, 0}); int max = -1; while(!pq.isEmpty()){ int[] cur = pq.poll(); int node = cur[0]; int distance = cur[1]; // Ignore processed nodes if(distanceMap.containsKey(node) && distanceMap.get(node) < distance){ continue; } Map<Integer, Integer> sourceMap = path.get(node); if(sourceMap == null){ continue; } for(Map.Entry<Integer, Integer> entry : sourceMap.entrySet()){ int absoluteDistence = distance + entry.getValue(); int targetNode = entry.getKey(); if(distanceMap.containsKey(targetNode) && distanceMap.get(targetNode) <= absoluteDistence){ continue; } distanceMap.put(targetNode, absoluteDistence); pq.offer(new int[]{targetNode, absoluteDistence}); } } // get the largest absolute distance. for(int val : distanceMap.values()){ if(val > max){ max = val; } } return distanceMap.size() == N ? max : -1; }