代码随想录算法训练营第六天 | 哈希表 242.有效的字母异位词 349. 两个数组的交集 202. 快乐数 1. 两数之和

哈希表:key值作为下标,查找的时间复杂度为O(1),经典的用空间换时间。

对于set、multiset和unordered_set:如果面对的是哈希问题,优先考虑unordered_set;如果数据是有序的,优先考虑set;如果数据即是有序的,又是重复的,则考虑multiset。

242.有效的字母异位词

题目链接:242.有效的字母异位词

思路1:将两个字符串排序,然后判断两个字符串是否相等即可。然而在java中字符串排序需要先将字符串转换为char型数组,然后使用sort方法,方能完成数组排序。

class Solution {
    public boolean isAnagram(String s, String t) {
        char[] char1 = s.toCharArray();
        char[] char2 = t.toCharArray();
        Arrays.sort(char1);
        Arrays.sort(char2);
        s = new String(char1);
        t = new String(char2);
        if(s.equals(t)){
            return true;
        }
        else{
            return false;
        }
    }
}

思路2:利用哈希表(数组),遇到字符串中的字母,即将对应下标的value值+1;接下来的过程,可以有两种方式,一种是使用一个表,对于s来说进行加1统计,对于t来说,每遇到一次,在表内减1.最后查看表内有无非零值;另一种是使用两个表,每个表都只做加一操作,最后比较两个表每个下标位置的值是否全部相等。

class Solution {
    public boolean isAnagram(String s, String t) {
        
        int[] record = new int[26];
        for(int i = 0; i < s.length(); i++){
            record[s.charAt(i) - 'a']++;
        }

        for(int i = 0; i < t.length(); i++){
            record[t.charAt(i) - 'a']--;
        }

        for(int i = 0; i < record.length; i++){
            if(record[i] != 0){
                return false;
            }
        }
        return true;
    }
}

 349. 两个数组的交集

题目链接:349. 两个数组的交集

思路:判断元素是否出现过,选择用哈希表。先用无重复的哈希表为nums1去重,然后再遍历nums2,判断nums2中的元素是否出现过,得到去重后的交集。

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set1 = new HashSet<>();
        Set<Integer> result = new HashSet<>();
        for(int i : nums1){
            set1.add(i);
        }
        for(int i : nums2){
            if(set1.contains(i)){
                result.add(i);
            }
        }
        return result.stream().mapToInt(x -> x).toArray();
    }
}

202. 快乐数

题目链接:202. 快乐数

思路:对于每个n求其相应位上数的平方和,得到新的n值,如果n==1,则为快乐数。由于存在死循环问题,所以一定要做好记录,已经出现过的n值不能再出现,否则就进入循环中了。

class Solution {
    public boolean isHappy(int n) {
        Set<Integer> set1 = new HashSet<>();
        while( n != 1 && !set1.contains(n)){
            set1.add(n);
            int res = 0;
            while(n > 0){
                int temp = n % 10;
                res += temp * temp;
                n /= 10;
            }
            n = res;
        }
        return n == 1;
        
    }
}

 

1. 两数之和

题目链接:1. 两数之和

思路:创建一个map,用来存放nums1中的元素值和元素下标。key = 元素值,value = 元素下标;依次遍历nums,如果key = target - nums[i],在map中能找到,就说明已经满足条件,返回两个数的下标即可。如果key = target - nums[i]没能在map中找到,那么将其放入到map中。

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer,Integer> map = new HashMap<>();

        for(int i=0; i < nums.length; i++){
            if(!map.containsKey(target - nums[i])){
                map.put(nums[i],i);
            }
            else{
                return new int []{map.get(target - nums[i]),i};
            }
        }
        return null;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值