leetcode多值求和问题

多值求和问题,在leetcode中,有一些考察多值加和问题,最简单的即两数之和为特定的值,暴力解法即先遍历一遍再在内层中进一步遍历,得到的方法即 O ( n 2 ) \mathcal{O(n^2)} O(n2) , 三值可以类似做法,得到的是 O ( n 3 ) \mathcal{O(n^3)} O(n3) ,毫无疑问,暴力法总是可以解决的, 但是对于数组变大,以及参与计算的值变多,导致计算量增长很大,并不是一个有效的方法

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] target_arr = new int[2];
        int n = nums.length;
        for(int i =0;i<n;i++){
            for(int j = i+1; j <n;j++){
                if(nums[i] + nums[j] == target){
                    target_arr[0] = i;
                    target_arr[1] = j;
                    return target_arr;
                }                 
            }
        }
        return target_arr;
    }    
}

可以利用hashmap进行计算,因为hashmap可以直接索引对应的值的key,恰好题目有一个隐藏条件,即每个数字只能使用一次;把值和对应的位置存储在hashmap即可,

class Solution {
    public int[] twoSum(int[] nums, int target) {
        int n = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for(int i = 0;i<n;i++){
            map.put(nums[i],i);
        }

        for(int j = 0;j<n;j++){
            if(map.containsKey(target -nums[j]) && map.get(target -nums[j]) != j){
                return new int[] {j,map.get(target -nums[j])};
            }
        }
        return new int[2];
    }
    
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值