LintCode 题解丨面试真题:两数之和 III-数据结构设计

简介: LintCode 题解丨面试真题:两数之和 III-数据结构设计

设计并实现一个 TwoSum 类。他需要支持以下操作:​add​ 和 ​find​。

​add​ -把这个数添加到内部的数据结构。

​find​ -是否存在任意一对数字之和等于这个值

在线评测地址:

LintCode 领扣

样例 1:

add(1);add(3);add(5);
find(4)//返回true
find(7)//返回false
【题解】

使用哈希表的方法是最快的。

add 可以做到 O(1)
find 可以做到 O(n)
public class TwoSum {

private Map<Integer, Integer> counter;

public TwoSum() {
    counter = new HashMap<Integer, Integer>();
}

// Add the number to an internal data structure.
public void add(int number) {
    counter.put(number, counter.getOrDefault(number, 0) + 1);
}

// Find if there exists any pair of numbers which sum is equal to the value.
public boolean find(int value) {
    for (Integer num1 : counter.keySet()) {
        int num2 = value - num1;
        int desiredCount = num1 == num2 ? 2 : 1;
        if (counter.getOrDefault(num2, 0) >= desiredCount) {
            return true;
        }
    }
    return false;
}

}
// Your TwoSum object will be instantiated and called as such:// TwoSum twoSum = new TwoSum();// twoSum.add(number);// twoSum.find(value);
排序数组+双指针的算法会超时,但是大家可以看看是怎么写的,时间复杂度:

add O(n)
find O(n)
public class TwoSum {

public List<Integer> nums;
public TwoSum() {
    nums = new ArrayList<Integer>();
}

public void add(int number) {
    nums.add(number);
    int index = nums.size() - 1;
    while (index > 0 && nums.get(index - 1) > nums.get(index)) {
        int temp = nums.get(index);
        nums.set(index, nums.get(index - 1));
        nums.set(index - 1, temp);
        index--;
    }
}

public boolean find(int value) {
    int left = 0, right = nums.size() - 1;
    while (left < right) {
        int twoSum = nums.get(left) + nums.get(right);
        if (twoSum < value) {
            left++;
        } else if (twoSum > value) {
            right--;
        } else {
            return true;
        }
    }
    return false;
}

}
更多题解参考:

九章算法 - 帮助更多中国人找到好工作,硅谷顶尖IT企业工程师实时在线授课为你传授面试技巧

相关文章
|
3月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
20天前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
28 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
2天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
5月前
|
算法 数据挖掘 Java
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
深入解析力扣167题:两数之和 II(双指针法详解及模拟面试问答)
|
5月前
|
Java Android开发 Kotlin
Android面试题:App性能优化之Java和Kotlin常见的数据结构
Java数据结构摘要:ArrayList基于数组,适合查找和修改;LinkedList适合插入删除;HashMap1.8后用数组+链表/红黑树,初始化时预估容量可避免扩容。SparseArray优化查找,ArrayMap减少冲突。 Kotlin优化摘要:Kotlin的List用`listOf/mutableListOf`,Map用`mapOf/mutableMapOf`,支持操作符重载和扩展函数。序列提供懒加载,解构用于遍历Map,扩展函数默认参数增强灵活性。
45 0
|
5月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
|
5月前
|
存储 算法 数据挖掘
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
数据结构面试常见问题:解锁10大关键问题及答案解析【图解】
|
5月前
|
存储 关系型数据库 MySQL
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
万字详细面试被吊打的总结(SE->数据结构->MYSQL)
|
6月前
|
算法 搜索推荐 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(下)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
42 0
|
6月前
|
算法 程序员 索引
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题(中)
数据结构与算法⑥(第二章OJ题,下)后八道链表面试题
40 0