HashMap
hashmap的原理这里不再讲述,不晓得的小伙伴能够看这篇文章。Hash与HashMap
hashmap数据结构的引入能帮忙咱们将O(n)的工夫复杂度升高为O(1)的工夫复杂度,代价是应用了O(n)的空间复杂度。这么一看如同功过参半。然而如果咱们原来的工夫复杂度是O(n^2),应用了hashmap后工夫复杂度变为o(n),而只是空间复杂度变为O(n),那么还是很划算的。
力扣第一题,两数之和:
如果咱们用单纯的二维遍历做的话
public int[] twoSum(int[] nums, int target) { int n = nums.length; for (int i = 0; i < n; i++) { for (int j = i + 1; j < n; j++) { if (nums[i] + nums[j] == target) { return new int[]{i, j}; } } } return new int[0];}
第一种办法工夫高起因是,对于每一个第一层遍历的i,咱们都须要再次遍历数组找到target - i。
如果咱们用hashmap将数组元素值及对应下标存入hashmap里,咱们就能够间接取得target - i对应下标值,而不须要第二次遍历。
public int[] twoSum(int[] nums, int target) { Map<Integer, Integer> hashtable = new HashMap<Integer, Integer>(); for (int i = 0; i < nums.length; i++) { if (hashtable.containsKey(target - nums[i])) { return new int[]{hashtable.get(target - nums[i]), i}; } hashtable.put(nums[i], i); } return new int[0];}
遇到的理论题目是三数之和,给一个数组和一个目标值,在这个数组中找到三个数相加为目标值,如果找失去返回true,如果找不到返回false。三数之和就能够应用hashmap将三层循环降为两层循环,其余跟两数之和类似。
动静布局
某音公司口试题,力扣原题改编
思路是顺次确定是否能达到第i个地位。达到第i个地位的要求是能达到第j个地位(i>j)并能从第j个地位间接跳跃至第i个地位。
public boolean canJump(int[] nums) { // 边界判断 if (nums.length == 1) { return true; } boolean[] dp = new boolean[nums.length]; int i; // 从第1个下标能够间接达到的中央标记为可达到。 for (i = 0; i < nums[0] + 1 && i < nums.length; i++) { dp[i] = true; } // 其余标记为不可达 for (; i < nums.length; i++) { dp[i] = false; } // 对于每一个地位i,确定是否能能达到第j个地位(i>j)并能从第j个地位间接跳跃至第i个地位 for (i = nums[0] + 1; i < nums.length; i++) { for (int j = 0; j < i; j++) { if (dp[j] && j + nums[j] >= i) { dp[i] = true; break; } } } return dp[nums.length -1];}
当然这只是一种思路,这题还有更快更好的办法。
力扣139题:单词拆分
遇上题雷同思路,不过在判断一个单词是否在数组中时应用hashmap判断即可。
这题也能够应用字典树来实现,有趣味的小伙伴能够搜寻什么是字典树。
其余
某音口试有一道外围是判断否是双端队列的问题,就是一个队列只能从两端进。一次放入n个数,给一个数组判断是否是双端队列。6 3 1 2 4 5 7 8
口试过程中想简单了,后边看到其实就是找到最小数,而后判断最小数到头尾是否是递增序列。其实在学数据结构的时候做过相似的选择题,然而不须要代码实现。对于平时的思维落实到代码实现很重要。
应试技巧
在网上看见说算法题通过率*本题分数为最初得分。对于一些输入True或False的题不会做能够间接输入后果,或者输入最小次数的题也能够间接输入3或4或5。