lintcode刷题——两数之和、三数之和、四数之和、最接近的三数之和

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m0_37973607/article/details/89360197

56. 两数之和

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target

你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 0 到 n-1

样例

Example1:
numbers=[2, 7, 11, 15], target=9
return [0, 1]
Example2:
numbers=[15, 2, 7, 11], target=9
return [1, 2]

挑战

Either of the following solutions are acceptable:

  • O(n) Space, O(nlogn) Time
  • O(n) Space, O(n) Time

注意事项

你可以假设只有一组答案。

class Solution {
public:
       vector<int> twoSum(vector<int> &numbers, int target) {
        // write your code here
        //暴力枚举每一个i和j,如果加起来和为target即为答案
        int l=numbers.size();
        int i,j;
        int flag=0;//flag作为找到答案后跳出的一个标记用变量
        for(i=0;i<l;++i)
        {
            for(j=i+1;j<l;++j)
            {
                if(numbers[i]+numbers[j]==target)
                {
                    flag=1;
                    break;
                }
            }
            if(flag)
                break;
        }
        vector<int> ans;
        ans.push_back(i);
        ans.push_back(j);
        return ans;
    }
};

或: 

class Solution {
public:
    vector<int> twoSum(vector<int> &nums, int target) {
        // write your code her
        unordered_map<int, int> hash;
        vector<int> result;

        // 一边循环每个数,一边加入hash表。
        for (int i = 0; i < nums.size(); i++) {
            if (hash.find(target - nums[i]) != hash.end()) {
                // target - nums[i]的下标更小,放在前面
                result.push_back(hash[target - nums[i]]);
                result.push_back(i);
                return result;
            }
            hash[nums[i]] = i;
        }

        // 无解的情况
        result.push_back(-1);
        result.push_back(-1);
        return result;
    }
};

57. 三数之和

给出一个有n个整数的数组S,在S中找到三个整数a, b, c,找到所有使得a + b + c = 0的三元组。

在三元组(a, b, c),要求a <= b <= c。

结果不能包含重复的三元组。

样例

Example 1:

Input:[2,7,11,15]
Output:[]

Example 2:

Input:[-1,0,1,2,-1,-4]
Output:	[[-1, 0, 1],[-1, -1, 2]]
class Solution {
public:
    vector<vector<int>> threeSum(vector<int> &nums) {
        // write your code here
        vector<vector<int> > result; //二维的vector
        
        sort(nums.begin(), nums.end()); //调用C++标准库里的排序函数,需包含头文件#include<algorithm>
        for(int i=0;i<nums.size();i++)
        {
            if(i>0&&nums[i]==nums[i-1])
            {
                continue;
            }
            int start=i+1,end=nums.size()-1;
            int target=-nums[i];
            while(start<end)
            {
                if(start>i+1&&nums[start]==nums[start-1])
                {
                    start++;
                    continue;
                }
                if(nums[start]+nums[end]>target)
                {
                    end--;
                }
                else if(nums[start]+nums[end]<target)
                {
                    start++;
                }
                else
                {
                    vector<int> triple;
                    triple.push_back(nums[i]);
                    triple.push_back(nums[start]);
                    triple.push_back(nums[end]);
                    result.push_back(triple);
                    start++;
                }
            }
            
        }
        return result;
    }
};
扫描二维码关注公众号,回复: 5929378 查看本文章

58. 四数之和

中文English

给一个包含n个数的整数数组S,在S中找到所有使得和为给定整数target的四元组(a, b, c, d)。

样例

例1:

输入:[2,7,11,15],3
输出:[]

例2:

输入:[1,0,-1,0,-2,2],0
输出:
[[-1, 0, 0, 1],[-2, -1, 1, 2],[-2, 0, 0, 2]]

注意事项

四元组(a, b, c, d)中,需要满足a <= b <= c <= d

class Solution {
public:
       vector<vector<int>> fourSum(vector<int> &nums, int target) {
        // write your code here
        vector<vector<int>> result;
        sort(nums.begin(),nums.end());
        for(int i=0;i<nums.size();i++)
        {
            if(i>0&&nums[i]==nums[i-1])
            {
                continue;
            }
            for(int j=i+1;j<nums.size();j++)
            {
                if(j>i+1&&nums[j]==nums[j-1])
                {
                    continue;
                }
                int start=j+1;
                int end=nums.size()-1;
                while(start<end)
                {
                    if(start>j+1&&nums[start]==nums[start-1])
                    {
                        start++;
                        continue;
                    }
                    if(nums[i]+nums[j]+nums[start]+nums[end]<target)
                    {
                        start++;
                    }
                    else if(nums[i]+nums[j]+nums[start]+nums[end]>target)
                    {
                        end--;
                    }
                    else
                    {
                        vector<int> triple;
                        triple.push_back(nums[i]);
                        triple.push_back(nums[j]);
                        triple.push_back(nums[start]);
                        triple.push_back(nums[end]);
                        result.push_back(triple);
                        start++;
                    }
                }
            }
        }
        return result;
    }
};

59. 最接近的三数之和

给一个包含 n 个整数的数组 S, 找到和与给定整数 target 最接近的三元组,返回这三个数的和。

样例

例1:

输入:[2,7,11,15],3
输出:20
解释:
2+7+11=20

例2:

输入:[-1,2,1,-4],1
输出:2
解释:
-1+2+1=2

挑战

O(n^2) 时间, O(1) 额外空间。

注意事项

只需要返回三元组之和,无需返回三元组本身

class Solution {
public:
    int threeSumClosest(vector<int> &nums, int target) {
        // write your code here
        sort(nums.begin(),nums.end());
        int result=nums[0]+nums[1]+nums[2];
        for(int i=0;i<nums.size();i++)
        {
            int start=i+1;
            int end=nums.size()-1;
            while(start<end)
            {
                if(abs(nums[i]+nums[start]+nums[end]-target)<abs(result-target))
                {
                    result=nums[i]+nums[start]+nums[end];
                }
                else if(nums[i]+nums[start]+nums[end]>target)
                {
                    end--;
                }
                else
                {
                    start++;
                }
            }
        }
        return result;
    }
};

猜你喜欢

转载自blog.csdn.net/m0_37973607/article/details/89360197