题目描述1
笔者解答1.1
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> IList=new ArrayList<List<String>>();
Map<Map,Integer> IMap=new HashMap<Map,Integer>();
int n=strs.length;
int i;
int index=0;
for(i=0;i<n;i++){
Map<Character,Integer> map=new HashMap<>();
for(int j=0;j<strs[i].length();j++){
map.put(strs[i].charAt(j),map.getOrDefault(strs[i].charAt(j),0)+1);
}
if(i==0){
IMap.put(map,index);
List<String> list=new ArrayList<String>();
list.add(strs[i]);
IList.add(list);
}else{
if(IMap.containsKey(map)){
IList.get(IMap.get(map)).add(strs[i]);
}else{
index++;
IMap.put(map,index);
List<String> list=new ArrayList<String>();
list.add(strs[i]);
IList.add(list);
}
}
}
return IList;
}
}
笔者分析1.2
这次有点秀操作,虽然通过了但效率有点低,不过评论区的大佬操作是更六
class Solution {
public List<List<String>> groupAnagrams(String[] strs) {
List<List<String>> res = new ArrayList<List<String>>();
Map<String, List<String>> map = new HashMap<>();//这个哈希表用的比我还过分啊
for(int i = 0; i < strs.length; i++){
char[] arr = strs[i].toCharArray();//
Arrays.sort(arr);//
String s = new String(arr);//就这三步就被秀了一脸
if(!map.containsKey(s)){
List<String> temp = new ArrayList<>();
temp.add(strs[i]);
map.put(s,temp);
}else{
map.get(s).add(strs[i]);
}
}
for(String key: map.keySet()){
res.add(map.get(key));
}
return res;
}
}
题目描述2
笔者分析2.1
原本考虑用哈希表的,但时间复杂度太高了。评论区的递推还是挺不错的,二维数组牛逼!
class Solution {
public int findLength(int[] A, int[] B) {
if (A.length == 0 || B.length == 0) {
return 0;
}
int[][] dp = new int[A.length+1][B.length+1];
int result = 0;
for (int i = 1; i <= A.length; i++) {
for (int j = 1; j <= B.length; j++) {
if (A[i-1] == B[j-1]) {
dp[i][j] = dp[i-1][j-1]+1;
result = Math.max(result, dp[i][j]);
}
}
}
return result;
}
}
题目描述3
笔者分析3.1
再次栽在下面这个方法,真巧妙,哈希表的精髓啊,一直求和,找差值出现的次数就行。以后求一组序列中,通过某种运算得一定值,问连续子数组次数的,就用哈希差值法。(自己编的名)
class Solution {
public int subarraySum(int[] nums, int k) {
Map<Integer, Integer> map = new HashMap<>();
map.put(0, 1);
int sum = 0, ret = 0;
for(int i = 0; i < nums.length; ++i) {
sum += nums[i];
if(map.containsKey(sum-k))
ret += map.get(sum-k);
map.put(sum, map.getOrDefault(sum, 0)+1);
}
return ret;
}
}
class Solution{
public int subarraySum(int[] nums,int k){
Map<Integer,Integer> map=new HashMap<>();
map.put(0,1);
int sum=0,ret=0;
for(int i=0;i<nums.length;i++){
sum+=nums[i];
if(map.containsKey(sum-k))
ret+=map.get(sum-k);
map.put(sum,map.getOrDefault(sum,0)+1);
}
return ret;
}
}
总结
学到了一个哈希差值法,每日十题第二十一天,以下图为证