给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
[-1, 0, 1],
[-1, -1, 2]
]

自己的思路:如果追求思路简单,就是暴力的去求解每三个字符的和是否为0,但是有三层循环,时间复杂度太高,提交,超出时间限制。

(1)

  • 排序。排序可以让数据变得有序,在许多算法中都有使用。
  • 定义三个指针i,left,right.
  • i用来遍历数据,从下下标为0一直到len-3。
  • 对于每一个i,令left=i+1,right=len-1,然后检查三个指针所指数据的和,

    如果为0,说明找到一个符合条件的组合,把三个数放入vector中然后再放入map中,接着把left++,right--。

    如果>0,则说明当前的right偏大,则把right--,因为是排序的,所以整体和会变小。

    如果<0,说明当前的left偏小,则把left++,因为是排序的,所以整体的和会变大。(这里变大变小不是一定的,因为可能存在重复的数据,不影响)

    vector<vector<int>> threeSum(vector<int>& nums)
    { vector<vector<int>> result;
    int len = nums.size();
    map<vector<int>,int> m;
    if(nums.empty()||len<3) return result;
    sort(nums.begin(),nums.end());
    vector<int> res;
    int p1,p2,p3;
    int i=0;
    for(p1=0;p1<=len-3;p1++)
    {
    int left=p1+1;
    int right = len-1;
    while(left<right)
    {
    if(nums[p1]+nums[left]+nums[right]==0)
    {
    res.push_back(nums[p1]);
    res.push_back(nums[left]);
    res.push_back(nums[right]);
    if(!m.count(res))
    {
    m.insert(map<vector<int>,int>::value_type(res,i++));
    result.push_back(res);
    }
    res.clear();
    left++;
    right--;
    }
    else if(nums[p1]+nums[left]+nums[right]<0)
    left++;
    else
    right--;
    }
    }
    return result;
    }

    这里用map和map中的count函数是为了去除相同的组合,因为数组是排序好的,所以找到的组合也是排序好的,如果相同的话,是完全相同的,否则我们还得先排序才能比较。

  • (2)大神们还有比这个更加快速的解决方案,那就是

    vector<vector<int>> threeSum(vector<int>& nums)
    {
    vector<vector<int>> rs;
    vector<int> res;
    if(nums.size() == 0) return rs;
    sort(nums.begin(), nums.end());//先对目标数组进行从小到大的排序
    for (int i = 0; i < nums.size() - 2; i++)
    {
    if (nums[i] > 0) return rs;//如果最小值都大于0,那么就不用再找了
    if (i > 0 && nums[i] == nums[i-1]) //如果和前一个值相等,就跳过,去重
    continue;
    int tmpTarget = 0 - nums[i];//接下来就求nums[i]的相反数 int beg = i + 1, end = nums.size() - 1;//也是从两边开始往中间查找
    while (beg < end)
    {
    if (nums[beg] + nums[end] == tmpTarget)
    {
    res.push_back(nums[i]);
    res.push_back(nums[beg]);
    res.push_back(nums[end]);
    rs.push_back(res);
    while(beg < end - 1 && nums[end] == nums[end-1]) //同样是和前一个相同,去重
    end--;
    end--;
    res.clear();
    }
    else if (nums[beg] + nums[end] > tmpTarget)
    end--;
    else
    beg++;
    }
    }
    return rs;
    }

Leetcode(15)-三数之和的更多相关文章

  1. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  2. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  3. LeetCode——15. 三数之和

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三元组. ...

  4. LeetCode 15. 三数之和(3Sum)

    题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复 ...

  5. [Leetcode 15]三数之和 3 Sum

    [题目] Given an array nums of n integers, are there elements a, b, c in nums such that a + b + c = 0? ...

  6. [LeetCode]15. 三数之和(数组)(双指针)

    题目 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重复的三 ...

  7. [LeetCode] 15. 三数之和

    题目链接:https://leetcode-cn.com/problems/3sum/ 题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a ...

  8. LeetCode:三数之和【15】

    LeetCode:三数之和[15] 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的 ...

  9. 代码随想录第七天| 454.四数相加II、383. 赎金信 、15. 三数之和 、18. 四数之和

    第一题454.四数相加II 给你四个整数数组 nums1.nums2.nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 <= i, ...

  10. leetcode题目15.三数之和(中等)

    题目描述: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以包含重 ...

随机推荐

  1. 入门OJ:最短路径树入门

    题目描述 n个城市用m条双向公路连接,使得任意两个城市都能直接或间接地连通.其中城市编号为1..n,公路编号为1..m.任意个两个城市间的货物运输会选择最短路径,把这n*(n-1)条最短路径的和记为S ...

  2. RabbitMQ六种工作模式有哪些?怎样用SpringBoot整合RabbitMQ

    目录 一.RabbitMQ入门程序 二.Work queues 工作模式 三.Publish / Subscribe 发布/订阅模式 四.Routing 路由模式 五.Topics 六.Header ...

  3. hello2 部分代码解析

    ResponseServlet.java源码文件 1 @WebServlet("/response") //以@WebServlet注释开头,注释指定相对于上下文根的URL模式, ...

  4. MATLAB图像处理_Bayer图像处理 & RGB Bayer Color分析

    Bayer图像处理   Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 ...

  5. 详解Mybatis拦截器(从使用到源码)

    详解Mybatis拦截器(从使用到源码) MyBatis提供了一种插件(plugin)的功能,虽然叫做插件,但其实这是拦截器功能. 本文从配置到源码进行分析. 一.拦截器介绍 MyBatis 允许你在 ...

  6. 架构风格 vs. 架构模式 vs. 设计模式(译)

    4.架构风格 vs. 架构模式 vs. 设计模式(译) - 简书 https://www.jianshu.com/p/d8dce27f279f

  7. 回归测试_百度百科 https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

    回归测试_百度百科https://baike.baidu.com/item/%E5%9B%9E%E5%BD%92%E6%B5%8B%E8%AF%95

  8. 避免重复提交?分布式服务的幂等性设计! 架构文摘 今天 点击蓝色“架构文摘”关注我哟 加个“星标”,每天上午 09:25,干货推送! 来源:https://www.cnblogs.com/QG-whz/p/10372458.html 作者:melonstreet

    避免重复提交?分布式服务的幂等性设计! 架构文摘  今天 点击蓝色"架构文摘"关注我哟    加个"星标",每天上午 09:25,干货推送!      来源:h ...

  9. http发送

    package cn.com.yitong.wdph.util; import java.io.BufferedReader;import java.io.InputStream;import jav ...

  10. LOJ10202樱花——数论

    题目描述 原题来自:HackerRank Equations 求不定方程: 1/x+1/y=1/n! 的正整数解 (x,y) 的数目. 输入格式 一个整数 n . 输出格式 一个整数,表示有多少对 ( ...