0
点赞
收藏
分享

微信扫一扫

Java 第 26 课 ★1. 两数之和 2006. 差的绝对值为 K 的数对数目



第 26 课

  • [★1. 两数之和](https://leetcode-cn.com/problems/two-sum/)
  • [2006. 差的绝对值为 K 的数对数目](https://leetcode-cn.com/problems/count-number-of-pairs-with-absolute-difference-k/)
  • 基础知识
  • Java HashMap


★1. 两数之和

创建一个字典,对于每一个 y,首先查询哈希表中是否存在 target - y,如果存在,则返回结果,否则将 y 插入到哈希表中。或者查询哈希表中是否存在 x,如果存在,则返回结果,否则将 target - x 插入到哈希表中
注意:方法是先把 x 和它的下标放到字典中,然后对后面的 x 在字典中找 target - x。

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        d = dict()
        for j, y in enumerate(nums):
            # x = target - y
            # if x in d: return [d[x], j]
            # else: d[y] = j
        
            if y in d: return [d[y], j]
            else: d[target - y] = j
        return []

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++){
            int x = target - nums[i];
            if (map.containsKey(x)) return new int[]{map.get(x), i};
            map.put(nums[i], i);
        }
        return new int[2];
    }
}

2006. 差的绝对值为 K 的数对数目

|nums[i] - nums[j]| == k
x = y + k or y = x + k

class Solution:
    def countKDifference(self, nums: List[int], k: int) -> int:
        # 方法一:
        # res, n = 0, len(nums)
        # for i in range(n):
        #     for j in range(i + 1, n):
        #         if abs(nums[i] - nums[j]) == k:
        #             res += 1
        # return res

        # 方法二:哈希表
        # res, d = 0, defaultdict(int)
        # for x in nums: d[k + x] += 1
        # return sum(d[x] for x in nums)
        
        # 方法三:Counter
        # res, c = 0, Counter()
        # for x in nums:
        #     res += c[x + k] + c[x - k]
        #     c[x] += 1
        # return res
        c = Counter(nums)
        return sum(c[x + k] for x in nums)

class Solution {
    public int countKDifference(int[] nums, int k) {
        int ans = 0;
        // int[] c = new int[200];
        // for (int x : nums) c[x] ++;
        // for (int x : nums) ans += c[x + k];

        Map<Integer, Integer> map = new HashMap<>();
        for (int x : nums)
            map.put(x, map.getOrDefault(x, 0) + 1);
        for (int x : nums)
            ans += map.getOrDefault(x + k, 0);
        return ans;
    }
}

基础知识

Java HashMap

Class HashMap<K,V>
参数类型

K - 此映射维护的密钥类型
V - 映射值的类型

HashMap 是一个 散列表,它存储的内容是 键值对 (key-value) 映射
HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有 很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。
HashMap 是无序的,即不会记录插入的顺序。
HashMap 的 key 与 value 类型可以相同也可以不同,可以是字符串(String)类型的 key 和 value,也可以是整型(Integer)的 key 和字符串(String)类型的 value。
HashMap 中的元素实际上是对象,一些常见的基本类型可以使用它的包装类。

构造方法

HashMap() 使用默认初始容量(16)和默认加载因子(0.75)构造一个空 HashMap 。
HashMap(int initialCapacity) 使用指定的初始容量和默认加载因子(0.75)构造一个空 HashMap 。
HashMap(int initialCapacity, float loadFactor)	 使用指定的初始容量和加载因子构造一个空 HashMap 。
HashMap(Map<? extends K,? extends V> m) 构造一个新的 HashMap ,其映射与指定的 Map相同。

import java.util.HashMap; // 引入 HashMap 类
HashMap<Integer, String> map = new HashMap<Integer, String>();

常用方法

boolean isEmpty() 如果此映射不包含键 - 值映射,则返回 true 。
int size() 返回此映射中键 - 值映射的数量。

V	put(K key, V value) 将指定的值与此映射中的指定键相关联。
void	putAll(Map<? extends K,? extends V> m) 将指定映射中的所有映射复制到此映射。

V	get(Object key) 返回指定键映射到的值,如果此映射不包含键的映射,则返回 null 。
getOrDefault()	获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值

void	clear() 从此映射中删除所有映射。
V	remove(Object key)	 从此映射中删除指定键的映射(如果存在)。
replace()	替换 hashMap 中是指定的 key 对应的 value。
replaceAll()	将 hashMap 中的所有映射关系替换成给定的函数所执行的结果。	

boolean	containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean	containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true 。

Set<Map.Entry<K,V>>	entrySet() 返回此映射中包含的映射的 Set 视图。
Set<K>	keySet() 返回此映射中包含的键的 Set 视图。	
values()	返回 hashMap 中存在的所有 value 值。

merge()	添加键值对到 hashMap 中

V	compute(K key, BiFunction<? super K,? super V,? extends V> remappingFunction)	 尝试计算指定键及其当前映射值的映射(如果没有当前映射, null )。
V	computeIfAbsent(K key, Function<? super K,? extends V> mappingFunction) 如果指定的键尚未与值关联(或映射到 null ),则尝试使用给定的映射函数计算其值并将其输入此映射,除非 null 。
V	computeIfPresent(K key, BiFunction<? super K,? super V,? extends V> remappingFunction) 如果指定键的值存在且为非null,则尝试在给定键及其当前映射值的情况下计算新映射。	

Object	clone() 返回此  HashMap 实例的浅表副本:未克隆键和值本身。

V	merge(K key, V value, BiFunction<? super V,? super V,? extends V> remappingFunction)	
如果指定的键尚未与值关联或与null关联,则将其与给定的非空值关联。	

Collection<V>	values() 返回此映射中包含的值的Collection视图。


举报

相关推荐

0 条评论