LeetCode. Two Sum系列

1. Two Sum

三种解法,第一种是暴力破解,时间复杂度为O(n^2)。第二种是使用HashMap,第三种也是使用HashMap,是在第二种基础上的优先,这里只记录第二种和第三种。

第二种解法JAVA版本

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

第三种解法JAVA版本

class Solution {
    public int[] twoSum(int[] nums, int target) {
        Map<Integer, Integer> map = new HashMap<>();

        for(int i=0;i<nums.length;i++){
            int complement = target - nums[i];
            if(map.containsKey(complement)){
                return new int[]{map.get(complement),i};  // 较小的索引在前面,这里的complement已经在map中,说明其索引较小。
            }
            map.put(nums[i],i);
        }
        return new int[]{};
    }
}

 

2.Two Sum II - Input array is sorted

第一种解法C++版本

双指针方法

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        if(numbers.size()<2){
            return {};
        }
        int i,j;
        i = 0, j = numbers.size()-1;
        while(i<j){
            if(numbers[i]+numbers[j]==target){
                return {i+1,j+1};
            }
            else if(numbers[i]+numbers[j]>target){
                j--;
            }else{
                i++;
            }
        }
        return {};
    }
};

第二种解法(固定一个数,使用二分查找找到另一个数或者找不到,时间复杂度为O(nlogn))

class Solution {
public:
    vector<int> twoSum(vector<int>& numbers, int target) {
        if(numbers.size()<2){
            return {};
        }
        for(int i=0;i<numbers.size()-1;i++)  // i的取值范围必须保证其后还有可选的数,因此0<=i<=numbers.size()-2
        {
            int j,k;
            j = i+1, k = numbers.size()-1;      
            while(j<=k){
                int mid =(j+k)/2;
                if(numbers[mid]==target-numbers[i]){
                    return {i+1, mid+1};
                }else if(numbers[mid]>target-numbers[i]){
                    k = mid -1;
                }else{
                    j = mid + 1;
                }
            }
        }
        return {};
    }
};

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值