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

reLeetCode 热题 100- 15. 三数之和 - MKT

1 排序

2 双指针 位置卡死逐步对着移动 左右2个指针

3 while 过滤掉重复的

image

 双指针

class Solution {
public:vector<vector<int>> my_test1(vector<int>& nums) {std::set<int> index_set;std::map<std::set<int>,vector<int>> result_map;vector<vector<int>> result_vector;//sort(nums.begin(),nums.end());//std::cout<< nums << std::endl;for(int i=0;i<nums.size()-2;i++){for(int j=i+1;j<nums.size()-1;j++){ for(int z=j+1;z<nums.size();z++){int all_=nums[i]+nums[j]+nums[z];if(all_==0){// index_set.insert(nums[i]);// index_set.insert(nums[j]);// index_set.insert(nums[z]);result_map.insert({{nums[i],nums[j],nums[z]},{nums[i],nums[j],nums[z]}});break;} }}}for (auto &it : result_map){result_vector.push_back(it.second);}return result_vector;}vector<vector<int>> my_test2(vector<int>& nums) {std::set<int> index_set;std::map<std::set<int>,vector<int>> result_map;vector<vector<int>> result_vector;unordered_multiset<int> sourc_udset(nums.begin(), nums.end());//sort(nums.begin(),nums.end());std::cout<< nums.size() << std::endl;for(int i=0;i<nums.size()-2;i++){for(int j=i+1;j<nums.size()-1;j++){ int target=0-nums[i]-nums[j];auto range = sourc_udset.equal_range(target);size_t count = std::distance(range.first, range.second);if(target==nums[i] && target==nums[j] ){    if (count >= 3) {result_map.insert({{nums[i],nums[j],target},{nums[i],nums[j],target}});//auto second = std::next(range.first);// 安全访问第二个} else {std::cout << "没有第二个匹配元素" << std::endl;}}else if(target==nums[i] || target==nums[j] ){if (count >= 2) {result_map.insert({{nums[i],nums[j],target},{nums[i],nums[j],target}});}}else{if (count >=1) {result_map.insert({{nums[i],nums[j],target},{nums[i],nums[j],target}});}}}}for (auto &it : result_map){result_vector.push_back(it.second);}return result_vector;}vector<vector<int>> my_test3(vector<int>& nums) {std::set<int> index_set;std::map<std::set<int>,vector<int>> result_map;vector<vector<int>> result_vector;unordered_multiset<int> sourc_udset(nums.begin(), nums.end());sort(nums.begin(),nums.end());// 先排序std::cout<< nums.size() << std::endl;bool stop=0;int lastZ=nums.size()-1;for(int i=0;i<nums.size()-2;i++){if(nums[i]>0) return result_vector; // 排序前提下 第一个数大于0,直接挂for(int j=i+1;j<nums.size()-1;j++){ if((nums[i]+nums[j])>0) {return result_vector;}// 排序前提下 第一个数+第二个数 大于0,直接挂for(int z=lastZ;z>j;z--){ int temp_=nums[i]+nums[j]+nums[z];if(temp_==0){result_map.insert({{nums[i],nums[j],nums[z]},{nums[i],nums[j],nums[z]}});stop=1;lastZ=z;break; }else if(temp_<0){// 排序前提下 这个j小不行j++ z已经最大lastZ=z;break; }else{// 大于0 排序前提下 必然在 j-z之间 z是最大的往下降 z--lastZ=z;}}if(stop){   stop=0;break;}}}for (auto &it : result_map){result_vector.push_back(it.second);}return result_vector;}vector<vector<int>> my_test4(vector<int>& nums) {// std::set<int> index_set;std::map<std::set<int>,vector<int>> result_map;vector<vector<int>> result_vector;// unordered_multiset<int> sourc_udset(nums.begin(), nums.end());sort(nums.begin(),nums.end());// 先排序std::cout<< nums.size() << std::endl;for(int i=0;i<nums.size()-2;i++){if(nums[i]>0) {break; // 排序前提下 第一个数大于0,直接挂}int qian=i+1;int hou=nums.size()-1;while(qian<hou){int temp2= nums[qian]+nums[i];if(temp2>0){break;}while(qian<hou){//cout<< i << " / " << nums[i] << " " << qian << " / " << nums[qian]  <<  "  " << hou<< "  / " << nums[hou] <<endl;int temp3= nums[qian]+nums[i]+nums[hou];if(temp3>0){hou--;while(nums[hou]==nums[hou+1] && hou>qian){hou--;}}else if(temp3==0){//  cout<< " 成功 "<< i << " / " << nums[i] << " " << qian << " / " << nums[qian]  <<  "  " << hou<< "  / " << nums[hou] <<endl;//result_map.insert({{nums[i],nums[qian],nums[hou]},{nums[i],nums[qian],nums[hou]}});result_vector.push_back({nums[i],nums[qian],nums[hou]});qian++;while(nums[qian]==nums[qian-1] && qian<hou){qian++;}while(nums[i]==nums[i+1] && i<nums.size()-2 ){i++;}break;}else{qian++;while(nums[qian]==nums[qian-1]&& qian<hou){qian++;}}//if(nums[hou]==nums[hou-1] && qian<(hou-1))hou--; }}}for (auto &it : result_map){//cout<< " 加入"<<endl;result_vector.push_back(it.second);}return result_vector;}vector<vector<int>> threeSum(vector<int>& nums) {// return my_test1(nums);return my_test4(nums);}
};

  

 

参考答案

官方

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> ans;// 枚举 afor (int first = 0; first < n; ++first) {// 需要和上一次枚举的数不相同if (first > 0 && nums[first] == nums[first - 1]) {continue;}// c 对应的指针初始指向数组的最右端int third = n - 1;int target = -nums[first];// 枚举 bfor (int second = first + 1; second < n; ++second) {// 需要和上一次枚举的数不相同if (second > first + 1 && nums[second] == nums[second - 1]) {continue;}// 需要保证 b 的指针在 c 的指针的左侧while (second < third && nums[second] + nums[third] > target) {--third;}// 如果指针重合,随着 b 后续的增加// 就不会有满足 a+b+c=0 并且 b<c 的 c 了,可以退出循环if (second == third) {break;}if (nums[second] + nums[third] == target) {ans.push_back({nums[first], nums[second], nums[third]});}}}return ans;}
};作者:力扣官方题解
链接:https://leetcode.cn/problems/3sum/solutions/284681/san-shu-zhi-he-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  网友

class Solution {public List<List<Integer>> threeSum(int[] nums) {Arrays.sort(nums); // 先排序List<List<Integer>> res = new ArrayList<>();for (int i = 0; i < nums.length; i++) {// 跳过重复元素if (i > 0 && nums[i] == nums[i - 1]) continue;// 双指针,目标是找到 nums[l] + nums[r] = -nums[i]int l = i + 1, r = nums.length - 1;int target = -nums[i];while (l < r) {int sum = nums[l] + nums[r];if (sum == target) {res.add(Arrays.asList(nums[i], nums[l], nums[r]));l++;r--;// 跳过重复元素while (l < r && nums[l] == nums[l - 1]) l++;while (l < r && nums[r] == nums[r + 1]) r--;} else if (sum < target) {l++;} else {r--;}}}return res;}
}

  

 

http://www.sczhlp.com/news/117674/

相关文章:

  • 网站广告布局北京做网站推广的公司
  • js 网站校验网站后台建设协议书
  • 佛山网站建设网站制作公司哪家好云南汽车网络营销
  • 寮步镇网站建设公司十大少儿编程教育品牌
  • 电脑技术学习网站wordpress插件支付宝积分
  • 网站建设公司江苏一键开发小程序
  • 程序开发需要学什么湘潭网站建设优化技术
  • 网站外链怎么看wordpress添加关键字
  • 宁波网站制作维护培训机构哪家好
  • XXL-TOOL v2.1.0 发布 | Java工具类库
  • 女人和男人做床上爱网站做企划的网站
  • dede 管理多个网站刷题网站开发
  • 网站401错误北京网站设计公司济南兴田德润团队怎么样
  • 农资销售网站建设方案遂宁网站建设
  • 专门做网站推广的平台广东制冷设备网站建设费用
  • 泰安网站建设dxkjw即墨网站制作
  • 如何建立一个好的网站网站二级页怎么做
  • 广州网站优化平台网站制作公司下
  • 黄岛做网站找哪家好中国一级建造师
  • 潍坊智能建站模板前端培训费用大概多少郑州
  • 免费建站网站网页短链接生成方案
  • 做电容的网站建设网站写需求分析
  • 做网站的科技公司土巴兔装修口碑怎样
  • 建数据库的网站多少钱优酷 嵌入 wordpress
  • 游戏开发选什么专业做网站优化的话术
  • 长沙哪家公司做网站好彩票网站建设柏
  • 阎良做网站网站开发工具 知乎
  • 学校网站建设及使用广州网站定做
  • 域名空间网站怎么做网站建设 服务质量保证
  • 商务网站建设管理思路汽车seo是什么意思