题目

Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

Note: The solution set must not contain duplicate triplets.

For example, given array S = [-1, 0, 1, 2, -1, -4],

A solution set is:
[
  [-1, 0, 1],
  [-1, -1, 2]
]

解答

看这个题目,首先想到的是暴力枚举,不过做完之后看了网上的一些解答,好像暴力枚举确实是可以的。

但是作为一个可爱的娃的爸爸,我肯定是先想到排序,这样就算是暴力枚举,应该也会方便一丢丢?
不管怎么样先做个排序,排序完之后就要冷静的想一想这个问题的本质,毕竟除了3sum,这个题还可以出成4sum,5sum什么的。

我们知道,如果把这个题目改成求2sum,那么就很简单了,从头开始遍历,先确定第一个数,确定了第一个数后从尾开始遍历,不断尝试第二个数。
那么我们就可以递归的来思考这个问题,我们可以把这个问题看成,找到所有由一个数和一个2sum构成的组合,这样就很简单了。
于是我们同样从头开始遍历,先确定第一个数a,然后问题就变成,在a后面的数组中,求2sum,且2sum的和为-a。

下面是AC的代码,可能我细节方面做的还不够好,我的这个解法只能击败80%的答题者:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        int i, j, k, m;
        int length = nums.size();
        int temp;
        vector<vector<int>> ans;

        if(length == 0){
            return ans;
        }
        sort(nums.begin(), nums.end());
        if(nums.front() > 0 || nums.back() < 0){
            return ans;
        }
        for(i = 0; i < length - 2; i++){
            if(i > 0 && nums[i - 1] == nums[i]){
                continue;
            }
            for(j = i + 1, k = length - 1; j < k; ){
                if(nums[i] + nums[j] + nums[k] == 0){
                    vector<int> temp;
                    temp.push_back(nums[i]);
                    temp.push_back(nums[j]);
                    temp.push_back(nums[k]);
                    ans.push_back(temp);
                    j++;
                    while(j < k && nums[j] == nums[j - 1]){
                        j++;
                    }
                    k--;
                    while(j < k && nums[k] == nums[k + 1]){
                        k--;
                    }
                }
                else if(nums[i] + nums[j] + nums[k] < 0){
                    j++;
                }
                else{
                    k--;
                }
            }
        }
        return ans;
    }
};

101

LeetCode OJ 15. 3Sum的更多相关文章

  1. LeetCode:15. 3Sum(Medium)

    1. 原题链接 https://leetcode.com/problems/3sum/description/ 2. 题目要求 数组S = nums[n]包含n个整数,请问S中是否存在a,b,c三个整 ...

  2. 【LeetCode】15. 3Sum 三数之和

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 个人公众号:负雪明烛 本文关键词:3sum, 三数之和,题解,leetcode, 力扣,P ...

  3. 【一天一道LeetCode】#15 3Sum

    一天一道LeetCode系列 (一)题目 Given an array S of n integers, are there elements a, b, c in S such that a + b ...

  4. 《LeetBook》leetcode题解(15):3Sum[M]

    我现在在做一个叫<leetbook>的免费开源书项目,力求提供最易懂的中文思路,目前把解题思路都同步更新到gitbook上了,需要的同学可以去看看 书的地址:https://hk029.g ...

  5. LeetCode OJ:3Sum Closest(最接近的三数之和)

    Given an array S of n integers, find three integers in S such that the sum is closest to a given num ...

  6. Leetcode Array 15 3sum

      思考的方向不对,即使用了多于别人几倍的时间,也不一定能够达到终点. 我的错误的想法(可以跳过):在leetcode上面做的第四道题,走路一个很大的弯路,收到之前做过的 Container With ...

  7. 【LeetCode】15. 3Sum 三个数和为0

    题目: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find al ...

  8. 【leetcode】15. 3Sum

    题目描述: Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find ...

  9. [LeetCode]题15:3Sum

    第一次解: res = [] nums.sort() if len(nums)<3:return [] for i in range(len(nums)-2): left = i+1 right ...

随机推荐

  1. jqgrid使用(1)生成表格

    1.引入js,css 2,基本配置 function init() { $("#list1").jqGrid({ url: "../Listing.ashx", ...

  2. logstash报错401 需要在logstash启动的配置文件中增加es的用户名和密码

  3. .net core 认证

    http://www.cnblogs.com/RainingNight/p/cookie-authentication-in-asp-net-core.html

  4. Unreal Engine 4 Based Materials

    转自:http://www.52vr.com/article-862-1.html 材质参数   UE4的材质参数有4个,输入范围都是0~1之间……分别为:   Base Color Roughnes ...

  5. Delphi疑难问题整理!!!

    一.Dll调用时报错,例如: TGetResPrice = function(var AName: string; AFileName: string): TResourceRecArray; std ...

  6. Django之用户认证auth模块

    一 Django中的auth模块: 我们在使用模块之前要先导入模块: from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介 ...

  7. Vue学习记录(二)

    一.指令 指令是Vue.js中一个重要的特性,主要提供了一种机制将数据的变化映射为DOM行为.当数据变化时,指令会依据设定好的操作对DOM进行修改,这样就可以只关注数据的变化,而不用去管理DOM的变化 ...

  8. css的优化规则

    1.避免过度约束: // 不推荐 ul.nav{..} // 推荐 .nav{..}  2.避免过长的后代选择符: // 不推荐 html div tr td {..} 3.避免链式(交集)选择符: ...

  9. EXCEL workbook.saveas 函数详解

    本问所有资料来自于 Excel2003 VBA帮助文件,张荣整理,适用于DELPHI,VB的高级语言操作Excel用 ExcelApplication.WorkBook.SaveAs(filename ...

  10. Robot Operating System (ROS)学习笔记3---键盘控制

    搭建环境:XMWare  Ubuntu14.04  ROS(indigo) 转载自古月居  转载连接:http://www.guyuehome.com/253 一.创建控制包 catkin_creat ...