无序可重复数组中所有两个数相加等于一个固定数的下标组合

题目描述

给定一个无序可重复数组nums,一个固定数k。返回数组中所有两个数相加等于这个固定数的下标组合。例如:数组[3,3,1,5],固定数为8,返回[0,3],[1,3]。

思路

暴力双重遍历复杂度太高,用哈希表O(1)的快速查找特性进行内部循环的代替。哈希表存储key为数组值nums[i],value为数组值出现的下标集合List。

java代码

    public static int[][] function(int[] nums,int k){

        HashMap<Integer, ArrayList<Integer>> map = new HashMap<>();
        ArrayList<int[]> res = new ArrayList<>();

        for(int i=0;i<nums.length;i++){
            int tmp = k-nums[i];
            if(!map.containsKey(tmp)){//如果map里不包含nums[i] - k,则将i添加进value的list中,并更新map
                ArrayList<Integer> list = map.get(nums[i])==null?new ArrayList<>():map.get(nums[i]);
                list.add(i);
                map.put(nums[i],list);
            }else{//包含tmp的话,遍历map中tmp的list,制作二元组,加入最终集合res
                ArrayList<Integer> list = map.get(tmp);
                for (int j=0;j<list.size();j++){
                    int[] arr = new int[2];
                    arr[0] = list.get(j);
                    arr[1] = i;
                    res.add(arr);
                }

            }
        }
		//转成二维数组
        int[][] arrays = new int[res.size()][2];
        for(int i=0;i<res.size();i++){
            arrays[i][0] = res.get(i)[0];
            arrays[i][1] = res.get(i)[1];
        }

        return arrays;

    }
这是一个经典的算法问题,在 C++ 中可以利用哈希表(`unordered_map`)来高效解决此问题。以下是实现步骤以及解释: ### 实现思路: 1. **创建一个哈希表**:用于存储遍历过程中每个元素及其对应的索引。 2. 遍历数组的同时检查当前元素是否能与之前某个已访问过的元素相加得到目标和。 - 如果存在这样的组合,则直接返回它们的下标。 - 否则将该元素存入哈希表以便后续查找。 这种方法的时间复杂度为 O(n),因为只需一次遍历即可完成任务,并且每次从哈希表中查询也只需要常时间操作。 ```cpp #include <iostream> #include <vector> #include <unordered_map> using namespace std; // 函原型定义 vector<int> twoSum(vector<int>& nums, int target); int main(){ vector<int> arr = {2,7,11,15}; // 示例输入 int sum = 9; // 指定的目标和 vector<int> result = twoSum(arr, sum); if(!result.empty()){ cout << "个数字分别是:" << arr[result[0]] << ", " << arr[result[1]] << endl; cout << "其对应下标分别为:" << result[0] << " 和 " << result[1]; } else { cout << "未找到满足条件的一对"; } return 0; } vector<int> twoSum(vector<int>& nums, int target){ unordered_map<int,int> map; // 创建无序映射 for(int i=0;i<nums.size();i++){ int complement = target - nums[i]; // 计算差 // 判断是否有匹配项存在于map里 if(map.find(complement) != map.end()){ return {map[complement], i}; } // 当前元素不存在于map时将其加入到map当中 map[nums[i]]=i; } return {}; } ``` 上述代码通过构建哈希表快速定位到了符合条件的结果。如果在所有据都处理完之后仍然找不到合适解,则返回空向量表示没有结果。 --- ### 运行说明: 程序会尝试寻找数组内是否存在之和等于用户给定的特定总和的情况;若发现这种状况就打印出这及各自所在的原始位置编号。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值