LeetCode-15-3Sum(证明/KSum)-Medium
2015-12-26 12:20
357 查看
题目理解:
求解vector中三个数(a,b,c)之和为0,其中,a、b、c不能为重复值,并且按照a<b<c的规则进行排列;
解题分析:
1. 典型的KSum题目;
1)先排序;
2)首尾两端两个指针同时向对端移动;
3)过程中避免重复的结果;
题目的关键是证明两个指针向对端移动的过程中,不会漏掉有效的取值(可以使用反正法进行证明);
解题代码:
求解vector中三个数(a,b,c)之和为0,其中,a、b、c不能为重复值,并且按照a<b<c的规则进行排列;
解题分析:
1. 典型的KSum题目;
1)先排序;
2)首尾两端两个指针同时向对端移动;
3)过程中避免重复的结果;
题目的关键是证明两个指针向对端移动的过程中,不会漏掉有效的取值(可以使用反正法进行证明);
解题代码:
class Solution { public: vector<vector<int>> threeSum(vector<int>& nums) { vector<vector<int>> ans; int size=nums.size(); if(size<3){ return ans; } sort(nums.begin(),nums.end()); int pre=1;//the first element can not greater than 0 for(int i=0;i<size-2;i++){ if(nums[i]==pre){ continue; }else{ pre=nums[i]; } int left=i+1; int right=size-1; int preLeft, preRight; bool isInitLR=false; while(left<right){ int sum=nums[i]+nums[left]+nums[right]; if(sum>0){ right--; }else if(sum<0){ left++; }else{ if(!isInitLR){ isInitLR=true; }else{ if(nums[left]==preLeft){ left++; continue; } if(nums[right]==preRight){ right--; continue; } } vector<int> t; t.push_back(nums[i]); t.push_back(nums[left]); t.push_back(nums[right]); ans.push_back(t); preLeft=nums[left]; preRight=nums[right]; left++; right--; //cout<<"ans.push_back()"<<endl; } //cout<<"left= "<<left<<endl; //cout<<"right= "<<right<<endl; } } return ans; } };
相关文章推荐
- python编程
- Android 自己来尝试性解读《Android照片墙完整版,完美结合LruCache和DiskLruCache》
- C++ STL算法
- 【java微信开发】环境搭建
- 基于 ThinkPHP 3.2.3 的页面静态化功能的实现
- Java 中日期的几种常见操作 —— 取值、转换、加减、比较
- JAVA设计模式之单例模式
- java list与Json转换
- Awesome Hadoop
- Awesome PHP
- Canvas基础知识总结之一
- webstorm sublime工具代码简写笔记
- Awesome Python
- ViewPager只初始化当前页,不会提前初始化下一页的设置
- BAT巨头的开源项目
- 通过Java反射来理解泛型的本质
- C#读取xml文件
- TrafficStats 网络实时测速
- java字符串操作简单总结
- 创建sqlite数据库