LeetCode 18. 四数之和 思考分析(双指针解)

目录

  • 需要注意的几点
    • 1、去除剪枝操作
    • 2、去重操作的细节
  • code以及效果:

题目
给定一个包含 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]
]

需要注意的几点

1、去除剪枝操作

之前三个元素相加我们有个剪枝操作:if(nums[j] > 0) return result;
此时我们仍然这样想:如果第一个数>target,因为是递增的,所以之后的序列相加必定大于target(其实这个是错的,如果是负数只会越来越小)
例如:
[1,-2,-5,-4,-3,3,3,5]
-11
之前之所以可以剪枝是限制了target=0,这样就能保证相加最起码递增的。

2、去重操作的细节

if(j>0 && nums[j]==nums[j-1]) continue;if(i>j+1 && nums[i]==nums[i-1]) continue;

如果是[0,0,0,0],target=0;(一开始这边报错,然后修改了去重操作的条件)
探讨一下去重过程:
j = 0;i = 1;left=2;right=3;此时不满足去重,然后在for循环中完成结果。
j = 0;i = 2;去重。

code以及效果:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> result;//对nums排序sort(nums.begin(), nums.end());int n = nums.size();for(int j=0;j<n;j++){if(j>0 && nums[j]==nums[j-1]) continue;//如果第一个数>target,因为是递增的,所以之后的序列相加必定大于target(其实这个是错的,如果是负数只会越来越小)//if(nums[j] > target) return result;for(int i=j+1;i<n;i++){//使用双指针法,不过得先确定一个数(因为是3个数),这里我们确定第一个数//接下来是去除重复元素//如果是[0,0,0,0],target=0时,去重可能会把答案去除掉if(i>j+1 && nums[i]==nums[i-1]) continue;//接下来就是双指针操作int left = i+1;int right = n-1;while(left < right){int sum =nums[j] + nums[i] + nums[left] + nums[right];if(sum > target){//说明right太大right--;}else if(sum < target){//说明left太小left++;}else{result.emplace_back(vector<int>{nums[j],nums[i],nums[left],nums[right]});//找到元素之后,left++,right--(为什么right--?因为nums[i],nums[left],nums[right]==0,//此时left++,且由于递增,nums[left++]>nums[left],为了能够再次找到sum==0的数对,nums[new_right]必须//left去重往右靠while(left < right && nums[left]==nums[left+1]) left++;//right去重往左靠while(left < right && nums[right]==nums[right-1]) right--;//小于nums[old_right])left++;right--;}}}}return result;}
};

在这里插入图片描述
还可以通过其他技巧进行求解,此处不做过度探讨。等以后整理到相关题型的时候再做修改以及更新。
回溯法求解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

图解DotNet框架之一:编译与执行引擎(上)

众所周知,DotNet框架是非常庞大的,光项目创建时的种类就有WPF,WCF,WF这三种最新的技术,还有以前的Web,WinForm,Service,Mobile等等. 这么复杂和庞大的框架,用文字来描述是远远不够的,所以我准备写一系列图文并茂的文章,把我所知道的所有Net框架中的东西全部串联起来,希望可以给…

【Kissy WaterFall】实行手动加载数据

前言&#xff1a;由于Kissy WaterFall默认是监听滚动事件来实现数据动态加载的&#xff0c;但是有一些情况要用到手动加载数据。以下是使用Kissy WaterFall实现手动加载数据的方法。 最终实现效果&#xff1a;点击”逛更多的商店“会动态加载数据 步骤&#xff1a; 当一页数据加…

web服务器文档根目录在哪里,web服务器根目录在哪

web服务器根目录在哪 内容精选换一换SSL证书通过在客户端浏览器和Web服务器之间建立一条SSL安全通道(访问方式为HTTPS)&#xff0c;实现数据信息在客户端和服务器之间的加密传输&#xff0c;可以防止数据信息的泄露。SSL保证了双方传递信息的安全性&#xff0c;而且用户可以通过…

console java_Java Console writer()方法与示例

console java控制台类writer()方法 (Console Class writer() method) writer() method is available in java.io package. writer()方法在java.io包中可用。 writer() method is used to get a distinct PrintWriter object linked with this Console. writer()方法用于获取与此…

二、图片加载与保存

一、基本概念 1&#xff0c;什么是图片&#xff1f; 答&#xff1a;图像是结构化存储的数据信息 2&#xff0c;图像的属性 答&#xff1a;1、通道数目&#xff0c;2、宽与高&#xff0c;3、像素数据&#xff0c;4、图像类型 二、加载显示图像并保存 import cv2 import nump…

LeetCode 206. 反转链表 思考分析

题目 反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 你可以迭代或递归地反转链表。你能否用两种方法解决这道题&#xff1f; 迭代双指针 从某公众号&#xff08;代码随想录&#xff09;搬过来的gif图&…

hdu 2846 Repository 字典树的变形

Repository Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)                  Total Submission(s): 1129 Accepted Submission(s): 382 Problem DescriptionWhen you go shopping, you can search in repository…

怎样看虚拟主机的服务器,虚拟主机怎么查看服务器类型

虚拟主机怎么查看服务器类型 内容精选换一换使用华为云提供的公共镜像制作私有镜像时&#xff0c;您需先购买云主机等云资源时镜像选择公共镜像、云服务器类型建议统一选择“s3 (通用计算型)”&#xff0c;在云主机安装部署完商品&#xff0c;然后参照以下方式进行私有镜像制作…

Win32动态库 Lib文件哪去了

最近使用SQLite&#xff0c;用源文件.c和.h编译SQLite的动态库&#xff0c;编译后发现没有Lib文件。 原来&#xff1a;SQLite的.c文件没有引用.h文件&#xff0c;添加引用&#xff0c;编译&#xff0c;Lib文件有了。转载于:https://www.cnblogs.com/yunuoyuhan/p/3204457.html

console java_Java Console format()方法与示例

console java控制台类format()方法 (Console Class format() method) format() method is available in java.io package. format()方法在java.io包中可用。 format() method is used to write the formatted string to this Console with the help of the given string format…

Anaconda自带Python编译器Jupyter Notebook显示代码行数

ESC&#xff1a;进入命令行模式&#xff1b;按下H即可显示各种快捷键信息 Enter&#xff1a;进入编辑模式 方法一&#xff1a;命令方法 一、点击代码段&#xff0c;按ESC&#xff0c;使代码段显示蓝色&#xff0c;进入命令行模式 二、按下ShiftL&#xff0c;显示代码行数 方法…

ajax 服务器响应,ajax-服务器响应

如果需要获得了来自服务器的响应&#xff0c;则使用XMLHttpRequest 对象的 responseText 或 responseXML 属性responseText&#xff1a;获得字符串形式的响应数据&#xff0c;当readyState属性值变为4时&#xff0c;responseText属性才可用&#xff0c;表明Ajax请求已经结束例&…

(转)MOMO的Unity3D研究院之深入理解Unity脚本的执行顺序(六十二)

http://www.xuanyusong.com/archives/2378 Unity是不支持多线程的&#xff0c;也就是说我们必须要在主线程中操作它&#xff0c;可是Unity可以同时创建很多脚本&#xff0c;并且可以分别绑定在不同的游戏对象身上&#xff0c;他们各自都在执行自己的生命周期感觉像是多线程&…

SQL/MongoDB 连接并发测试

最近一直在搞mongodb 文件服务器大量文件并发上传测试&#xff0c;在官方文档发现mongo是线程安全的&#xff0c;支持单一连接下的并发操作。印象ADO.NET 似乎不支持单一连接并发。于是&#xff0c;测试一下来证实这个疑虑。&#xff08;前两篇小记一直纠结mongodb吃内存导致并…

【C、C++基础】什么时候用 “.” 什么时候用“->”(3个实例搞懂)

从堆栈的角度来说&#xff1a; 从堆栈的角度来说&#xff1a; 对象放在堆上&#xff0c;就要用指针&#xff0c;也就是对象指针->函数&#xff1b; 放在栈上,就对象.函数 那么如何判断对象放在堆上还是栈上&#xff1f; 从我的另一篇笔记【C grammar】C简化内存模型可知&am…

java clone方法_Java Calendar clone()方法与示例

java clone方法日历类clone()方法 (Calendar Class clone() method) clone() method is available in java.util package. clone()方法在java.util包中可用。 clone() method is used to return the cloned object of this Calendar object. clone()方法用于返回此Calendar对象…

三、Numpy数组操作

一、对图片各个像素点的像素值进行操作 image.shape[0]&#xff1a;image图像的height image.shape[1]&#xff1a;image图像的width image.shape[2]&#xff1a;image图像的channels import cv2 import numpy as npdef access_pixels(image):print(image.shape)height imag…

picacg服务器维护,picacg的服务器地址是什么

弹性云服务器 ECS弹性云服务器(Elastic Cloud Server)是一种可随时自助获取、可弹性伸缩的云服务器&#xff0c;帮助用户打造可靠、安全、灵活、高效的应用环境&#xff0c;确保服务持久稳定运行&#xff0c;提升运维效率三年低至5折&#xff0c;多种配置可选了解详情用户数据注…

Redis-Sampler:深入了解你的Redis存储

redis-sampler 是Redis作者antirez 同学开发的一个ruby 小工具&#xff0c;用于对Redis存储概况进行抽样检测并给出分析结果。 项目地址&#xff1a;https://github.com/antirez/redis-sampler 使用方式&#xff1a; 下载源码&#xff0c;执行下面命令&#xff1a; ./redis-sam…

二叉树笔记(深度遍历与广度遍历+13道leetcode题目(深度3道、广度10道))

本文章为结合leetcode题目以及公众号“代码随想录”的文章所做的笔记&#xff01; 感觉代码随想录的题目整理真的很好&#xff0c;比自己盲目刷题好很多。 目录1、二叉树小记1、满二叉树与完全二叉树2、二叉搜索树3、平衡二叉搜索树AVL4、二叉树存储方式5、二叉树遍历方式6、二…