LeetCode刷题 1.两数之和

一、题目

给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。

你可以假设每个输入只对应一种答案,且同样的元素不能被重复利用。

示例:

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

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

二、第一次成功提交(C)

int* twoSum(int* nums, int numsSize, int target) 

{
    int *a = (int*)malloc(2*sizeof(int));
    for(int i=0;i<numsSize;i++)
    {
        for(int j=0;j<numsSize;j++)
        {
            if(i!=j)
            {
                if(target == (nums[i]+nums[j]))
                {
                    a[0]=i;
                    a[1]=j;
                }
            }
        }
    }
    return a;
}

本此提交总结:

1.int a[2]之后return错误, 改为malloc申请地址,看来C的基本功还不扎实。

2.此为穷举法,双层循环时间复杂度较高。

三、学习哈希大法后提交代码(C++)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector<int> result;
        map<int,int> tmp;
        for(int i=0;i<nums.size();i++)
            tmp[nums[i]]=i;
        for(int i=0;i<nums.size();i++)
        {
            if(tmp.count(target-nums[i]) && tmp[target-nums[i]]!=i)
            {
                result.push_back(i);
                result.push_back(tmp[target-nums[i]]);
                break;
            }
        }
        return result;
    }
};

本次提交总结:

1.可以代替以前的创建一个超级大的数组a,在有这个数的对应的索引值的a的数组中置1。强烈推荐以后代替成这种方法。

四、一次循环哈希大法进阶(C++)

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) 
    {
        vector<int> result;
        map<int,int> tmp;
        for(int i=0;i<nums.size();i++)
        {
            if(tmp.count(target-nums[i]) && tmp[target-nums[i]]!=i)
            {
                result.push_back(i);
                result.push_back(tmp[target-nums[i]]);
                break;
            }
            tmp[nums[i]]=i;
        }
        return result;
    }
};

本此提交总结:

由于tmp[nums[i]]=i;的位置在刚进for循环那里,导致一直不通过,放到了for循环的最后通过了,说明在逻辑阶段还是有问题的,需要以后注意。

具体出错逻辑:

先判断map中是否有符合的值,再进行map的添加。而不是先添加值,再进行判断。例如[3,3],6的输入,若先添加值,则在位置1的3添加后覆盖了前面的3的索引,导致0输出出错,以后注意,逻辑一定要清楚。

猜你喜欢

转载自blog.csdn.net/qq_33181035/article/details/82972522