代码随想录算法训练营第七天 | 哈希表

简介: 代码随想录算法训练营第七天 | 哈希表

454. 四数相加 II

题目描述

网络异常,图片无法展示
|

思路分析

将四个数组分成两两一对分别计算,前两个数组遍历想加结果放在 map中 , key是值,value是出现的次数,最后在相加

代码展示

public static int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
    int n = nums1.length, m, result = 0;
    Map<Integer,Integer> map = new HashMap<>();
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            m = nums1[i] + nums2[j];
            map.put(m, map.getOrDefault(m,0)  + 1);
        }
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            m = nums3[i] + nums4[j];
            result += map.getOrDefault( 0 - m, 0);
        }
    }
    return result;
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

个人思考有误,想多了导致第一次提交的时候报错,不该不该

383. 赎金信

题目描述

网络异常,图片无法展示
|

思路分析

这道题和 242.字母异位词做法思路一样

先创建一个 int利用下标来存储 magazine字母的个数,在遍历 ransomNote在响应下标减去,最后遍历 ints数组,判断有没有 < 0的值就可以了

代码展示

public static boolean canConstruct(String ransomNote, String magazine) {
    int[] ints = new int[26];
    for (int i = 0; i < magazine.length(); i++) {
        ints[magazine.charAt(i) - 'a']++;
    }
    for (int i = 0; i < ransomNote.length(); i++) {
        ints[ransomNote.charAt(i) - 'a']--;
    }
    for (int anInt : ints) {
        if (anInt < 0){
            return false;
        }
    }
    return true;
}
复制代码

提交结果

网络异常,图片无法展示
|

15. 三数之和

题目描述

网络异常,图片无法展示
|

思路分析

注意题中只说返回元素,而不是下标

所以我们可以直接对当前数组进行排序,从左往右遍历,固定住下标为 i的数,下标为 (i - length)的数组让他们双指针去做判断

需要注意的是,当 nums[i] > 0的时候,证明后面都是正数,三数想加肯定不能为 0

相邻两个数相同时要跳过,不然统计的结果会有重复

代码展示

public List<List<Integer>> threeSum(int[] nums) {
    List<List<Integer>> result = new ArrayList<>();
    Arrays.sort(nums);
    int left,right, sum;
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] > 0){
            break;
        }
        if (i > 0 && nums[i] == nums[i - 1]){
            continue;
        }
        left = i + 1;
        right = nums.length - 1;
        while (left < right){
            sum = nums[i] + nums[left] + nums[right];
            if (sum == 0){
                result.add(Arrays.asList(nums[i],nums[left], nums[right]));
                while(left < right && nums[right] == nums[right - 1]) right--;
                while(left < right && nums[left] == nums[left + 1]) left++;
                left++;
                right--;
            }else if (sum > 0){
                right--;
            }else{
                left++;
            }
        }
    }
    return result;
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

细节细节还是细节把控问题

18. 四数之和

题目描述

网络异常,图片无法展示
|

思路分析

和三数之和一样,固定一个点变成了固定两个点,双指针操作让四数值和暴力解法的时间复杂度: O(n^4)变成了 O(n^3)

细节细节还是细节,真的难搞

代码展示

public static List<List<Integer>> fourSum(int[] nums, int target) {
    List<List<Integer>> list = new ArrayList<>();
    Arrays.sort(nums);
    for (int i = 0; i < nums.length; i++) {
        if (nums[i] > target && (nums[i] > 0 || target > 0)){
            break;
        }
        if (i > 0 && nums[i] == nums[i - 1]){
            continue;
        }
        for (int j = nums.length - 1; j > i + 2; j--) {
            if (j < nums.length - 1 && nums[j] == nums[j + 1]){
                continue;
            }
            int left = i + 1, right = j - 1;
            while(left < right){
                long sum =(long) nums[i] + nums[j] + nums[left] + nums[right];
                if (sum > target){
                    right--;
                }else if (sum < target){
                    left++;
                }else{
                    list.add(Arrays.asList(nums[i],nums[j],nums[left],nums[right]));
                    while(left < right && nums[left] == nums[left + 1]) left++;
                    while(left < right && nums[right] == nums[right - 1])right--;
                    left++;
                    right--;
                }
            }
        }
    }
    return list;
}
复制代码

提交结果

网络异常,图片无法展示
|

总结

咱就说,细节决定成败,方向一直是对的,就是各种细节问题



目录
相关文章
|
7天前
|
存储 算法
【C算法】编程初学者入门训练140道(1~20)
【C算法】编程初学者入门训练140道(1~20)
|
2天前
|
机器学习/深度学习 人工智能 自然语言处理
【自然语言处理】TF-IDF算法在人工智能方面的应用,附带代码
TF-IDF算法在人工智能领域,特别是自然语言处理(NLP)和信息检索中,被广泛用于特征提取和文本表示。以下是一个使用Python的scikit-learn库实现TF-IDF算法的简单示例,并展示如何将其应用于文本数据。
116 65
|
8天前
|
算法 安全 JavaScript
安全哈希算法:SHA算法
安全哈希算法:SHA算法
11 1
安全哈希算法:SHA算法
|
2天前
|
机器学习/深度学习 人工智能 算法
【人工智能】传统语音识别算法概述,应用场景,项目实践及案例分析,附带代码示例
传统语音识别算法是将语音信号转化为文本形式的技术,它主要基于模式识别理论和数学统计学方法。以下是传统语音识别算法的基本概述
11 2
|
7天前
|
搜索推荐 算法 Java
|
8天前
|
JavaScript 算法 前端开发
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
国标哈希算法基础:SHA1、SHA256、SHA512、MD5 和 HMAC,Python和JS实现、加盐、算法魔改
52 1
|
13天前
|
机器学习/深度学习 运维 算法
深入探索机器学习中的支持向量机(SVM)算法:原理、应用与Python代码示例全面解析
【8月更文挑战第6天】在机器学习领域,支持向量机(SVM)犹如璀璨明珠。它是一种强大的监督学习算法,在分类、回归及异常检测中表现出色。SVM通过在高维空间寻找最大间隔超平面来分隔不同类别的数据,提升模型泛化能力。为处理非线性问题,引入了核函数将数据映射到高维空间。SVM在文本分类、图像识别等多个领域有广泛应用,展现出高度灵活性和适应性。
67 2
|
1天前
|
算法 搜索推荐
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
支付宝商业化广告算法问题之基于pretrain—>finetune范式的知识迁移中,finetune阶段全参数训练与部分参数训练的效果如何比较
|
6天前
|
搜索推荐 算法 Java
插入排序算法(Java代码实现)
这篇文章通过Java代码示例详细解释了插入排序算法的实现过程,包括算法的基本思想、核心代码、辅助函数以及测试结果,展示了如何通过插入排序对数组进行升序排列。
|
8天前
|
机器学习/深度学习 算法 Python
python与朴素贝叶斯算法(附示例和代码)
朴素贝叶斯算法以其高效性和优良的分类性能,成为文本处理领域一项受欢迎的方法。提供的代码示例证明了其在Python语言中的易用性和实用性。尽管算法假设了特征之间的独立性,但在实际应用中,它仍然能够提供强大的分类能力。通过调整参数和优化模型,你可以进一步提升朴素贝叶斯分类器的性能。
20 0

热门文章

最新文章