2020-8-11 leetcode刷题 Two Sum 两数之和

Two Sum 两数之和

2020-8-11 leetcode刷题 Two Sum 两数之和_第1张图片
今天是我第一次写leetcode的题目,首先leetcode的代码格式就和普通的c++格式不同,它不需要加入头文件和main函数,只要把可运行的内容放到他给的类里面即可,对于初学者需要适应一段时间。这个题目很简单,暴力求解直接遍历相加即可,但是实际写的时候,我发现我不会求给定的数列的长度,后来查阅资料得知,可以通过下面的方法求出数组长度:

int nums[], n;//给定了一个大小未知的数组
n =sizeof(nums)/sizeof(nums[0]);//求出数组大小

但实际上,leetcode在本题给定了一个向量数组,我们可以用向量的内置函数vector.size()来获取数组长度。
最后我的代码为这个:

#include 
using namespace std;
int main()
{
     
    int nums[] = {
     2, 7, 11, 15}, target = 9;
    int n = 0, first = 0, second = 0;
    n =sizeof(nums)/sizeof(nums[0]); //求出数组大小
    for(int i=0; i<n ; i++)
    {
     
        for(int j = i+1; j<n ; j++)
        {
     
            int sum = 0;
            sum = nums[i] + nums[j];
            if (sum == target)
            {
     
                first = i;
                second = j;
            }
        }
    }
    cout<<'['<<first<<','<<second<<']';
    return 0;
}

然后看了大佬的代码,用的是排序加双指针的方法,时间复杂度上面会减少。代码如下(我的sort函数不知道为啥不能调用,只好自己重新写):

#include 
using namespace std;

void sort1(int begin, int end, int nums[])
{
     
    //快速排序
    if(begin > end) //基准条件
    {
     return;}
    int i, j, base, temp;
    i = begin;
    j = end;
    base = nums[i];
    while(i<j)
    {
     
        while(nums[j] >= base && i<j)
        {
     
            j--;
        }
        while(nums[i] <= base && i <j)
        {
     
            i++;
        }
        if(i < j)
        {
     
            temp = nums[i];
            nums[i] =nums[j];
            nums[j] = temp;
        }
    }
    //基准数归位
    nums[begin] = nums[i];
    nums[i] = base;
    sort1(begin, i-1, nums);//递归左边
    sort1(i+1, end,nums);//递归右边
}
int main()
{
     
int nums[] = {
     1, 4, 2, 8, 3}, target = 6;
int first = 0, second = 0, n =sizeof(nums)/sizeof(nums[0]);
int temp[n];
for(int i=0; i<n ; i++)
{
     
    temp[i] = nums[i];
}
sort1(0, n-1, temp);
int i = 0, j =n-1;
while(i<j)
{
     
    if(temp[i] + temp[j] > target)j--;
    else if(temp[i] + temp[j] < target)i++;
    else break;
}
if (i<j)
{
     
    for(int k=0;k<n;k++)
    {
     
        if(i<n&&nums[k] == temp[i])
        {
     
            first = k;
            i = n;
        }
        if(j<n&&nums[k] == temp[j])
        {
     
            second = k;
            j = n;
        }
        if(i == n && j == n)
        {
     
            if(first < second){
     
                cout<<'['<<first<<','<<second<<']';
            }
            else{
     
                cout<<'['<<second<<','<<first<<']';
            }
        }
    }
}
return 0;
}

最后还有一个方法是hash法,由于我还没有学过相关知识,等我学到了再回来补充。

你可能感兴趣的:(刷题,leetcode,c++)