LeetCode18:四數之和
一、題目描述
給定一個包含 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]
]
class Solution {
public:
vector<vector<int>> fourSum(vector<int>& nums, int target) {
//此處碼字
}
};
二、解題思路
本題與三數之和的題目差不多,可以先給容器內數字排序,然後迴圈列舉出所有滿足條件的四元組,四元組的下標從小到大記為first,second,third,four。
為避免四元組重複,則有first<second<third<four;且若是nums[first/second/third]=nums[first/second/third-1],則直接跳過。
使用雙指標法,first與second的雙重迴圈內,有
newtarget=target-nums[first]-nums[second];
four=n-1(n為vector的元素個數);
通過判斷nums[third]+nums[four]與newtarget來決定third(左指標)與four(右指標)如何移動:
1.如果和等於 target,則將列舉到的四個數加到答案中,然後將左指標右移直到遇到不同的數
2.如果和小於target,則將左指標右移一位;
3.如果和大於target,則將右指標左移一位。
三、我的程式碼
我實在Visio studio上寫的,拷貝到力扣可以通過測試。
#include<iostream>
#include<vector>
#include <algorithm>
using namespace std;
vector<vector<int>> fourSum(vector<int>& nums, int target)
{
int n = nums.size();
sort(nums.begin(), nums.end());
vector<vector<int>>ans;
// 列舉 a
for(int first = 0; first < n; ++first) {
// 需要和上一次列舉的數不相同
if(first > 0 && nums[first] == nums[first - 1]) {
continue;
}
for(int second = first + 1; second < n;++second) {
// 需要和上一次列舉的數不相同
if(second > first + 1 && nums[second] == nums[second - 1]) {
continue;
}
int newtarget = target - nums[first] - nums[second];
int four = n - 1;
for (int third = second + 1; third < n; ++third) {
if (third >second + 1 && nums[third] == nums[third - 1]) {
continue;
}
while (third<four && nums[four] + nums[third]>newtarget) {
--four;
}
if (third == four) {
break;
}
if (nums[four] + nums[third] == newtarget) {
ans.push_back({nums[first],nums[second],nums[third] ,nums[four]});
}
}
}
}
return ans;
}
int main()
{
int target = 0;
vector<int>nums = { 1, 0, -1, 0, -2, 2 };
vector<vector<int>> result= fourSum(nums, target);
int n = result.size();
for (int i = 0; i < n; i++)
cout << result[i][0] << ' '
<< result[i][1] << ' '
<< result[i][2] << ' '
<< result[i][3] << ' '
<< endl;
return 0;
}
此例結果
相關文章
- 18_四數之和
- 程式碼隨想錄演算法訓練營第七天 | 四數之和、贖金信、三數之和、四數之和2演算法
- Day 7| 454.四數相加II 、383. 贖金信 、15. 三數之和 、18. 四數之和
- [LeetCode] 4Sum 四數之和LeetCode
- 挑戰演算法題:四數之和演算法
- day7雜湊表 454.四數相加II |383. 贖金信|15. 三數之和 |18. 四數之和
- Leetcode[陣列] 18. 四數之和LeetCode陣列
- 10.5 每日一題 18. 四數之和每日一題
- 兩數之和
- 程式碼隨想錄演算法訓練營day07|454.四數相加II,383.贖金信,15.三數之和,18.四數之和演算法
- 程式碼隨想錄刷題day 7 | 雜湊表part02 454.四數相加II 383. 贖金信 15. 三數之和 18. 四數之和
- 1. 兩數之和
- LeetCode:兩數之和LeetCode
- LeetCode - 兩數之和LeetCode
- 演算法-兩數之和演算法
- 兩數之和詳細解答
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- 演算法題:三數之和演算法
- LeetCode 1 兩數之和LeetCode
- leetcode #1 兩數之和LeetCode
- LeetCode之兩數之和LeetCode
- 雜湊查詢 兩數之和
- abc172D 約數之和
- AcWing871. 約數之和
- LeetCode-兩數之和LeetCode
- Hash表實踐 —— 兩數之和
- LeetCode: Two sum(兩數之和)LeetCode
- LeetCode 1. 兩數之和LeetCode
- LeetCode15. 三數之和LeetCode
- LeetCode15.三數之和LeetCode
- 兩數之和,返回陣列下標陣列
- LeetCode-1. 兩數之和LeetCode
- [LeetCode] Two Sum 兩數之和LeetCode
- 雙指標妙解三數之和指標
- LeetCode 15.三數之和LeetCode
- 演算法幾個數之和是某個數演算法
- 圖解兩數之和:雙指標法圖解指標
- 圖解兩數之和:雜湊表法圖解