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

三数之和-力扣

这道题在使用哈希表来做时,做的很吃力,对重复的去除很费劲。

  • 首先是对i的去重,不能使用nums[i] == nums[i+] 这样的条件去判断,这会遗漏掉类似[-1, -1 , 2]这样的解
  • 其次是对j的去重, 对j的去重是为了防止类似[-4, 2, 2, 2], [0, 0, 0, 0]这类数组的重复的解的出现,如果使用nums[j] == nums[j +1] && nums[j+1] == nums[j+2], 此时for循环需要改为 j < nums.size() - 2,但这样就会漏掉数组的最后两个元素。
  • 哈希表set每个 i 需要重新创建,否则之前存在set中的值会影响判断,造成重复的解
  • 三数之和的求解,是对数组进行遍历,然后将问题分解为 n 个两数之和去求解。
    代码如下:
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> threeSum;int i,j,k;sort(nums.begin(), nums.end());for(i = 0; i < nums.size(); i++){if(nums[i] > 0){return threeSum;}if(i > 0 && nums[i] == nums[i - 1]){continue;}unordered_set<int> s;for(j = i + 1; j < nums.size(); j++){if(j > i + 2 && nums[j] == nums[j - 1] && nums[j - 1] == nums[j - 2]){continue;}k = 0 - nums[i] - nums[j];if(s.find(k) != s.end()){threeSum.push_back( {nums[i], nums[j], k} );s.erase(k);} else {s.insert(nums[j]);}}}return threeSum;}
};

第二种写法是只用双指针的写法,对排序后的升序数组,left指向i+1,right指向nums.size() - 1。

  • 当三个数相加小于0时,left++
  • 当三个数相加大于0时,right–
  • 当三个数相加等于0时,则对left和right进行去重,然后同时左右收缩
class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> threeSum;sort(nums.begin(), nums.end());for(int i = 0; i < nums.size(); i++){if(nums[i] > 0){return threeSum;}if(i > 0 && nums[i] == nums[i - 1]){continue;}int left = i + 1;int right = nums.size() - 1;while(left < right){if(nums[i] + nums[left] + nums[right] == 0){threeSum.push_back({nums[i], nums[left], nums[right]});while(right > left && nums[right] == nums[right - 1]){right--;}right--;while(right > left && nums[left] == nums[left + 1]){left++;}left++;}else if(nums[i] + nums[left] + nums[right] < 0){left++;}else {right--;}}}return threeSum;}
};
http://www.lryc.cn/news/358438.html

相关文章:

  • 2024 五月份国内外CTF 散装re 部分wp
  • [猫头虎分享21天微信小程序基础入门教程]第21天:小程序的社交分享与消息推送
  • aop整理
  • Sublime Text 基础教程(个人总结)
  • 线程安全 - 笔记
  • 分支机构多,如何确保文件跨域传输安全可控?
  • 长安链使用Golang编写智能合约教程(二)
  • jpom linux发布前端 ruoyi
  • K8S认证|CKA题库+答案| 15. 备份还原Etcd
  • 软件架构设计属性之一:功能性属性浅析
  • 学习Java的日子 Day48 函数,DOM
  • Scikit-Learn朴素贝叶斯
  • 网页设计步骤总结
  • 第十三期Big Demo Day亮点项目:CCarbon重塑碳交易生态,助力全球绿色发展
  • python基础知识总结(第一节)
  • DOS学习-目录与文件应用操作经典案例-comp
  • 原神抽卡点名程序教程(直接下载用)
  • gpt-4o继续迭代考场安排程序 一键生成考场清单
  • php 设置时区
  • ArcGIS不同图斑设置不同的透明度
  • 前端 CSS 经典:图片边框
  • 异常有什么,异常类有什么
  • 如何解压忘记了密码的加密zip压缩包?这两个方法收藏好!
  • java中,怎样用最简单方法实现写word文档
  • 大语言模型的工程技巧(三)——分布式计算
  • AI开发初体验:昇腾加持,OrangePi AIpro 开发板
  • 微服务架构下Docker容器技术与Kubernetes(K8S)
  • 风萧萧兮易水寒,壮士一去兮不复还 的 rm 命令
  • How Diffusion Models Work
  • antd table列选中效果实现