代码随想录算法训练营第五天

LeetCode题目

  • 242. 有效的字母异位词
  • 349. 两个数组的交集
  • 202. 快乐数
  • 1. 两数之和
  • 2278. 字母在字符串中的百分比(每日打卡)
  • 总结
  • 往期打卡


242. 有效的字母异位词

跳转:242. 有效的字母异位词

问题:

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的 字母异位词。

思路:

哈希计数,然后判断是否可以相互抵消.

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {
    public boolean isAnagram(String s, String t) {
        if(s.length()!=t.length()) return false;
        int[] hash = new int [26];
        for(int i = 0;i<s.length();i++){
            hash[s.charAt(i)-'a']++;
            hash[t.charAt(i)-'a']--;
        }
        for(int i:hash){
            if(i!=0) return false;
        }
        return true;
    }
}

349. 两个数组的交集

跳转: 349. 两个数组的交集

问题:

给定两个数组 nums1nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序

思路:

求交集先哈希长集合,然后遍历两遍短集合(先计数,再创建对应大小的数组进行赋值)

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1 == null || nums1.length == 0 || nums2 == null || nums2.length == 0) {
            return new int[0];
        }
        if(nums1.length<nums2.length){
            int[] tmp = nums1;
            nums1 = nums2;
            nums2 = tmp;
        }
        int[] hash = new int[1001];
        for (int i : nums1) {
            hash[i] = 1;
        }
        int count = 0;
        for (int i : nums2) {
            if (hash[i] == 1) {
                hash[i]++;
                count++;
            }
        }
        int[] res = new int[count];
        count = 0;
        for (int i : nums2) {
            if (hash[i] == 2) {
                res[count++] = i;
                hash[i]++;
            }
        }
        return res;
    }
}

202. 快乐数

跳转:202. 快乐数

问题:

编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n快乐数 就返回 true ;不是,则返回 false

思路:

哈希计数找重复出现或找1
(也可以将一定的遍历次数认作死循环直接取巧解题)

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

class Solution {
    public boolean isHappy(int n) {
        // int l = 100;
        Set<Integer> set = new HashSet<>();
        while (!set.contains(n)) {
            set.add(n);
            int res = 0;
            while (n>0) {
                int b = n % 10;
                res += b * b;
                n = n / 10;
            }
            if(res==1) return true;
            n = res;
        }
        return false;
    }
}

1. 两数之和

跳转: 1. 两数之和

问题:

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。

你可以按任意顺序返回答案。

思路:

利用Map集合记录差值和索引,O(1)查找
− 1 0 9 < = t a r g e t < = 1 0 9 -10^9 <= target <= 10^9 109<=target<=109
不太好用下标查,消耗空间较大

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

代码:

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(nums[i])) {
            	return new int[]{map.get(nums[i]),i};
            }
            map.put(target-nums[i],i);
        }
        return null;
    }
}

2278. 字母在字符串中的百分比(每日打卡)

跳转: 2278. 字母在字符串中的百分比

问题:

给你一个字符串 s 和一个字符 letter ,返回在 s 中等于 letter 字符所占的 百分比 ,向下取整到最接近的百分比。

思路:

遍历直接利用整数运算求解.

复杂度:

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

代码:

class Solution {
    public int percentageLetter(String s, char letter) { 
        int count = 0;
        for(char c:s.toCharArray()){
            if(letter==c) count++;
        }
        return count*100/s.length();
    }
}

总结

今天练习了哈希表,都是基础题,做起来比较熟练.

往期打卡

代码随想录算法训练营第一天
代码随想录算法训练营第二天
代码随想录算法训练营第三天
代码随想录算法训练营第四天
代码随想录算法训练营周末一

你可能感兴趣的:(代码随想录打卡,算法,哈希算法)