LeetCode每日十题---哈希表

题目描述1

在这里插入图片描述

笔者解答1.1

public int countPrimes(int n){
  if(n<3) return 0;
  int count=0;
  for(int i=2;i<n;i++){
    int flag=0;
    for(int j=2;j<=i/2;j++)
    {
       if(i%j==0)
       {
          flag=1;
          break;
       }
    }
    if(flag==0){
      count++;
    }
 }
}

笔者分析1.2

虽然这方法是以前的惯用方法,但应该没有比这方法更烂的了吧,也是今天我才了解到判断一个数是否为质数还可以有下面这样简单的方法。其实以前也注意到了原来写的方法比较次数有些多余,比如既然我已经比较出不是2的倍数,那我为什么还要比较是不是4的倍数呢?我们之所以还要往后遍历是因为我们想知道会不会是某一质数的倍数,那么好,下面就直接比较之前所有质数的倍数关系就行了。

public int countPrimes(int n){
   if(n<3) return 0;
   HashSet<Integer> primes=new HashSet<Integer>();
   for(int i=2;i<n;i++)
   {
     int flag=0;
     for(Integer prime:primes){
        if(i%prime==0){
          flag=1;
          break;
        }
     }
     if(flag==0){
       primes.add(i);
     }
   }
   return primes.size();
}
//虽然上面那种方法有点秀,但还是超时了,看看下面这个正确解答,有点意思
class Solution {
    public int countPrimes(int n) {
        int[] a=new int[n+1];
        int count=0;
        for(int i=2;i<n;i++)
           a[i]=1;
        for(int i=2;i<n;i++){
            if(a[i]!=0){
                count++;
                for(int j=2*i;j<n;j+=i)
                   a[j]=0;
            }
        }
        return count;
    }
}

题目描述2

在这里插入图片描述

笔者解答2.1

class Solution {
    public int countCharacters(String[] words, String chars) {
     Map<Character,Integer> match_map=new HashMap<Character,Integer>();
     int i=0;
     for(i=0;i<chars.length();i++){
         match_map.put(chars.charAt(i),match_map.getOrDefault(chars.charAt(i),0)+1);
     }
     int sum=0;
     for(i=0;i<words.length;i++){
         Map<Character,Integer> temp_map=new HashMap<Character,Integer>();
         for(int j=0;j<words[i].length();j++){
             temp_map.put(words[i].charAt(j),temp_map.getOrDefault(words[i].charAt(j),0)+1);
         }
         boolean match=true;
         for(Character c:temp_map.keySet()){
             if(match_map.get(c)==null){
                 match=false;
                 break;
             }else if(match_map.get(c)<temp_map.get(c)){
                 match=false;
                 break;
             }        
         }
         if(match){
            sum+=words[i].length();
         }
     }
     return sum;
    }
}

笔者分析2.2

虽然写出来了但效率太低了,下面给出优化的方法,如果是字母哈希表可以用数组代替。而且数组操作也是花里胡哨,各种函数,学到了。

class Solution {
    public int countCharacters(String[] words, String chars) {
        int[] hash = new int[26];
        for(char ch : chars.toCharArray()){
            hash[ch - 'a'] += 1;
        }
        int[] map = new int[26];
        int len = 0;
        for(String word : words){
            Arrays.fill(map, 0);
            boolean flag = true;
            for(char ch : word.toCharArray()){
                map[ch - 'a']++;
                if(map[ch - 'a'] > hash[ch - 'a']) flag = false;
            }
            len += flag ? word.length() : 0;    
        }
        return len;
    }
}

题目描述3

在这里插入图片描述

笔者解答3.1

class Solution {
    public int fourSumCount(int[] A, int[] B, int[] C, int[] D) {
         Map<Integer,Integer> abmap=new HashMap<Integer,Integer>();
         Map<Integer,Integer> cdmap=new HashMap<Integer,Integer>();
         int i,j;
         int length=A.length;
         for(i=0;i<length;i++){
             for(j=0;j<length;j++){
                 int temp=A[i]+B[j];
                 abmap.put(temp,abmap.getOrDefault(temp,0)+1);
                 temp=0-C[i]-D[j];
                 cdmap.put(temp,cdmap.getOrDefault(temp,0)+1);
             }
         }
         int count=0;
         for(Integer number:abmap.keySet()){
             int times=abmap.get(number);
             if(cdmap.get(number)!=null){
               int times_two=cdmap.get(number);
               count+=times_two*times;
             }
         }
         return count;
    }
}

笔者分析3.2

虽然算法效率不高,但比暴力算法还是优秀好多,将四个数拆成两组,求和存入哈希表,挺好的一个思路,将n的四次方,拆成两个n的平方,再平方,时间复杂度为O(n*n)。

总结

前两天准备考英语四六级去了,没写博客,今天继续,每日打卡十八天,以下图为证
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赶路的苟狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值