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

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

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;
}
复制代码

提交结果

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

总结

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



目录
相关文章
|
29天前
|
存储 算法 Java
解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用
在Java中,Set接口以其独特的“无重复”特性脱颖而出。本文通过解析HashSet的工作原理,揭示Set如何利用哈希算法和equals()方法确保元素唯一性,并通过示例代码展示了其“无重复”特性的具体应用。
41 3
|
7天前
|
算法
分享一些提高二叉树遍历算法效率的代码示例
这只是简单的示例代码,实际应用中可能还需要根据具体需求进行更多的优化和处理。你可以根据自己的需求对代码进行修改和扩展。
|
18天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
19 3
|
17天前
|
分布式计算 Java 开发工具
阿里云MaxCompute-XGBoost on Spark 极限梯度提升算法的分布式训练与模型持久化oss的实现与代码浅析
本文介绍了XGBoost在MaxCompute+OSS架构下模型持久化遇到的问题及其解决方案。首先简要介绍了XGBoost的特点和应用场景,随后详细描述了客户在将XGBoost on Spark任务从HDFS迁移到OSS时遇到的异常情况。通过分析异常堆栈和源代码,发现使用的`nativeBooster.saveModel`方法不支持OSS路径,而使用`write.overwrite().save`方法则能成功保存模型。最后提供了完整的Scala代码示例、Maven配置和提交命令,帮助用户顺利迁移模型存储路径。
|
30天前
|
存储 缓存 算法
如何通过优化算法和代码结构来提升易语言程序的执行效率?
如何通过优化算法和代码结构来提升易语言程序的执行效率?
|
1月前
|
搜索推荐
插入排序算法的讲解和代码
【10月更文挑战第12天】插入排序是一种基础的排序算法,理解和掌握它对于学习其他排序算法以及数据结构都具有重要意义。你可以通过实际操作和分析,进一步深入了解插入排序的特点和应用场景,以便在实际编程中更好地运用它。
|
23天前
|
缓存 分布式计算 监控
优化算法和代码需要注意什么
【10月更文挑战第20天】优化算法和代码需要注意什么
17 0
|
25天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
10天前
|
算法 数据挖掘 数据安全/隐私保护
基于FCM模糊聚类算法的图像分割matlab仿真
本项目展示了基于模糊C均值(FCM)算法的图像分割技术。算法运行效果良好,无水印。使用MATLAB 2022a开发,提供完整代码及中文注释,附带操作步骤视频。FCM算法通过隶属度矩阵和聚类中心矩阵实现图像分割,适用于灰度和彩色图像,广泛应用于医学影像、遥感图像等领域。
|
11天前
|
算法 调度
基于遗传模拟退火混合优化算法的车间作业最优调度matlab仿真,输出甘特图
车间作业调度问题(JSSP)通过遗传算法(GA)和模拟退火算法(SA)优化多个作业在并行工作中心上的加工顺序和时间,以最小化总完成时间和机器闲置时间。MATLAB2022a版本运行测试,展示了有效性和可行性。核心程序采用作业列表表示法,结合遗传操作和模拟退火过程,提高算法性能。