首页 > 其他分享 >力扣-四数之和

力扣-四数之和

时间:2023-09-24 17:55:59浏览次数:27  
标签:四数 target nums int 力扣 right left

1.问题

给定一个包含 n 个整数的数组 nums 和一个目标值 target,判断 nums 中是否存在四个元素 a,b,c 和 d ,使得 a + b + c + d 的值与 target 相等?找出所有满足条件且不重复的四元组。

注意:

答案中不可以包含重复的四元组。

示例: 给定数组 nums = [1, 0, -1, 0, -2, 2],和 target = 0。 满足要求的四元组集合为: [ [-1, 0, 0, 1], [-2, -1, 1, 2], [-2, 0, 0, 2] ]

2.说明

输入说明:

首先输入n表示有n个数组;

数组n个数组;

输入target表示四数之和等于target

输出说明:

输出所有四数之和等于target的四元组

3.范例

输入范例:

6

1 0 -1 0 -2 2

0

输出范例:

-1 0 0 1

-2 -1 1 2

-2 0 0 2

4.思路

四数之和和三数之和算法思路一样,也是使用双指针,只是四数之和增加了一个数,因此也增加了一个下标,使用k表示,因此也是增加了一层for循环,同时也是需要对 k 进行去重和剪枝。

5.代码

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
class Solution
{
public: vector<vector<int>> foursum(vector<int> &nums,int target) { sort(nums.begin(),nums.end()); vector<vector<int>> result; for(int k=0;k<nums.size();k++) { //剪枝 if(nums[k]>target&&nums[k]>=0) break; //对nums[k]去重 if(k>0&&nums[k]==nums[k-1]) continue; for(int i=k+1;i<nums.size();i++) { if(nums[k]+nums[i]>target&&nums[k]+nums[i]>=0) break; if(i>0&&nums[i]==nums[i-1]) continue; int left=i+1; int right=nums.size()-1; while(left<right) { if(nums[k]+nums[i]+nums[left]+nums[right]>target) right--; else if(nums[k]+nums[i]+nums[left]+nums[right]<target) left++; else { result.push_back({nums[k],nums[i],nums[left],nums[right]}); //去重逻辑应该放在找到一个三元组之后,对b 和 c去重 while(right>left&&nums[right]==nums[right-1]) right--; while(right>left&&nums[left]==nums[left+1]) left++; //找到答案时,双指针同时收缩 right--; left++; } } } } return result; } }; int mian() { //四数之和 int n; cin>>n; vector<int> nums; int data; for(int i=0;i<n;i++) { cin>>data; nums.push_back(data); } int target; cin>>target; vector<vector<int>> res=Solution().foursum(nums,target); for(int i=0;i<res.size();i++) { for(int j=0;j<4;j++) { cout<<res[i][j]<<" "; } cout<<endl; } return 0; }

 

标签:四数,target,nums,int,力扣,right,left
From: https://www.cnblogs.com/ohye/p/17726276.html

相关文章

  • 力扣-三数之和
    1.问题给你一个包含n个整数的数组 nums,判断 nums 中是否存在三个元素a,b,c,使得 a+b+c=0?请你找出所有满足条件且不重复的三元组。注意: 答案中不可以包含重复的三元组。示例:给定数组nums=[-1,0,1,2,-1,-4],满足要求的三元组集合为:[[-1,0,1],[-1,-1,......
  • 力扣-买卖股票的最佳时机(含冷冻期)
    1.问题给定一个整数数组,其中第i个元素代表了第i天的股票价格。设计一个算法计算出最大利润。在满足以下约束条件下,你可以尽可能地完成更多的交易(多次买卖一支股票):你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。卖出股票后,你无法在第二天买入股票(即冷冻......
  • 力扣-赎金信
    1.问题给定一个赎金信(ransom)字符串和一个杂志(magazine)字符串,判断第一个字符串ransom能不能由第二个字符串magazines里面的字符构成。如果可以构成,返回true;否则返回false。(题目说明:为了不暴露赎金信字迹,要从杂志上搜索各个需要的字母,组成单词来表达意思。杂志字符......
  • 力扣---146. LRU 缓存
    请你设计并实现一个满足  LRU(最近最少使用)缓存 约束的数据结构。实现 LRUCache 类:LRUCache(intcapacity) 以 正整数 作为容量 capacity 初始化LRU缓存intget(intkey) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。voidput(intkey,......
  • 力扣-链表组件
    1.问题给定链表头结点head,该链表上的每个结点都有一个唯一的整型值。同时给定列表G,该列表是上述链表中整型值的一个子集。返回列表G中组件的个数,这里对组件的定义为:链表中一段极长连续结点的值(该值必须在列表G中)构成的集合。极长的含义是:这段连续结点的前面或后面结点不......
  • 力扣练习题
    1#include<bits/stdc++.h>2#defineMAXSIZE1003usingnamespacestd;4typedefstruct{5char*base;6char*top;7intstactsize;8}sqstack;9voidinitstack(sqstack&s){10s.base=newchar[MAXSIZE];11if(!s.ba......
  • 18. 四数之和
    给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a],nums[b],nums[c],nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):0<=a,b,c,d <na、b、c 和 d 互不相同nums[a]+nums[b]+num......
  • 力扣6.N 字形变换(压缩矩阵)
    将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z字形排列。比如输入字符串为 "PAYPALISHIRING" 行数为 3 时,排列如下:PAHNAPLSIIGYIR之后,你的输出需要从左往右逐行读取,产生出一个新的字符串,比如:"PAHNAPLSIIGYIR"。请......
  • 力扣20.有效的括号
    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。 示例1:输入:s="()"输出:true 示例 2:输入:s="()[]{}"......
  • 力扣14.最长公共前缀
    编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 ""。 示例1:输入:strs=["flower","flow","flight"]输出:"fl" 示例2:输入:strs=["dog","racecar","car"]输出:""解释:输入不存在公共前缀。 ......