LeetCode 解题思路 1(Hot 100)

LeetCode 解题思路 1(Hot 100)_第1张图片

解题思路:

  1. 哈希表优化查找: 利用哈希表存储已遍历元素的值及其索引,将查找时间从O(n)降至O(1)。
  2. 一次遍历: 遍历数组对每个元素计算补数,若补数存在于哈希表中,则直接返回结果;否则将该元素存入哈希表。

Java代码:

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] twoSum(int[] nums, int target) {
        // 创建哈希表,键为数组元素值,值为对应的索引
        Map<Integer, Integer> numMap = new HashMap<>();
        
        // 遍历数组
        for (int i = 0; i < nums.length; i++) {
            int complement = target - nums[i];  // 计算当前元素的补数
            
            // 检查补数是否已存在于哈希表中
            if (numMap.containsKey(complement)) {
                // 找到答案,返回补数的索引和当前索引
                return new int[] { numMap.get(complement), i };
            }
            
            // 将当前元素及其索引存入哈希表,供后续查找
            numMap.put(nums[i], i);
        }
    }
}

复杂度分析:

  • 时间复杂度: O(n),只需一次遍历数组。
  • 空间复杂度: O(n),哈希表最多存储n个元素。

LeetCode 解题思路 1(Hot 100)_第2张图片

解题思路:

  1. 标准化键生成: 将每个字符串排序后的结果作为哈希表的键,确保异位词共享同一键。
  2. 哈希表分组: 遍历字符串数组,根据每个字符串的排序键将其存入对应列表。
  3. 结果提取: 哈希表的所有值即为分组后的异位词列表。

Java代码:

import java.util.*;

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        // 创建哈希表,键是排序后的字符串,值是对应的异位词列表
        Map<String, List<String>> map = new HashMap<>();
        
        for (String s : strs) {
            // 将字符串转换为字符数组并排序,生成标准化键
            char[] chars = s.toCharArray();
            Arrays.sort(chars);
            String key = new String(chars);  // 排序后的字符串作为键
            
            // 将原始字符串添加到对应的列表中
            if (!map.containsKey(key)) {
                map.put(key, new ArrayList<>());
            }
            map.get(key).add(s);
        }
        
        // 提取所有分组结果
        return new ArrayList<>(map.values());
    }
}

复杂度分析:

  • 时间复杂度: O(nklog k),其中 n 是字符串数量,k 是字符串最大长度。排序每个字符串的时间为 O(klog k)。
  • 空间复杂度: O(nk),哈希表存储所有字符串。

你可能感兴趣的:(leetcode,java,算法)