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;
}
此例結果
相關文章
- [LeetCode] 4Sum 四數之和LeetCode
- 挑戰演算法題:四數之和演算法
- Leetcode[陣列] 18. 四數之和LeetCode陣列
- 10.5 每日一題 18. 四數之和每日一題
- LeetCode:兩數之和LeetCode
- LeetCode - 兩數之和LeetCode
- 演算法-兩數之和演算法
- 兩數之和詳細解答
- 【10月打卡~Leetcode每日一題】18. 四數之和(難度:中等)LeetCode每日一題
- 演算法題:三數之和演算法
- LeetCode 1 兩數之和LeetCode
- leetcode #1 兩數之和LeetCode
- LeetCode之兩數之和LeetCode
- 雜湊查詢 兩數之和
- abc172D 約數之和
- LeetCode: Two sum(兩數之和)LeetCode
- LeetCode 1. 兩數之和LeetCode
- LeetCode15. 三數之和LeetCode
- LeetCode15.三數之和LeetCode
- 兩數之和,返回陣列下標陣列
- LeetCode-1. 兩數之和LeetCode
- [LeetCode] Two Sum 兩數之和LeetCode
- 雙指標妙解三數之和指標
- LeetCode 15.三數之和LeetCode
- 演算法幾個數之和是某個數演算法
- 圖解兩數之和:雙指標法圖解指標
- 圖解兩數之和:雜湊表法圖解
- leetcode-0001 兩數之和LeetCode
- 15. 三數之和_(c語言版)C語言
- LeetCode - 15. 三數之和 2LeetCode
- 兩數之和(leecode)的演算法演算法
- (js)leetcode 15. 三數之和JSLeetCode
- 組隊刷LeetCode - 兩數之和LeetCode
- 演算法之陣列——三數之和演算法陣列
- LeetCode 1 兩數之和(簡單)LeetCode
- [LeetCode] 3Sum 三數之和LeetCode
- 每日一道演算法, 《兩數之和》演算法
- 幾數之和分析,解法,優化和總結優化