首页 > 编程语言 >【算法】【优选算法】哈希表

【算法】【优选算法】哈希表

时间:2024-12-13 20:02:41浏览次数:10  
标签:优选 hash 哈希 nums int 复杂度 元素 算法 数组

目录


一、简介

哈希表就是一个使用键值对key-value来存储数据的容器。
用于快速查找某个元素O(1)时间复杂度。

  • 应用场景:
    频繁查找元素的时候。
  • 使用方法
    • 语言自带的集合类
    • 使用数组模拟,用下标来当key值。

二、两数之和

题目链接:1.两数之和
题目描述:

解题思路:

  • 使用一个hash容器,将数组以数组元素-下标的形式存储起来,
  • 再遍历数组,当hash表中有与当前数组元素加起来等于target的并且不是同一个元素的返回即可。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
import java.util.*;
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hash = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            hash.put(nums[i], i);
        }

        for(int i = 0; i < nums.length; i++) {
            int j = hash.getOrDefault(target-nums[i], -1);
            if(j != -1 && i != j) {
                return new int[]{i,j};
            }
        }
        return null;
    }
}

三、⾯试题 01.02.判定是否互为字符重排

题目链接:⾯试题 01.02.判定是否互为字符重排
题目描述:

题目解析:

  • 判断两个只含有小写字母的字符串,内容在排列之后是否相等

解题思路:

  • 使用一个数组,下标表示字符串的元素,数组元素表示每个元素的个数。
  • 先遍历一个字符串,将元素与个数存入数组中,
  • 再遍历另一个字符串,将数组中对应元素个数抵消。
  • 最后看数组中是否全部为0即可。
  • 优化思路:
  • 当数组中出现小于0的数组元素的时候,就代表该下标对应的字符在两个字符串中个数不一样。
  • 两个字符串长度不一样直接就返回false
  • 当有上一条条件的时候,就不用在遍历数组了。
//时间复杂度:O(n)
//空间复杂度:O(1)
class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) return false;

        int[] hash = new int[26];
        for(int i = 0; i < s1.length(); i++) 
            hash[s1.charAt(i) -'a']++;
        
        for(int i = 0; i < s2.length(); i++) 
            if(--hash[s2.charAt(i)-'a'] < 0)
                return false;

        return true;
    }
}

四、217.存在重复元素

题目链接:217.存在重复元素
题目描述:

解题思路:

  • 直接将数组中的元素,放入集合之中
  • 遍历数组,当集合中已经有该元素,符合题目条件,返回true
  • 如果没有,就将该元素放入集合。
  • 当遍历完数组,还没有找到,就返回false

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> hash = new HashSet<>();
        for(int i = 0; i < nums.length; i++) {
            if(hash.contains(nums[i]))  return true;
            hash.add(nums[i]);
        }
        return false;
    }
}

五、219.存在重复元素 II

题目链接:219.存在重复元素 II
题目描述:

解题思路:

  • 我们将 ( 数组元素 - 下标) 放入hash表中,
  • 当我们遍历数组的时候,当集合中已经有该元素,并且下标差值小于等于k,符合题目条件,返回true
  • 否则,将该元素以及下标放入hash表中,因为我们求得是小于等于k,所以就算关键字已经存在,那么覆盖后是后一个元素的下标,离下一个该数组元素更近。

解题代码:

//时间复杂度:O(n)
//空间复杂度:O(n)
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        Map<Integer, Integer> hash = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            if(hash.containsKey(nums[i]) && i - hash.get(nums[i]) <= k) return true;
            hash.put(nums[i],i);
        }
        return false;
    }
}

六、49.字⺟异位词分组

题目链接:49.字⺟异位词分组
题目描述:

题目解析:

  • 将给的字符串数组中,元素排列之后相等的元素放在一堆

解题思路:

  • 我们使用hash表,hash表中存储(字符串数组元素排序结果 - 结果数组元素)
  • 我们遍历字符串数组,先将该元素排序,排序后,如果hash表中有这个关键字,那么就添加这个字符串数组元素进value
  • 如果没有,就先申请空间,再添加
  • 最后将hash表中的value全部返回即可。

解题代码:

//时间复杂度:O(NlogN)
//空间复杂度:O(n)
class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String,List<String>> hash = new HashMap<>();
        for(int i = 0; i < strs.length; i++) {
        //字符串数组元素排序
            char[] tmp = strs[i].toCharArray();
            Arrays.sort(tmp);
            String key = new String(tmp);
            
            if(!hash.containsKey(key)) {
                hash.put(key, new ArrayList());
            }
            hash.get(key).add(strs[i]);
        }
        return new ArrayList(hash.values());
    }
}

标签:优选,hash,哈希,nums,int,复杂度,元素,算法,数组
From: https://blog.csdn.net/yj20040627/article/details/144042113

相关文章

  • 转载:【AI系统】Winograd 算法
    在上一篇文章的介绍中,介绍了Im2Col技术,它通过将三维张量重新排列成矩阵形式,然后利用基于内存访问局部性的优化库如GEMM(通用矩阵乘法库)加速计算。随后,还探讨了空间组合优化,这一种利用局部性原理来提升效率的技术。在本文将重点介绍Winograd优化算法,它是矩阵乘优化方法中Copp......
  • 转载:【AI系统】Im2Col 算法
    作为早期的AI框架,Caffe中卷积的实现采用的是基于Im2Col的方法,至今仍是卷积重要的优化方法之一。从上一篇文章的介绍中可以看到,在CNN中卷积直接计算的定义中,卷积核在输入图片上滑动,对应位置的元素相乘后相加求和,滑窗的大小由卷积核决定。由于滑动操作时的窗口的数据横向是......
  • C++_快慢指针在业务开发中的应用-数据结构与算法
    报错的解决vector不是模板问题,第一是由于没有添加#include<vector>。第二是需要添加命名空间。命名空间添加有两种,第一是直接在vector前面加上std::,第二是开头加入usingnamespacestd;加入vector后,std命名空间没有vector的问题--C++版本问题其他快慢下标......
  • 传知代码-改进贪心算法(NGSOR)
    一、算法背景及意义(一)背包问题背景背包问题是组合优化领域中的经典问题,具有广泛的实际应用场景,如资源分配、项目投资决策等。扩展简化折扣{0-1}背包问题(ESD{0-1}KP)是背包问题的一种变体,它在传统背包问题的基础上增加了一些复杂的约束条件,如物品的折扣系数以及每个项集中多个......
  • Optaplanner算法
    一、规划问题1、什么是规划问题​ 规划问题基于有限资源和特定约束条件具有最佳目标。最佳目标可以是任何事情,例如:最大化利润-最佳目标产生最高可能的利润。最小化生态足迹-最佳目标对环境影响最小。最大化员工或客户的满意度-最佳目标优先考虑员工或客户的需求。......
  • 算法知识-15-深搜
    一、概念深度优先搜索(DeepFirstSearch,DFS)是一种用于遍历或搜索树或图的算法。这种策略沿着树的深度遍历树的节点,尽可能深地搜索树的分支。二、关键步骤选择起点:根据题目要求,选择一个或多个节点作为搜索的起点。递归搜索:从起点开始,递归地访问每个节点的所有未访问的......
  • 我爱学算法之—— 感受双指针带来的快感(下)
    前言本篇文章继续来学习双指针算法;继续加油!!!一、三数之和15.三数之和-力扣(LeetCode)题目解析题目要求我们在一个给定的数组中,找到和等于0的三元组;但是呢有一些要求首先,这三元组中的元素是给定数组中的不同元素其次,找到的三元组不能够重复算法分析暴力枚举+set......
  • 智慧工地算法视频分析服务器视频监控接入后,常见的视频干扰故障有哪些?
    在视频监控系统的安装和维护过程中,我们经常会遇到各种技术问题,这些问题可能会影响监控图像的质量和系统的稳定性。为了确保监控系统的有效性和可靠性,了解这些常见问题及其解决方法是非常重要的。本文将详细介绍一些监控系统中常见的图像干扰和画面问题,并提供相应的解决方案。通过......
  • 算法网关视频分析网关视频接入热知识:ONVIF协议如此重要,如何判断摄像头是否支持呢?
    在构建一个高效、可靠的监控系统时,选择合适的设备至关重要。选择监控系统设备时,我们不仅要关注设备的性能和价格,还要考虑设备的兼容性和未来的扩展性。为了确保系统的稳定运行和方便未来的维护升级,选择同一品牌的摄像头和录像机是一个理想的选择。然而,在某些特殊情况下,我们可能需......
  • Dijkstra 最短路径算法
    此篇文章在2023年9月28日被记录Dijkstra算法的核心点是贪心算法:不断寻找最短的点,在最短的点上更新最短路径1.前言想要了解学习Dijkstra算法,需要先了解无向图与权重图,无向图顾名思义就是没有方向的图,下面表示了有向图和无向图以及权重图2.什么是Dijkstra算法Dijkstra算法......