目录
1、洛谷P1102 A-B 数对
OJ:https://www.luogu.com.cn/problem/P1102 标签:模拟,数论,数学,排序,二分查找,哈希,HASH,概率论,统计
package 二分查找与二分答案;
/*
* 这一题将A-B=C转换成A=B+C,首先将A数组每个元素出现的次数统计起来,用map映射,
* 答案每次加上a[i]+c位置的数的个数,a[i]+c即为式子的另一个加数
*
* map相关库函数:
* map.put(key,value) 增加 一个key-value对
* map.get(key) 根据key来获得value.
*/
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class P1102A减B数对 {
//成员变量比局部变量占用内存更小
static int[] a;
static long ans=0;
static int t = 0;//引入变量t,记录键(数字)的次数
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();
int c=in.nextInt();
//建立一个数字到出现次数的映射 map<num,times>
Map<Integer,Integer> m=new HashMap<Integer, Integer>();
a=new int[n];
for(int i=0;i<n;i++) {
a[i]=in.nextInt();
if(m.get(a[i])==null)t=0;//必须判断值是否为空,否则报错
else t=m.get(a[i]);
m.put(a[i],++t);
}
//将查找A、B满足A-B=C,转换成只需查找A满足A=B+C
for(int i=0;i<n;i++) {
if(m.get(a[i]+c)!=null)//必须判断值是否为空,否则报错
ans+=m.get(a[i]+c);
}
System.out.println(ans);
}
}
2、JDK1.6 API中的Map方法
void | clear() 从此映射中移除所有映射关系(可选操作)。 |
boolean | containsKey(Object key) 如果此映射包含指定键的映射关系,则返回 true。 |
boolean | containsValue(Object value) 如果此映射将一个或多个键映射到指定值,则返回 true。 |
Set<Map.Entry<K,V>> | entrySet() 返回此映射中包含的映射关系的 Set 视图。 |
boolean | equals(Object o) 比较指定的对象与此映射是否相等。 |
V | get(Object key) 返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null 。 |
int | hashCode() 返回此映射的哈希码值。 |
boolean | isEmpty() 如果此映射未包含键-值映射关系,则返回 true。 |
Set<K> | keySet() 返回此映射中包含的键的 Set 视图。 |
V | put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作)。 |
void | putAll(Map<? extends K,? extends V> m) 从指定映射中将所有映射关系复制到此映射中(可选操作)。 |
V | remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作)。 |
int | size() 返回此映射中的键-值映射关系数。 |
Collection<V> | values() 返回此映射中包含的值的 Collection 视图。 |
3、Map用法实例
Map 初始化
Map<String, String> map = new HashMap<String, String>();
插入元素
map.put("key1", "value1");
获取元素
map.get("key1")
移除元素
map.remove("key1");
清空元素
map.clear();