LeetCode:1. Two Sum

本文针对TwoSum问题,提出两种解决方案:暴力破解法和使用HashMap法。暴力破解通过双层循环实现,时间复杂度为O(n^2);使用HashMap则先存储数组元素及其下标,再遍历数组查找匹配项,时间复杂度为O(n)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0X01 题目

Question

Two Sum

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

You may assume that each input would have exactly one solution.

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9,

return [0, 1].

UPDATE (2016/2/13):

The return format had been changed to zero-based indices. Please read the above updated description carefully.

问题

给定一个整数数组,返回和等于指定数值的两个数字的下标。

假设每个输入有且仅有一个结果。

例子:

nums = [2, 7, 11, 15], target = 9,

因为nums[0] + nums[1] = 2 + 7 = 9,

因此返回 [0, 1]。

更新 (2016/2/13): 返回格式更改为以0为起始的下标。

0X02 题意

简单来说,就是给一数组及一数值,求数组中两元素相加为该数值的索引。

0X03 题解

1.暴力破解(Cathy:C++)

双层循环,暴力破解。

  • 时间复杂度:O(n^2)。

  • 空间复杂度:O(1)。

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int n = nums.size();
        vector<int> res;
        for(int i = 0; i < n-1; i++) {
            for(int j = i+1; j < n; j++) {
                if(nums[i] + nums[j] == target) {
                    res.push_back(i);
                    res.push_back(j);
                    return res;
                }
            }
        }
        return res;
    }
};

2.使用HashMap(Dante:Java)

使用HashMap,先将所有元素存入HashMap(HashMap中的key是数组中的元素值,value是元素的下标)中,然后遍历原数组,每次循环都用target减去当前遍历到的数值,即diff = target - nums[i];,如果HashMap中存在diff,则返回i和hashMap.get(diff)。

  • 时间复杂度:O(n)

  • 空间复杂度:O(n)

public class Solution {
    public int[] twoSum(int[] nums, int target) {
        int[] res = new int[2];
        Map<Integer, Integer> hashMap = new HashMap<>();
        for(int i = 0; i < nums.length; i++) {
            hashMap.put(nums[i], i);
        }
        int diff;
        for(int i = 0; i < nums.length; i++) {
            diff = target - nums[i];
            if (hashMap.containsKey(diff)) {
                if(i == hashMap.get(diff)) {
                    continue;
                }
                res[0] = i;
                res[1] = hashMap.get(diff);
                return res;
            }
        }
        return res;
    }
}

2016-08-01 14:18:20 hzct

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值