双指针算法(二)

三数之和

三数之和

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != ji != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

注意:答案中不可以包含重复的三元组。

思路:先排序,保证数组不降序排列(为了后续去重操作)。从左往右一次固定一个数 tmp ,在右边使用双指针算法,找到两个数的和等于 - tmp 的情况(等价于三个数的和等于0),找到之后不停止,继续遍历,直至找到固定数为 tmp 的情况下的所有情况,右移 tmp 位置,直至 tmp 到达区间的最倒数第三个位置。

‘不同的三元组’,去重操作:在找到一组目标值后,因为已经排好序了,所以只需要让双指针向中间移动,如果移动后值等于之前值的话,就再次移动,直到找到一个不重复的位置!

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());vector<vector<int>> vv;int tmp = 0;int tmpi = nums.size()-3;while(tmp <= tmpi){if(nums[tmp]>0) break;int left = tmp + 1;int right = nums.size() - 1;while(left < right){if(nums[left] + nums[right] > -nums[tmp]) right --;else if(nums[left] + nums[right] < -nums[tmp]) left ++;else{vv.push_back({nums[left],nums[right],nums[tmp]});right--;left++;while(nums[right+1] == nums[right] && right > left) right--;while(nums[left-1] == nums[left] && left < right) left++;}}tmp++;while(nums[tmp-1]==nums[tmp] && tmp <= tmpi) tmp++;}return vv;}
};

四数之和

四数之和

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

思路:四数之和可以看做是先固定一个数,区间右边就当做三数之和来处理。先固定一个数 a,右边当做三数之和,再在三数之和中固定一个数 b,在区间右边利用双指针来处理即可。

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv;if(nums.size()<4) return vv;sort(nums.begin(),nums.end());size_t n = nums.size();for(size_t i = 0;i <= n - 4;){// 固定最左边的数 nums[i],三数之和的目标变为  target - nums[i]long long target1 = target - nums[i];for(int j = i + 1;j <= n-3;){//固定num[i]右边的数 nums[j],双指针的目标变为 target - nums[i] - nums[j]long long target2 = target1 - nums[j];size_t left = j+1, right = n -1;while(left < right){if(nums[left] + nums[right] > target2) right--;else if(nums[left] + nums[right] < target2) left++;else{vv.push_back({nums[i],nums[j],nums[left],nums[right]});left++;right--;while(nums[left] == nums[left-1] && left<right) left++;while(nums[right] == nums[right+1] && left<right) right--;}}j++;while(nums[j] == nums[j-1] && j <= n-3) j++;}i++;while(nums[i] == nums[i-1] && i<= n-4) i++;}return vv;}
};

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

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

相关文章

Go环境安装

目录 下载地址 安装 macos环境 window及其他环境 GOPROXY 非常重要 Go开发编辑器 下载地址 Go官网下载地址&#xff1a;https://golang.org/dl/ Go官方镜像站&#xff08;推荐&#xff09;&#xff1a;https://golang.google.cn/dl/ 选择要下载的系统版本&#xff1a; 安装 注意…

DataGrip 2023.3 新功能速递!

1 数据可视化 自 DataGrip 2023.3 发布以来&#xff0c;已整合 Lets-Plot 库&#xff0c;实现数据可视化。该可视化功能可用于所有三种类型的网格&#xff1a; 主选项卡&#xff1a;在打开表、视图或 CSV 文件时&#xff0c;在分割模式下显示图表。结果选项卡&#xff1a;在 服…

计算机组成原理(输入输出系统-----程序查询方式)

目录 程序查询方式 一.程序查询方式的流程 1.查询流程 2.程序流程 二.程序查询方式的接口电路 程序查询方式 一.程序查询方式的流程 1.查询流程 单个设备&#xff1a; 如果在传输过程当中只有一个内存和I/O之间数据传输&#xff0c;在执行程序的过程当中CPU会执行出来一…

setXxx getXxx 封装

1.封装介绍 封装(encapsulation)就是把抽象出的数据[属性]和对数据的操作[方法]封装在一起,数据被保护在内部,程序的其它部分只有通过被授权的操作[方法],才能对数据进行操作。 2.封装的理解和好处 (1)隐藏实现细节 方法(连接数据库)<-----调用(传入参数...) 只负责调…

代码随想录27期|Python|Day17|二叉树|110.平衡二叉树 |257. 二叉树的所有路径 |404.左叶子之和

110. 平衡二叉树 - 力扣&#xff08;LeetCode&#xff09; 在递归后序遍历的基础上加上一个中间节点判断左右子节点的高度的步骤即可。 具体实现 是如果左右子树已经高度差大于1&#xff0c;则中间节点标记为-1&#xff0c;在逐层向上返回之后可以在root节点被判定为false&am…

力扣---最长回文子串(动态规划)

目录 ​编辑 题目 思路步骤&#xff1a; 代码 我的其他博客 题目 给你一个字符串 s&#xff0c;找到 s 中最长的回文子串。 如果字符串的反序与原始字符串相同&#xff0c;则该字符串称为回文字符串。 示例 1&#xff1a; 输入&#xff1a;s "babad" 输出&…

详解git pull和git fetch的区别

git pull和git fetch的区别, 网上人云亦云胡说八道的实在是太多了&#xff0c;误导我很久。 今天看到一个说得好的&#xff0c;记录一下。 前言 在我们使用git的时候用的更新代码是git fetch&#xff0c;git pull这两条指令。但是有没有小伙伴去思考过这两者的区别呢&#xff…

统计3个点在3维空间的分布

在4*4*4的立方体中&#xff0c;随机取3个点&#xff0c;有64*63*62/641664个结构&#xff0c; 21440 % 20224 % 1 1728 0.0415 17 1728 0.041475 2 1728 0.0415 18 1728 0.041475 3 576 0.0138 19 384 0.009217 4 576 0.0138 20 3456 0.082949 5 …

简述SD-WAN组网的五大技术优势

在信息时代&#xff0c;企业对网络的需求不再局限于简单的连接&#xff0c;而是追求更加高效、灵活和可靠的网络架构。SD-WAN&#xff08;软件定义广域网&#xff09;作为一项先进的组网技术&#xff0c;以其独特的优势成为企业网络升级的热门选择。本文将深入探讨SD-WAN的技术…

Ubuntu 虚拟机环境,编译AOSP源码

环境 : VMware虚拟机 Ubuntu 20.04.3 LTS 搭建配置开发环境 sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl…

2023年全球运维大会(GOPS深圳站)-核心PPT资料下载

一、峰会简介 1、大会背景与概述 全球运维大会&#xff08;GOPS&#xff09;是运维领域最具影响力的国际盛会&#xff0c;每年都会汇聚世界各地的运维专家、企业领袖、技术爱好者&#xff0c;共同探讨运维技术的最新发展、最佳实践以及面临的挑战。2023年GOPS深圳站作为该系列…

JDK21+HADOOP3.2.2+Windows安装步骤

哈哈哈 最近转战大数据这块了&#xff0c;分享一下hadoop3.2.2的安装步骤 借鉴了不少大佬的文章&#xff0c;如有雷同&#xff0c;都是大佬们的 1.JDK安装 我选择的是JDK21 以下是下载网址和截图&#xff0c;这个没有太多的&#xff0c;一般下载最新的就可以 JDK: Java Down…