当前位置: 首页 > news >正文

【C++算法】8.双指针_三数之和

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

15.三数之和


题目描述:

d0406aca4b46568daffef79f8820a511


解法

解法一:排序+暴力枚举+利用set去重O(n3)

例如nums=[-1,0,1,2,-1,-4]

[-1,0,1][0,1,-1][1,0,-1]下标不同但是都满足 ,这个题难在去重

可以通过排序去重,先把数组排序再找,就不会出现上面一行出现的问题了。

但是这里举例的nums里面由两个-1,可能会出现[-1,0,1]两次。这个就可以通过set容器去除。

解法二:排序+双指针

  1. 先排序
  2. 固定一个数a
  3. 在该数后面的区间内,利用双指针算法快速找到两个数的和等于-a

处理细节:

  1. 去重

    找到一种结果之后,leftright指针要跳过重复元素

    当使用完一次双指针算法之后,i也要跳过重复元素

  2. 不漏掉

    找到一种结果后,不要停,缩小区间,继续寻找


C++ 算法代码:

class Solution 
{public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;//用ret记录结果// 1. 排序sort(nums.begin(), nums.end());// 2. 利用双指针解决问题int n = nums.size();for(int i = 0; i < n; ) // 固定数 a{if(nums[i] > 0){break; // 小优化}int left = i + 1, right = n - 1, target = -nums[i];while(left < right){int sum = nums[left] + nums[right];if(sum > target){right--;}else if(sum < target){left++;}else{//说明找到最终结果ret.push_back({nums[i], nums[left], nums[right]});//把三个数放到ret里面,{}会形成一个vector int的数组放到ret里面left++, right--;// 去重操作 left 和 rightwhile(left < right && nums[left] == nums[left - 1]){left++;}while(left < right && nums[right] == nums[right + 1]){right--;}}}i++;// 去重 iwhile(i < n && nums[i] == nums[i - 1]){i++;}}return ret;}
};

图解

nums=[-4,-4,-1,0,0,0,1,1,4,4,5,6]

34fa0244f07ddec5c539713381884645

  1. n=12,进入for循环,i=0,left=1,right=11,target=4,left < right进入while循环,sum=2<target,left++

2dd3e3a086bdc0457eaf5d700fa423a2

  1. sum=-1+6=5>target,right--

54388bbf03c61d365d837a18085a565b

  1. sum=-1+5=4=targe,把[-4,-1,5]放到ret里面,left++, right--

66036a5d816892562c4e2f3c427bf739

  1. sum=0+4=4=targe,把[-4,0,4]放到ret里面,left++, right--,执行去重操作

a718cff48223687c084491f9cbab2d33

  1. sum=1+1=2<targe,left++,跳出while循环,i++,执行去重,然后开始第二轮双指针算法。

59c352e3a71298c184c55395d2ba535b

  1. 后面的步骤类似,就不多赘述了。

http://www.mrgr.cn/news/40074.html

相关文章:

  • Ubuntu VSCode Docker 权限
  • 深入浅出MySQL事务处理:从基础概念到ACID特性及并发控制
  • YOLO11震撼发布!
  • ubuntu server 常用配置
  • “顶级”面试官告诉你 这些Java 面试问题一定有
  • Windows环境Apache httpd 2.4 web服务器加载PHP8:Hello,world!
  • 【微服务】前端微服务qiankun 2.x主子应用通信代码片段
  • SystemC学习(一)——环境安装
  • 软件设计师——计算机网络
  • 两个示例分析系统优化的选择
  • 【微信小程序前端开发】入门Day01 —— 小程序页面组成、组件使用及协同开发发布指南
  • 解决$‘r‘ command not found或者文件夹显示’tvsf 33‘$‘r‘
  • USB 3.1 标准 A 型插头到 USB 3.1 Micro-B 型插头电缆组件的电线连接
  • 裸金属服务器与虚拟机、物理机区别
  • 2024年9月30日随笔
  • mobile_aloha训练过程中pycharm编辑器遇到的问题记录
  • 【编程小白必看】MySQL 聚合函数操作秘籍一文全掌握
  • 非常全面的中考总复习资料-快速提升中考成绩!
  • 【刷点笔试面试题试试水】#ifndef和#ifdef有什么区别?
  • 单臂路由详解