介绍
针对leetcode的热门一百题,解决大多数实习生面试的基本算法题。通过我自己的思路和多种方法,供大家参考。
1.两数之和(题号:1)
方法一
最先想到的就是两个for去遍历匹配。
class Solution {
public int[] twoSum(int[] nums, int target) {
for(int i = 0; i < nums.length; i++)
for(int j = i + 1; j < nums.length; j++) {
if(nums[i] + nums[j] == target) {
return new int[] {i, j};
}
}
return null;
}
}
效率低下。
尝试其他方法。
方法二
使用Hash表进行匹配。也是先进行一次遍历,任何直接使用containKey匹配符合条件的值。
class Solution {
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> numMap = new HashMap<>();
//在为map赋值的时候顺便进行判断
//判断当前map中是否存在其他key2可以得到当前key1相加等于target
for(int i = 0; i < nums.length; i++) {
if(numMap.containsKey(target - nums[i])) {
//存在直接返回数据即可,此时是没有包含本身值 + 本身值是否=target
return new int[] {i, numMap.get(target - nums[i])};
}
numMap.put(nums[i], i);
}
return new int[2];
}
}
效率马上就高了。
2. 字符异位词分组(题号:49)
方法一(暴力法,超时)
创建标记数组(标记数组是否被使用),通过二次遍历,将符合添加的数据存储到一个list中,最终返回数据。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//创建一个标记数组
int[] sign = new int[strs.length];
List<List<String>> result = new LinkedList<>();
//遍历列表并将重排序后相同的字符串存放在一个list中
for(int i = 0; i < strs.length; i++) {
//直接跳过
if(sign[i] == 1) {
continue;
}
//创建异位list
List<String> tempList = new LinkedList<>();
tempList.add(strs[i]);
//对当前的字符串进行重排序
char[] firstArray = strs[i].toCharArray();
//直接对引用数组进行排序
Arrays.sort(firstArray);
String firstSortTemp = new String(firstArray);
//将当前字符串标记为已使用(0为未使用,1为已使用)
sign[i] = 1;
for(int j = i + 1; j < strs.length; j++) {
//对后续的字符串进行重排序
if(sign[j] == 1) {
//直接跳过
continue;
}
char[] secondArray = strs[j].toCharArray();
Arrays.sort(secondArray);
String secondSortTemp = new String(secondArray);
if(firstSortTemp.equals(secondSortTemp)) {
//符合条件放入list中
tempList.add(strs[j]);
//标记为已使用
sign[j] = 1;
}
}
result.add(tempList);
}
return result;
}
}
超时。
方法二(使用hash表进行匹配)
使用hash表,对每个字符串重新排序,key存储排序后的字符串,value存储的就是符合异位的字符串的集合,最终返回values的集合。
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
//使用hash表进行匹配,key存储排序后的字符串,vlaue存储的就是异位字符串的list
//(有点类似插入排序, 将对应的字符串存储到对应的键值对上)
Map<String, List<String>> resultMap = new HashMap<>();
for(int i = 0; i < strs.length; i++) {
char[] tempStr = strs[i].toCharArray();
Arrays.sort(tempStr);
//排序好的字符串
String sortTemp = new String(tempStr);
List<String> tempList = resultMap.getOrDefault(sortTemp, new LinkedList<String>());
//插入自己,并修改对应list
tempList.add(strs[i]);
resultMap.put(sortTemp, tempList);
}
//直接返回value集合
return new LinkedList<List<String>>(resultMap.values());
}
}
通过。