算法练习(哈希)

Posted 小小菜_v

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法练习(哈希)相关的知识,希望对你有一定的参考价值。

哈希

BM50 两数之和

描述 给出一个整型数组 numbers 和一个目标值 target,请在数组中找出两个加起来等于目标值的数的下标,返回的下标按升序排列。
(注:返回的数组下标从1开始算起,保证target一定可以由数组里面2个数字相加得到)

数据范围:2≤len(numbers)≤10^5 ,−10≤numbers i ​ ≤10 ^9 ,0≤target≤10^9 要求:空间复杂度 O(n),时间复杂度 O(nlogn)

示例1
输入:[3,2,4],6
返回值:[2,3]
说明:因为 2+4=6 ,而 2的下标为24的下标为3 ,又因为 下标2 < 下标3 ,所以返回[2,3]  
          
示例2
输入:[20,70,110,150],90
返回值:[1,2]
说明:20+70=90 
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param numbers int整型一维数组
# @param target int整型
# @return int整型一维数组
#


class Solution:
    def twoSum(self, numbers: List[int], target: int) -> List[int]:
        # write code here
        index_list = []
        # for i in range(len(numbers) - 1):
        #     for j in range(i + 1, len(numbers)):
        #         n_sum = numbers[i] + numbers[j]
        #         if n_sum == target:
        #             index_list = [i + 1, j + 1]
        #             return index_list

        hash= dict()
        for i in range(len(numbers)):
            temp = target - numbers[i]
            if temp not in hash:
                hash[numbers[i]] = i
            else:
                index_list.append(hash[temp] + 1)
                index_list.append(i + 1)

        return index_list

BM51 数组中出现次数超过一半的数字

描述 给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。

数据范围:n≤50000,数组中元素的值 0≤val≤10000
要求:空间复杂度:O(1),时间复杂度 O(n)O输入描述: 保证数组输入非空,且保证有解

示例1
输入:[1,2,3,2,2,2,5,4,2]
返回值:2

示例2
输入:[3,3,3,3,2,2,2]
返回值:3

示例3
输入:[1]
返回值:1
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param numbers int整型一维数组 
# @return int整型
#
class Solution:
    def MoreThanHalfNum_Solution(self , numbers: List[int]) -> int:
        # write code here
        hash = dict()
        for i in numbers:
            if i in hash:
                hash[i] = hash[i] + 1
            else:
                hash[i] = 1
            if hash[i] > len(numbers)/2:
                return i

BM52 数组中只出现一次的两个数字

描述 一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

数据范围:数组长度2≤n≤1000,数组中每个数的大小0<val≤1000000 要求:空间复杂度 O(1),时间复杂度 O(n)

提示:输出时按非降序排列。

示例1
输入:[1,4,1,6]
返回值:[4,6]
说明:返回的结果中较小的数排在前面  
   
示例2
输入:[1,2,3,3,2,9]
返回值:[1,9]
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param array int整型一维数组 
# @return int整型一维数组
#
class Solution:
    def FindNumsAppearOnce(self , array: List[int]) -> List[int]:
        # write code here
        hash = dict()
        for i in array:
            if i in hash:
                del hash[i]
            else:
                hash[i] = 1
        data = []
        for key, value in hash.items():
            if value == 1:
                data.append(key)
        
        return sorted(data)

BM53 缺失的第一个正整数

描述 给定一个无重复元素的整数数组nums,请你找出其中没有出现的最小的正整数

进阶: 空间复杂度 O(1),时间复杂度 O(n)

数据范围:
-2^31≤nums[i]≤2 ^31 −1
0≤len(nums)≤5∗10 ^5

示例1
输入:[1,0,2]
返回值:3

示例2
输入:[-2,3,4,1,5]
返回值:2

示例3
输入:[4,5,6,8,9]
返回值:1
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
# 
# @param nums int整型一维数组 
# @return int整型
#
class Solution:
    def minNumberDisappeared(self , nums: List[int]) -> int:
        # write code here
        hash = dict()
        for i in range(len(nums)):
            if nums[i] in hash:
                hash[nums[i]] += 1
            else:
                hash[nums[i]] = 1
        res = 1
        while res in hash:
            res += 1
        return res

BM54 三数之和

描述 给出一个有n个元素的数组S,S中是否有元素a,b,c满足a+b+c=0?找出数组S中所有满足条件的三元组。

数据范围:0≤n≤1000,数组中各个元素值满足 ∣val∣≤100
空间复杂度:O(n^2),时间复杂度 O(n^2)

注意: 三元组(a、b、c)中的元素必须按非降序排列。(即a≤b≤c) 解集中不能包含重复的三元组。 例如,给定的数组 S = -10 0 10 20 -10 -40,解集为(-10, -10, 20),(-10, 0, 10)

示例1
输入:[0]
返回值:[]

示例2
输入:[-2,0,1,1,2]
返回值:[[-2,0,2],[-2,1,1]]

示例3
输入:[-10,0,10,20,-10,-40]
返回值:[[-10,-10,20],[-10,0,10]]
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param num int整型一维数组
# @return int整型二维数组
#
class Solution:
    def threeSum(self, num: List[int]) -> List[List[int]]:
        # write code here
        hash = dict()
        if len(num) < 3:
            return []
        for i in range(len(num)):
            for j in range(i+1, len(num)):
                for k in range(j+1, len(num)):
                    res = num[i] + num[j] + num[k]
                    list_new = sorted([num[i], num[j], num[k]])
                    if res not in hash:
                        hash[res] = [list_new]
                    elif list_new in hash[res]:
                        continue
                    else:
                        hash[res].append(list_new)
        if 0 in hash:
            return sorted(hash[0])
        return []

以上是关于算法练习(哈希)的主要内容,如果未能解决你的问题,请参考以下文章

算法练习(哈希)

算法练习(二分查找/排序)

算法练习(二分查找/排序)

算法练习题力扣练习题——数组: 在有序数组中查找元素存在的范围

Leetcode练习(Python):二分查找类:第240题:搜索二维矩阵 II:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 ta

Leetcode练习(Python):二分查找类:第240题:搜索二维矩阵 II:编写一个高效的算法来搜索 m x n 矩阵 matrix 中的一个目标值 ta