数组中的两数之和 无序数组

给定一个整数数组 numbers ,请你从数组中找出两个数满足相加之和等于目标数 target 。

函数应该以长度为 2 的整数数组的形式返回这两个数的下标值。numbers 的下标 从 0 开始计数 ,所以答案数组应当满足 0 <= answer[0] < answer[1] < numbers.length 。

假设数组中存在且只存在一对符合条件的数字,同时一个数字不能使用两次。

这个题首先最直接的思路就是采用双重循环,在数组中从前到后进行求和直到找到最后的答案

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

在计算的时候我们可以发现对于任何一个i来说,他的前后项都会被加一遍,但是其实i前面的项是已经被加过的,所以就可以初步优化这段代码为

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

这样优化之后,所有i的前项就不会再重复计算。但是这样做的话时间复杂度是O(n²),最差的情况会把整个数组读完。那么我们换个思路,假设数组中x+y=target,我们只需要检查数组中是否存在target-x的值,那么可以创建一个map,检查map中是否有target-x,如果没有那么就把数组的这一项放进map里,如果有就可以返回下标。

class Solution {
    public int[] twoSum(int[] numbers, int target) {
        Map<Integer,Integer> map = new HashMap<Integer,Integer>();
        for(int i=0;i<numbers.length;i++){
            if(map.containsKey(target-numbers[i])){
                return new int[]{map.get(target-numbers[i]),i};
            }
            map.put(numbers[i],i);
        }
        return new int[0];
    }
}

这样子做的话我们的时间复杂度就可以缩小到O(n),最坏的情况就是遍历一边数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值