LeetCode 001 Two Sum

题目


对于输入的数组和目标整数,找到数组中的两个数加起来等于目标。

PS: 返回的是序号,且序号1必须小于序号2。且学号的返回不是以0为起点的。

PPS:可以假设必然存在答案

思路1


暴力破解,每一对都算出来。这样需要O(n^2)的时间,肯定不行。

    int[] ans = new int[2];
        int n = numbers.length;
        if(numbers == null || n < 2){
            return ans;
        }
        for(int i=0;i<n;i++){
            for(int j=i+1;j<n;j++){
                if(numbers[i]+numbers[j]==target){
                    ans[0]=i+1;
                    ans[1]=j+1;
                    return ans;
                }
            }
        }
        return ans;

思路2


sort! 排序后,直接从两头开始算起,和target比,小的话,左边i++;大的话,右边j--;如此一来,所需要的比较时间为O(n),但是排序时间为O(nlgn)。之后,再对序号的做寻找和调整即可。网上找到的这篇很好,用了一个node类型,事先存储val和index的对应关系。

http://www.cnblogs.com/remlostime/archive/2012/11/15/2772251.html


思路3


HashMap

public class Solution {
    public int[] twoSum(int[] numbers, int target) {
        int[] ans = new int[2];
        int n = numbers.length;
        if(numbers == null || n ==0){
            return ans;
        }
        
        HashMap<Integer,Integer> record = new HashMap<Integer,Integer>();
        for(int i = 0; i < n;i++){
            int other = target-numbers[i];
            if(record.containsKey(other)){
                ans[0]=record.get(other)+1;
                ans[1]=i+1;
                return ans;
            }
            else{
                record.put(numbers[i],i);
            }
        }
        return ans;
        
    }
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值