数据结构-哈希表(二)

简介: 数据结构-哈希表(二)

1.两个数组的交集


给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。


示例 1:


输入:nums1 = [1,2,2,1], nums2 = [2,2]

输出:[2,2]

class Solution:
    def intersect(nums1, nums2) :
        hashMap=collections.defaultdict(int)
        res=[]
        for i in range(len(nums1)):
                hashMap[nums1[i]]+=1
        for i in range(len(nums2)):
                if hashMap[nums2[i]]!=0:
                    res.append(nums2[i])
                    hashMap[nums2[i]]-=1
        return res

2.两个数的交集Ⅱ

给你两个整数数组 nums1nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

示例 1:

输入nums1 = [1,2,2,1], nums2 = [2,2]

输出:[2,2]

def intersect(nums1, nums2):
        hashMap=collections.defaultdict(int)
        res=[]
        for i in range(len(nums1)):
                hashMap[nums1[i]]+=1
        for i in range(len(nums2)):
                if hashMap[nums2[i]]!=0:
                    res.append(nums2[i])
                    hashMap[nums2[i]]-=1
        return res

3.快乐数

编写一个算法来判断一个数 n 是不是快乐数。


「快乐数」 定义为:


  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 。



示例 1:


输入:n = 19

输出:true

解释

12 + 92 = 82

82 + 22 = 68

62 + 82 = 100

12 + 02 + 02 = 1

def getSum(n):
    nums=0
    while n:
        nums+=(n%10)**2
        n=n//10
    return nums
def isHappyNumber(n):
    s=set()
    n=getSum(n):
    while n:
        if n==1:
              return True
        if n in mid:
               return False
        else:
            s.add(n)

4.两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target  的那 两个 整数,并返回它们的数组下标。


你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。


你可以按任意顺序返回答案。


示例 1:


输入:nums = [2,7,11,15], target = 9

输出:[0,1]

解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。


(1)暴力解法

循环遍历时间复杂度为O(n^2)

def getSum(nums,target):
       for i in range(len(nums)):
               for i in range(i+1,len(nums)):
                    if nums[i]+nums[j]==target:
                        return  [i,j]

(2)使用集合,时间复杂度为O(n)

def getSum(nums,target):
        #创建一个集合来存储我们目前看到的数字
        seen = set()             
        for i, num in enumerate(nums):
            complement = target - num
            if complement in seen:
                return [nums.index(complement), i]
            seen.add(num)

5.四数相加

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:


  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

示例 1:


输入:nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]

输出:2

解释

两个元组如下:

1. (0, 0, 0, 1) -> nums1[0] + nums2[0] + nums3[0] + nums4[1] = 1 + (-2) + (-1) + 2 = 0

2. (1, 1, 0, 0) -> nums1[1] + nums2[1] + nums3[0] + nums4[0] = 2 + (-1) + (-1) + 0 = 0


1.暴力解法

这道题用暴力时间复杂度较大,为O(n^4)

def fourSumCount(nums1, nums2, nums3 nums4):
                    res = 0
                    for i in range(len(nums1)):
                        for j in range(len(nums2)):
                            for k in range(len(nums3)):
                                for h in range(len(nums4)):
                                    if nums1[i]+nums2[j]+nums3[k]+nums4[h]==0:
                                        res+=1
                    return res

2. 使用哈希表,该题与两数之和有点类似

 def fourSumCount(nums1, nums2, nums3, nums4)
             hashMap=collections.defaultdict(int)
             for i in range(len(nums1)):
                    for j in range(len(nums2)):
                         hashMap[nums1[i]+nums2[j]]+=1
             res=0
             for i in range(len(nums3)):
                    for j in range(len(nums4)):
                       if hashMap[0-nums3[i]-nums4[j]] !=0:
                             res+=hashMap.get(0-nums3[i]-nums4[j])
             return res 
相关文章
|
7月前
|
存储 索引 Python
python中的哈希表数据结构
python中的哈希表数据结构
57 0
|
7月前
|
存储 C++ Python
【数据结构】哈希表—C/C++实现
【数据结构】哈希表—C/C++实现
96 0
|
2月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
66 0
数据结构与算法学习十五:哈希表
|
1天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
3月前
|
存储 Java Serverless
【数据结构】哈希表&二叉搜索树详解
本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
69 8
【数据结构】哈希表&二叉搜索树详解
|
2月前
|
存储 缓存 Java
【数据结构】哈希表
【数据结构】哈希表
56 1
|
4月前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
6月前
|
存储 NoSQL 算法
redis数据结构—哈希表
redis数据结构—哈希表
64 0
|
7月前
|
存储 算法 C++
数据结构/C++:哈希表
数据结构/C++:哈希表
83 2
|
6月前
|
存储 算法 大数据
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)
深入解析力扣170题:两数之和 III - 数据结构设计(哈希表与双指针法详解及模拟面试问答)

热门文章

最新文章