当前位置: 首页 > news >正文

【Java 优选算法】哈希表

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~



1. 两数之和

解法

解法1: 暴力解法O(n^2)

  1. 先固定其中一个数
  2. 依次与该数之前的数相加

解法2: 使用哈希表来做优化O(n)

先固定一个数x,再在hash表内找是否存在target - x,如果没有将x放入hash.

代码

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> hash = new HashMap<>();//<nums[i], i>
        for(int i = 0; i < nums.length; i++){
            int x = target - nums[i];
            if(hash.containsKey(x)){
                return new int[]{i, hash.get(x)};
            }
            hash.put(nums[i], i);
        }
        //照顾编译器, 以下不会执行
        return new int[]{-1, -1};
    }
}

面试题 01.02. 判定是否互为字符重排

解法

使用两个哈希表(数组模拟哈希表,大小为26)统计两个字符串每个字符出现的个数,再判断这两个哈希表是否相等

优化: 只使用一个哈希表, 先将一个字符串放到hash,再遍历另一个字符串,如果遍历完后有字符的数为-1或不为0,返回false; 为0返回true. 时间复杂度: O(n), 空间复杂度: O(26)~O(1)

细节: 如果两个字符串的长度不相等, 直接返回false

代码

class Solution {
    public boolean CheckPermutation(String s1, String s2) {
        if(s1.length() != s2.length()) return false;
        
        int[] hash = new int[26];
        //先把s1的信息统计到哈希表内
        for(int i = 0; i < s1.length(); i++){
            hash[s1.charAt(i) - 'a']++;
        }
        //遍历s2,判断是否可以重排
        for(int i = 0; i < s2.length(); i++){
            hash[s2.charAt(i) - 'a']--;
            if(hash[s2.charAt(i) - 'a'] < 0) return false;
        }
        return true;
    }
}

217. 存在重复元素

解法

从前往后遍历数组,设当前为x,从hash表中是否有数和x相等,如果没有就把x放入hash里

代码

class Solution {
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> hash = new HashSet<>();
        for(int x : nums){
            if(hash.contains(x)) return true;                
            hash.add(x);
        }
        return false;
    }
}

219. 存在重复元素 II

解法

使用hash<nums[i], i>从前往后遍历数组,设当前数是x, 在hash表中找是否存在x,如果不存在将x和其下标存入hash表中,可以覆盖前面的值

代码

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])){
                if(i - hash.get(nums[i]) <= k) return true;
            }
            hash.put(nums[i], i);
        }
        return false;
    }
}

49. 字母异位词分组

解法

创建hash<String, String[]>,String用来存排好序的字符串,String[]用来存结果数组

从左向右遍历字符串数组,先对字符串进行排序,放入hash表匹配String,符合就加入,不符合就新建String[]

代码

class Solution {
    public List<List<String>> groupAnagrams(String[] strs) {
        Map<String, List<String>> hash = new HashMap<>();
        //1.先把所有的字母异位词分组
        for(String s : strs){
            char[] tmp = s.toCharArray();
            Arrays.sort(tmp);
            String key = new String(tmp);

            if(!hash.containsKey(key)){
                hash.put(key, new ArrayList());
            }
            hash.get(key).add(s);
        }
        //2.提取结果
        return new ArrayList(hash.values());
    }
}

相关文章:

  • 基于springboot+vue的动漫交流与推荐平台
  • Zookeeper经典应用场景实战
  • 【GPT入门】第29课 对比不同的langchain ReAct代理的思考过程
  • C嘎嘎类里面的额函数
  • 一文详细讲解Python(详细版一篇学会Python基础和网络安全)
  • 安卓Q以下自定义文字的字体
  • LVGL Dropdown和Calendar详解
  • 机器学习 第一章 绪论
  • 算法 | 蜣螂优化算法(DBO)在无人机路径规划中的应用(附matlab源码)
  • 单机快速部署开源、免费的分布式任务调度系统——DolphinScheduler
  • VuePress 和 Docusaurus的对比
  • C# System.Net.IPAddress 使用详解
  • docker的与使用
  • TLC vs QLC六大关键差异【续】
  • 简单粗暴,用浏览器调试端口绕过Selenium/Playwright/Puppeteer检测
  • 数据结构【链表】
  • 冒泡排序:经典算法的深度解析与TypeScript实现
  • NullByte: 1靶场渗透
  • 时间步长的概念与选择-瞬态
  • 【Android】View动画—XML动画、帧动画
  • 中小企业网站制作广州网络服务公司找赛合/市场推广是做什么的