栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

LeetCode18:四数之和(Medium)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode18:四数之和(Medium)

题目:给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): a、b、c 和 d 互不相同 

nums[a] + nums[b] + nums[c] + nums[d] == target,你可以按 任意顺序 返回答案 。

提示:

  • 1 <= nums.length <= 200
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109

两种方法:

①暴力解法:直接四个for(),但在这里应该是超出时间限制!

②排序+双指针法:将所给的元素排序后,再用双指针收缩到一定程度,求出其结果。

这里要用到vector的二阶性、排序算法、clear()等vector容器的高级用法,读者可自行阅读文章http://t.csdn.cn/RID11

1.将所给数组元素按照从小到大排序、并定义二阶、一阶vector

vector vet;
vector> v;
sort(nums.begin(), nums.end(

2.因为双指针只能指两个元素,所以还需要再用两个for()确定两个数据

两个for()中再嵌入一个while(),代表着双指针!

         for (int i = 0; i < nums.size(); i++)
         {
            for (int j = i + 1; j < nums.size(); j++)
            {

                int left = j + 1;
                int right = nums.size() - 1;
                while (left < right)
                {
                    vet.clear();
                    long temp = (long)nums[i] + (long)nums[j] + (long)nums[left] + (long)nums[right];
                    if (temp == target)
                    {
                        vet.push_back(nums[i]);
                        vet.push_back(nums[j]);
                        vet.push_back(nums[left]);
                        vet.push_back(nums[right]);
                        v.push_back(vet);
                    }
                    if (temp - target >= 0)
                    {
                        right = right - 1;
                    }
                    if (temp - target < 0)
                    {
                        left = left + 1;
                    }
                }
            }
        }

ps:因为提示中显示nums数组元素最大是10^9,四个最大元素相加是大于int类型的最大值2.9X10^9,所以需要用long在定义一个temp,防止leetcode中某些奇葩案列导致结果不能提交

每次循环都需要v.clear()清空元素,否则会导致数据堆积!

3.最后需要去除重复元素

       sort(v.begin(), v.end());
        v.erase(unique(v.begin(), v.end()), v.end());

完整代码:

class Solution
{
public:
    vector> fourSum(vector &nums, int target)
    {
        vector vet;
        vector> v;
        sort(nums.begin(), nums.end());
        for (int i = 0; i < nums.size(); i++)
        {
            for (int j = i + 1; j < nums.size(); j++)
            {

                int left = j + 1;
                int right = nums.size() - 1;
                while (left < right)
                {
                    vet.clear();
                    long temp = (long)nums[i] + (long)nums[j] + (long)nums[left] + (long)nums[right];
                    if (temp == target)
                    {
                        vet.push_back(nums[i]);
                        vet.push_back(nums[j]);
                        vet.push_back(nums[left]);
                        vet.push_back(nums[right]);
                        v.push_back(vet);
                    }
                    if (temp - target >= 0)
                    {
                        right = right - 1;
                    }
                    if (temp - target < 0)
                    {
                        left = left + 1;
                    }
                }
            }
        }
        sort(v.begin(), v.end());
        v.erase(unique(v.begin(), v.end()), v.end());
        return v;
    }
};

本道题的解题思路就是这样了

欢迎各位读者的纠正!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1035981.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号