1.两数之和454. 四数相加 II

1.两数之和

题目链接 两数之和

题目描述

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

思路

设置存放已经遍历的元素的集合,遍历数组,查询某个元素是否出现在集合中,出现则返回由查询元素的下标此时遍历到的数组元素的下标所组成的数组

  • 为什么使用哈希法
    一个集合放已经遍历的元素,遍历数组时查询这个集合是否出现某个元素
  • 为什么使用Map
    不仅要知道该元素是否存在还需要知道元素的下标
  • map是用来存什么的
    map用来存放已遍历的数组元素
  • key和value分别代表什么
    key存放元素本身,value存放元素在数组中对应的下标

代码

点击查看代码
//时间复杂度O(n)
class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();
        int res[] = new int[2];
        for (int i = 0; i < nums.length; i++) {
            int temp = target - nums[i];
            if (map.containsKey(temp)) {//判断map是否包含该元素,且查询的时间复杂度为O(1)
                res[0] = map.get(temp);
                res[1] = i;
                return res;
            }
			//放入集合
            map.put(nums[i], i);
        }
        return null;
    }
}

454. 四数相加 II

题目链接 四数相加II

题目描述

给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足:
0 <= i, j, k, l < n
nums1[i] + nums2[j] + nums3[k] + nums4[l] == 0

思路

  • 选择Map:需要存放nums1[i]+nums2[j]的值和出现的次数
  • 先遍历前两个数组,将对应的和,次数存放在Map中
    map.put(sum, map.getOrDefault(sum, 0) + 1);
    getOrDefault(key,defaultValue)是用来查询Map中是否存在该key,存在则返回对应的value,不存在则返回defaultValue(默认值)
  • 遍历后两个数组,令target=0-nums3[i]-nums4[j],在Map中查询是否存在target,存在则数量加上target对应的value值

代码

点击查看代码
class Solution {
    public int fourSumCount(int[] nums1, int[] nums2, int[] nums3, int[] nums4) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i : nums1) {
            for (int j : nums2) {
                int sum = i + j;
				//放入Map,若key重复则加1
                map.put(sum, map.getOrDefault(sum, 0) + 1);
            }
        }
        //定义满足条件的四元组数量
        int cnt = 0;
        //定义在map中找的目标值
        int target;
        for (int i : nums3) {
            for (int j : nums4) {
                target = 0 - i - j;
                if (map.containsKey(target)) {
                    cnt += map.get(target);//返回target对应的value,即nums1,nums2中满足的对数
                }
            }
        }
        return cnt;
    }
}
posted @ 2023-08-19 22:08  像峰一样  阅读(16)  评论(0)    收藏  举报