算法修炼Day05|● 哈希表理论基础 ● 242.有效的字母异位词 ● 349. 两个数组的交集 ● 202. 快乐数 ● 1. 两数之和

72 阅读1分钟

LeetCode:242. 有效的字母异位词 - 力扣(LeetCode)

1.思路

创建一个对应26个英文字母大小的数组,对每个字母出现的频次进行录入,最后对数组进行判空,全为空则为有效字母异位词。

2.代码实现
class Solution {
    public boolean isAnagram(String s, String t) {
        // 创建一个长度为26的整型数组,用于记录26个字母各自出现的次数
        int[] result = new int[26]; 
        for (int i = 0; i < s.length(); i++) {
            // 将字符串s中每个字母出现的次数记录到数组record中,通过将字母的ASCII码减去'a'来计算索引
            result[s.charAt(i) - 'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            result[t.charAt(i) - 'a']--; // 对t中的每个字母进行--
        }
        for (int count : result) {
            if (count != 0) {
                return false;
            }
        }
        return true;
    }
}
3.复杂度分析

时间复杂度:O(n).

空间复杂度:O(1).

LeetCode:349. 两个数组的交集 - 力扣(LeetCode)

1.思路

两层for循环遍历输出相同值的同时对其进行判重,list进行收集结果,最后将list转化为数组,输出即可。

2.代码实现

突然发现这种看起来更简单,爱了~

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        List<Integer> list = new ArrayList<>();

        for (int i = 0; i < nums1.length; i++) {
            for (int j = 0; j < nums2.length; j++) {
                if (nums1[i] == nums2[j] && !list.contains(nums1[i])) {
                    list.add(nums1[i]);
                }
            }
        }
        int[] arr = new int[list.size()];
        for (int i = 0; i < list.size(); i++) {
            arr[i] = list.get(i);
        }
        return arr;
    }
}
3.复杂度分析

时间复杂度:O(n^2).

空间复杂度:O(n).

LeetCode:202. 快乐数 - 力扣(LeetCode)

1.思路

借助链表临时存储数,调用方法contains()判重,对当前数循环取模判断。

2.代码实现
class Solution {
    public boolean isHappy(int n) {
        List<Integer> record = new ArrayList<>(); // 临时存储数,调用方法判断
        while (n != 1 && !record.contains(n)) { 
            record.add(n);
            n = getNextNumber(n);
        }
        return n == 1;
    }
    public int getNextNumber(int n) {
        int res = 0; // 用于存储下一个数的变量
        while (n > 0) {
            int temp = n % 10;
            res += temp * temp;
            n = n / 10;
        }
        return res; // 返回下一个数
    }
}
3.复杂度分析

时间复杂度:O(logn).

空间复杂度:O(logn).

LeetCode:1. 两数之和 - 力扣(LeetCode)

1.思路

① 双层for循环暴力输出即可. ②

2.代码实现
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        for (int i = 0; i < nums.length; i++) {
            for (int j = i + 1; j < nums.length; j++) {
                if (nums[i] + nums[j] == target) {
                    res[0] = i;
                    res[1] = j;
                    break;
                }
            }
        }
        return res;
    }
}
//map也很香
class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {
                res[1] = i;
                res[0] = map.get(temp);
                break;
            }
            map.put(nums[i], i);
        }
        return res;
    }
}
3.复杂度分析

针对map实现的

时间复杂度:O(n).

空间复杂度:O(1).