IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> LeetCode 18.四数之和 剪枝+排序+双指针 C/C++ -> 正文阅读

[数据结构与算法]LeetCode 18.四数之和 剪枝+排序+双指针 C/C++

题目链接
主要类比三数之和,在此基础之上进行操作。

主要思路:三数之和是在确定第一个数字之后,采用双指针确定剩余两个数字,同样的,四数之和我们在确定第一个和第二个数字的基础上,再采用双指针确定剩余两个数字,从而使时间复杂度降为 O ( n 3 ) O(n^3) O(n3)
剪枝:本题要剪枝一下,因为样例中四数之和会超出int范围,过不了。①确定第一个数字之后,如果 n u m s [ i ] + n u m s [ i + 1 ] + n u m s [ i + 2 ] + n u m s [ i + 3 ] > t a r g e t nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target,即 n u m s [ i ] nums[i] nums[i]和后面连续的三个数字之和已经大于target了,那么此数组中就不存在等于target的四元组,直接break。②确定第一个数字之后,如果 n u m s [ i ] + n u m s [ n ? 1 ] + n u m s [ n ? 2 ] + n u m s [ n ? 3 ] < t a r g e t nums[i]+nums[n-1]+nums[n-2]+nums[n-3]<target nums[i]+nums[n?1]+nums[n?2]+nums[n?3]<target,即针对 n u m s [ i ] nums[i] nums[i]和最后三个数字之和如果小于target,说明针对此nums[i]就没有符合条件的四元组等于target了,因为最大的都小于target了,那么就跳过continue,遍历下一个 n u m s [ i ] nums[i] nums[i]了。然后确定第二个数字之后,同样的方法剪枝。
其他细节详见代码。

class Solution {
public:
	vector<vector<int>> fourSum(vector<int>& nums, int target) {
		vector<vector<int>> ans;
		if(nums.size()<4)return ans;

		sort(nums.begin(),nums.end());
		int n = nums.size();
		for(int i = 0;i<n-3;i++) {//确定第一个元素
			if(i>0&&nums[i]==nums[i-1])continue;
			//确定第一个元素后剪枝
			if((long long)nums[i]+nums[i+1]+nums[i+2]+nums[i+3]>target) break;//即最小的数都大于target了,那就没必要继续了
			//最大的数比target小也没必要继续了,注意这里所说的大小是针对nums[i]已经确定的情况
			//所以是continue,不同于上面的break,因为随着第一个数字的增大,可能出现等于target的情况
			if((long long)nums[i]+nums[n-1]+nums[n-2]+nums[n-3]<target) continue;

			for(int j = i+1;j<n-2;j++) {//确定第二个元素
				if(j>i+1&&nums[j]==nums[j-1])continue;
				//确定第二个元素后剪枝
				if((long long)nums[i]+nums[j]+nums[j+1]+nums[j+2]>target)break;
				if((long long)nums[i]+nums[j]+nums[n-1]+nums[n-2]<target)continue;
				int left = j+1;
				int right = n-1;
				while(left<right){
					int quard = nums[i]+nums[j]+nums[left]+nums[right];
					if(quard==target){
						ans.push_back({nums[i],nums[j],nums[left],nums[right]});
						//去重
						while(left<right&&nums[left+1]==nums[left])left++;
						left++;//还需要加1的原因是刚才移到了最后一个重复的数字,下一个才是要遍历的
						while(left<right&&nums[right-1]==nums[right])right--;
						right--;

					}
					else if(quard<target) {
						left++;
					}
					else {
						right--;
					}
				}
			}
		}
		return ans;
	}
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-01-04 13:41:40  更:2022-01-04 13:42:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 17:32:03-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码