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

算法——四数相加 二(leetcode454)

题目:

给你四个整数数组 nums1nums2nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:

  • 0 <= i, j, k, l < n
  • nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0 

解析:这道题就是找到nums1和nums2、nums3、nums4不同元素之和为0的记录和,我看到这道题时首先是使用暴力解法去解决的但会被某些用例卡住超出时限,故暴力解法是不可行的其思想便是一遍遍遍历4个数组中的元素之和从0,0,0,0到n-1,n-1,n-1,n-1符合条件的便记录下来最后返回即可。

暴力解法(不可取)

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        // 记录满足条件元组个数
        int res = 0;
        // 四数之和
        int sum;
        int n = nums1.length;
        int i = 0, j = 0, k = 0, l = -1;
        while (i < n) {
            if (l < n) {
                l++;
            } else if (k < n) {
                l = 0;
                k++;
            } else if (j < n) {
                l = 0;
                k = 0;
                j++;
            } else {
                l = 0;
                k = 0;
                j = 0;
                i++;
            }
            if (i < n && j < n && k < n && l < n) {
                sum = nums1[i] + nums2[j] + nums3[k] + nums4[l];
                if (sum == 0)
                    res++;
            }
        }
        return res;
    }
}

优质解法(利用哈希法)

思路:

1、利用Map来存储nums1和nums2数组元素之和以及数组元素之和出现的次数前者为key后者为value

2、遍历nums3,nums4数组元素之和取相反数来索引上述Map的value累加至res变量中

3、返回res变量即可

class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
      int res=0;
      Map<Integer,Integer> map=new HashMap();
      for(int i:nums1){
        for(int j:nums2){
            int sum=i+j;
            map.put(sum,map.getOrDefault(sum,0)+1);
        }
      }
      for(int i:nums3){
        for(int j:nums4){
            res+=map.getOrDefault(-(i+j),0);
        }
      }
      return res;
    }
}

通过哈希法的学习掌握了Map的一个方法用法

map.getOrDefault(key,defaultValue)

我们可以通过调用上述方法来查找key若key存在则直接返回其对应value如果不存在则返回设置好的默认值


http://www.kler.cn/a/412990.html

相关文章:

  • Flutter:启动屏逻辑处理02:启动页
  • docker如何安装redis
  • 微信小程序学习指南从入门到精通
  • idea_卸载与安装
  • 代码随想录算法训练营day46|动态规划09
  • 国土变更调查拓扑错误自动化修复工具的研究
  • 预处理指令
  • Java线程同步Synchronized
  • Kadb中的ecpg编程
  • 如何开发历史题材游戏。
  • C++练级计划->《单例模式》懒汉和饿汉
  • 使用PHP实现用户权限控制系统
  • c++的虚继承说明、案例、代码
  • 网络药理学之薛定谔Schrödinge Maestro:6、分子对接(Glide、Ligand docking)和可视化
  • 【人工智能】Python常用库-TensorFlow常用方法教程
  • C语言编译和链接讲解
  • 【k8s深入学习之 Scheme】全面理解 Scheme 的注册机制、内外部版本、自动转换函数、默认填充函数、Options等机制
  • RocketMQ: 消息过滤,通信组件,服务发现
  • 探索Python WebSocket新境界:picows库揭秘
  • 哈希表理解与底层模拟实现
  • Python的排序算法
  • 深度学习创新点不足?试试贝叶斯神经网络!
  • Python中的DrissionPage详解
  • Rust eyre 错误处理实战教程
  • 针对静态交通停车诱导系统解决方案及停车开源框架实现
  • 目录遍历漏洞-CVE-2021-41773