1.1我的解法以及考虑到的几点问题
1)数组长度小于3的不用考虑,直接返回
2)暴力法:每一次查找不是自己选择的数字,看一下能否凑成零(但是这样不知道如何去重)
3)拆成一个数字+LC 1.两数之和的问题

1.2我没有考虑到的问题
1)是否要排列
2)排列后的数字只要大于0,就直接返回
3)双指针扫到相同的数字如何直接跳过
4)被挑选做第一个数字如何去重

2.1学到的方法
1)数组长度小于3的直接返回
2)排序
3)数字大于0之后直接返回
4)三个数字之和(伪代码)

  • if sum ==0,append to result(这之后需要进行什么操作?为什么?)
  • sum < 0,左指针右移,同时要检测sum的变化
  • sum > 0,右指针左移,同时要检测sum的变化
  • 以上的操作的前提都是左指针在右指针的左边

最终的代码

class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;if(nums.size() < 3)return result;sort(nums.begin(),nums.end());//get到了sort(begin,end,cmp)的用法for(int i = 0;i <= nums.size() - 3;i++){if(nums[i] > 0)return result;if(i > 0 && nums[i] == nums[i-1])continue;//找到重复的数字当中的第一个//这个只适用于主指针,对于左右指针其实不合适int l = i + 1;int r = nums.size() - 1;while(l < r){int sum = nums[i] + nums[l] + nums[r];if(sum < 0){while(l < r && nums[l] == nums[++l]);}//每次移动都改变了sum 的值,也移动了指针,也能够使得指针跳过相同的值//这和之前向数组加值的同时也改变了数组的大小,导致无限循环的道理是一致的else if(sum > 0){while(l < r && nums[r] == nums[--r]);}else{result.push_back({nums[i],nums[l],nums[r]});//学到了二维数组添加数组的新方法,可以添加整个列表//同样,移动左右指针的操作并不只是在找到一组数字之前,之后也要,因为同一个开头的数字可能会有多种组合while(l < r && nums[l] == nums[++l]);while(l < r && nums[r] == nums[--r]);}}}/*while(l < r){while(l < r && nums[i] + nums[r] + nums[l] == 0)result.push_back({nums[i],nums[r],nums[l]});l++;r--;while(l < r &&nums[i] + nums[r] + nums[l] > 0)r--;while(l < r && nums[i] + nums[r] + nums[l] < 0)l++;}while(i > 0 && nums[i] == nums[i-1])i++;*/return result;}
};

时间复杂度最低的代码:
疑惑:为什么使用迭代器导致时间复杂度减小那么多?

class Solution {public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> result;if(nums.size() < 3){return result;}sort(nums.begin(), nums.end());auto last = nums.end();for(auto i = nums.begin(); i < last-2; i++){if(i>nums.begin() && *i==*(i-1)){continue;}auto j = i+1;auto k = last-1;while(j < k){if(*i + *j + *k < 0){j++;}else if(*i + *j + *k > 0){k--;}else{result.push_back({*i, *j, *k});j++;k--;while(*j==*(j-1) && j<k) j++;                   while(*k==*(k+1) && j<k) k--;}}}return result;}
};

2021-5-11 Leetcode 15.三数之和相关推荐

  1. [双指针|模拟] leetcode 15 三数之和

    [双指针|模拟] leetcode 15 三数之和 1.题目 题目链接 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ? ...

  2. LeetCode 15. 三数之和(3Sum)

    15. 三数之和 15. 3Sum 题目描述 Given an array nums of n integers, are there elements a, b, c in nums such th ...

  3. Java实现 LeetCode 15 三数之和

    15. 三数之和 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 注意:答案中不可以 ...

  4. LeetCode 15. 三数之和【双指针】

    15. 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j.i != k 且 j != k ,同时还满足 nums[ ...

  5. LeetCode 15. 三数之和

    题目描述 15. 三数之和 思路 思路1 比较容易想到的就是,求三数之和等于0,可以等价于求两个数的和,然后看这个和的相反数是否在nums里面. 但是 T_T这样的话复杂度太高了,会超时,捂脸,最后三 ...

  6. LeetCode 15三数之和16最接近的三数之和

    三数之和(双指针) 题意: 给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组. 注意 ...

  7. Leetcode 15.三数之和

    Time: 20190920 Type: Medium 题目描述 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所 ...

  8. Leetcode 15:三数之和(最详细解决方案!!!)

    给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 *a,b,c ,*使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. **注意:**答案中不可以包含重 ...

  9. Leetcode 15.三数之和 双指针 or 暴力哈希

    题目链接:传送门 题目:给你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有和为 0 且不重复的三元组. 暴力+ ...

最新文章

  1. javascript弹出div(一)
  2. kotlin 小数位数_Kotlin程序生成4位数OTP
  3. 用ibatis.net简单的数据更新
  4. 计算机桌面保护怎么办,电脑屏幕保护怎么设置
  5. mysql选错索引怎么解决_MySQL选错索引的原因以及解决方案
  6. WebStrom的学习使用 H5开发
  7. 【Vue2.0】—props 配置(十三)
  8. (转)[Cocoa]深入浅出 Cocoa 之 Framework
  9. c语言中队列的作用,循环队列的实现(C语言)
  10. python 数字类型判断_Python中 各种数字类型的判别(numerica, digital, decimal)
  11. Unity3D脚本概述
  12. swat weather 输入数据注意事项
  13. 欢迎甲方跳槽到云厂商
  14. TensorRT——安装报错解决:sudo pip3 install tensorrt-8.4.0.6-cp38-none-linux_x86_64.whl
  15. selenium自动化从0开始学习
  16. 广告投放中的ROI是怎么计算的?
  17. m3u8下载时出现跨域的解决方法
  18. 单道批处理系统与多道批处理系统(操作系统)
  19. ubuntu 16.04 桌面修复
  20. 童年记忆中的湾里老爷爷

热门文章

  1. SketchUp Vray 批量渲染图片
  2. 递归解析树形结构数据,
  3. python二进制程序_python中的二进制加法程序
  4. 老人地摊淘到旧书 发现刊有老伴年轻照片(图)
  5. 硬盘数据恢复技术简介
  6. 开源播放器ijkplayer的使用
  7. 探探引流一天加粉1000+微商引流方法讨论
  8. hp2548无线服务器地址,一搜一连一打 无线直连打印一分钟搞定
  9. 计算机毕业设计之java+springboot基于vue的社区医院管理服务系统
  10. CSP-J第二轮真题 分类题单